分库分表方案
1. 垂直分片
将整个库按业务划分为多个库。可以扩展数据库连接数
,提升数据库IO性能,但不能解决单表数据量大的问题。
2. 水平分片
从数据维度切分,使用分片键+分片规则,将单表数据拆分到多张表中。可以扩展单表可控数据量,提升数据库查询性能
。
分库分表技术选型
市面上常用的有ShardingSphere和Mycat。
ShardingSphere是Apache的顶级分库分表项目,社区活跃度高,产品更新快。mycat的活跃度相对来说活跃度不高,且版本迭代更新慢。
ShardingSphere包括了jdbc,proxy, 它提供了水平分片、垂直分库分表、读写分离、分布式事务等功能。它支持多种主流数据库,包括 MySQL、PostgreSQL、Oracle 等。ShardingSphere 还提供了灵活的配置选项,方便开发人员根据实际需求进行定制化配置。ShardingSphere包含了jdbc和proxy两个产品。jdbc基于客户端分库分表,proxy基于服务端分库分表。 Mycat是基于客户端分库分表。
常用数据分片策略
1. 取模分片
优点:数据存放比较均匀
缺点:扩容需要大量数据迁移
2. 按范围分片
优点:扩容不需要迁移数据
缺点:数据存放不均匀,容易产生数据倾斜
3. 根据业务场景,灵活定制分片策略
如何不迁移数据,实现集群动态扩缩容?
关键点:整体按范围分片,保证扩容时老数据不需要迁移。在范围内,按取模分片,让每个范围内的数据分布大致均匀。
结合范围分片和取模分片的优点,订单系统先按范围分片,10月业务量小,分两个节点node1和node2,节点数表示对数据拆分的粒度,orderId%10,得到最终存放的节点位置node1或node2,如结果为0,2,4,6,8的在路由映射表中指定存到node1结点。11月大促订单增多,假设比10月多加一个节点node3,为了使数据分布更均匀,调整拆分粒度(节点数)为20,使11月的数据更均匀的落在node1, node2, node3。
node1和node2不仅存了10月的数据,还存了11月的数据,那它们的数据会比node3更多,node3只存了11月数据的1/3,可以给node3映射多一点。
这些配置信息存到redis里, shardingsphere分片时,通过自定义的算法去获取这些配置信息。
分库分表后会有哪些问题?
1. 主键唯一性:如果采用自增ID,会出现ID重复,且容易暴漏系统业务量。UUID可以保证唯一性,但它是字符串,且不能保证单调递增,那么维护主键索引的成本就变大了,插入数据后,会产生页分裂。 雪花算法生成的id是数字型,且能保证单调递增,是目前常用的分布式ID解决方案。 它将一个64位的长整型ID划分成多个部分,其中包括时间戳、机器ID、序列号等,以保证生成的ID在全局唯一且有序。
2. 分布式事务:分库后,分片不在同一个库中,自然不会在同一个事务里。目前常用的有XA协议的两阶段提交,TCC补偿机制,本地消息表,MQ事务消息。
3. SQL路由:按分片键查询时,需要按分片的规则,先计算出需要查询的分片,否则就要进行全分片查询。
4. 结果归并: 如果需要按排名查询,则先需要对各分片进行排序后,再将结果合并,最后从合并集中查询。
5. 跨库join: 可以在表中加冗余字段,只是更新时,需要同步更新。
什么时候需要进行分库分表
- 预估3年内,单表数据大于500万,或单表数据文件大小超过2GB(InnoDB的 .ibd文件)。
- 对于预估会持续高速增长的数据,需尽早分库分表,如订单表。
- 对于分片键频繁变更的数据,不适合做分库分表,分片键的变更会导致数据的迁移。
- 对于数据查询逻辑变化非常大的,不建议做分库分表
- 数据量大了之后,核心点不在于数据库连接数,也不在于查询性能
ShardingSphere分库分表时的内核执行流程图
动态数据源切换方案
1. 根据前端请求参数动态切换数据源
继承AbstractRoutingDataSource
类
读取配置并向spring容器注册两个数据源
2. 预设每个服务对应的数据源
引入dynamic-datasource
包
sharding-jdbc和sharding-proxy怎么选
jdbc客户端分库分表,作为一个扩展包放到业务代码中,以框架的方式提供分库分表的功能。主流的数据库都支持,需要代码中进行集成。
proxy服务端分库分表,自己部署成为独立的Mysql服务,它帮我们实现分库分表功能,应用像访问单机Mysql一样访问proxy服务。Mycat也是基于这种思想实现的。 目前它只支持Mysql和PostgreSQL。优点是使用简单,业务代码侵入少。
ShardingSphere分片的四种策略
1. Inline策略
根据单一分片键进行精确分片,不支持范围查询,会抛异常。
2. Standard策略:标准分片,支持精确查询和范围查询。但需要自己定义精确查询算法和范围查询算法。
3. Complex策略:
4. Hint强制策略 :强制指定分库或者分表。
以下是ShardingSphere的分库分表配置信息
指定分片键和分布式ID生成算法,以及分库和分表的策略是inline
数据迁移方案
基因法多分片查询
待更新
学习视频地址:2024新版 MySQL 分库分表从入门到精通视频教程