分库分表

简介: 分库分表

一般来说,高并发,海量数据存储的解决方法有:缓存加速,读写分离,垂直拆分,分库分表,冷热数据分离,ES 辅助搜索,NoSQL 等方式,分库分表是海量数据存储与高并发系统的一个解决方案。

数据量大就分表,并发高就分库。


为什么要分库分表?


如果是创业公司。比如注册用户20w, 每天日活1w, 每天单表1000, 高峰期每秒并发 10 ,这个时候,一般不需要考虑分库分表,如果注册用户2000w, 日活100w, 单表10w条,高峰期每秒并发1000,此时就要考虑分库分表。当然多加几台机器,使用负载均衡可以扛住,但是每天单表数据增加,磁盘资源会被消耗掉,高峰期如果要5000 怎么办,系统肯定撑不住。也就是说,数据增加,请求量增大,并发增大,单个数据库肯定不行。


分表


如果单表数据达到 几千万了,数据量比较大,会极大影响 SQL 查询性能, 后面的SQL 执行会很慢,经验来说,单表数据几百万,就要考虑分表了。

所谓的分表,就是将一个表的数据存放到多个表中, 查询的时候就查一个表。比如按照用户 id 来分表,将一个用户的数据存放在一个表中,然后对这个用户操作时操作那个表就好。一般来说,每个表的数据固定在 200w 以内比较好。


分表方式


垂直拆分

所谓的垂直拆分,就是将一个表中的列拆分到多个表中,也就是说将一个大表拆分成多个小表。

  • 常用的列放在一个表,不常用的列放在其他表
  • 关系紧密的列放在一个表
  • 大字段列单独存放

image.png

水平拆分

表结构保持不变, 对数据进行拆分,将表中对某些行拆分到其他表中。

image.png

分库

分库, 经验来说,一个库对并发最多到 2000, 一定要扩容,一个健康的单库并发控制在1000 QPS 左右,如果超过,那么将一个库的数据拆分到多个库。

image.png

分库分表技术实现有两个派系


代理模式 Proxy

代表产品是 mycat,  SQL组合,数据库路由,执行结果合并都放到一个代理服务中。

  • 无代码侵入性, 支持多种语言
  • 需要额外引入中间件, 容易造成流量瓶颈

客户端模式Client

常见的有 Sharing-JDBC, 业务端系统只要引入一个 jar 包即可,按照规范配置路由规则, jar 包中处理数据库路由,SQL 组合,执行结果合并等操作。

  • 简单,容易上手,引入 jar 包即可,无流量瓶颈
  • 升级麻烦,升级 jar 包时,往往需要升级服务

如何选择分片键

  • 数据尽量均匀等分布在不同等库或者不同表,避免数据倾斜。
  • 跨库操作尽量少
  • 这个字段的值不会变化。

分片策略

  • hash 分片
  • range 分片(范围分片)
思考;分库分表如何平滑过渡?

历史数据迁移


  1. 增量数据监听 binlog,通过 canal 增量迁移数据
  2. 全量迁移历史数据
  3. 开启双写,关闭增量迁移任务。
  4. 读业务切换到新库
  5. 线上运行一段时间,没有问题后,下线老库。

双写迁移方案

简单来说,对新库,老库都操作。要注意的是不允许老数据覆盖新数据。

image.png

思考题

如何设计可以动态扩容缩容的分库分表方案?

相关文章
|
4月前
|
缓存 关系型数据库 MySQL
分库分表知识总结(四)
分库分表知识总结(四)
65 1
|
4月前
|
SQL 存储 数据库连接
什么是分库分表,为什么要分库分表?
笔者经常将缓存、分库分表、消息队列定义为高并发三剑客。开发互联网应用系统时,分库分表是一个绕不开的技术点。 这篇文章,我们会探讨如下问题:
|
4月前
|
存储 关系型数据库 中间件
什么是分库分表
什么是分库分表
37 3
|
28天前
|
中间件 数据库 运维
分库分表
【8月更文挑战第10天】
39 12
|
2月前
|
中间件 数据库
分库分表全局查询
【7月更文挑战第12天】
130 12
|
4月前
|
存储 算法 数据库连接
为什么要分库分表
为什么要分库分表
为什么要分库分表
|
4月前
|
缓存 监控 Java
分库分表带来的问题
分库分表带来的问题
|
弹性计算 Java 关系型数据库
分库分表比较推荐的方案
ShardingSphere 绝对可以说是当前分库分表的首选!ShardingSphere 的功能完善,除了支持读写分离和分库分表,还提供分布式事务、数据库治理等功能。另外,ShardingSphere 的生态体系完善,社区活跃,文档完善,更新和发布比较频繁
160 0
|
11月前
|
SQL 缓存 关系型数据库
什么情况下需要考虑分库分表?
什么情况下需要考虑分库分表?
133 0
|
存储 负载均衡 Oracle
分库分表介绍
分库分表是一种用于解决大规模数据存储和查询性能问题的数据库架构设计技术。它将一个数据库拆分成多个独立的数据库实例(分库),并将每个数据库实例的表进一步拆分成多个子表(分表)。这样可以提高数据库的并发处理能力和查询性能。
235 0