ShardingSphere分库分表及扩缩容策略

ShardingSphere > 用户手册

分库分表方案

1. 垂直分片
将整个库按业务划分为多个库。可以扩展数据库连接数,提升数据库IO性能,但不能解决单表数据量大的问题。
2. 水平分片
从数据维度切分,使用分片键+分片规则,将单表数据拆分到多张表中。可以扩展单表可控数据量,提升数据库查询性能
在这里插入图片描述
在这里插入图片描述

分库分表技术选型

市面上常用的有ShardingSphereMycat
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分片时,通过自定义的算法去获取这些配置信息。

在这里插入图片描述

参考:MyCat(三) 范围求模分片与扩容

分库分表后会有哪些问题?

1. 主键唯一性:如果采用自增ID,会出现ID重复,且容易暴漏系统业务量。UUID可以保证唯一性,但它是字符串,且不能保证单调递增,那么维护主键索引的成本就变大了,插入数据后,会产生页分裂。 雪花算法生成的id是数字型,且能保证单调递增,是目前常用的分布式ID解决方案。 它将一个64位的长整型ID划分成多个部分,其中包括时间戳、机器ID、序列号等,以保证生成的ID在全局唯一且有序。

2. 分布式事务:分库后,分片不在同一个库中,自然不会在同一个事务里。目前常用的有XA协议的两阶段提交,TCC补偿机制,本地消息表,MQ事务消息。

3. SQL路由:按分片键查询时,需要按分片的规则,先计算出需要查询的分片,否则就要进行全分片查询。

4. 结果归并: 如果需要按排名查询,则先需要对各分片进行排序后,再将结果合并,最后从合并集中查询。

5. 跨库join: 可以在表中加冗余字段,只是更新时,需要同步更新。

什么时候需要进行分库分表

  1. 预估3年内,单表数据大于500万,或单表数据文件大小超过2GB(InnoDB的 .ibd文件)。
  2. 对于预估会持续高速增长的数据,需尽早分库分表,如订单表。
  3. 对于分片键频繁变更的数据,不适合做分库分表,分片键的变更会导致数据的迁移。
  4. 对于数据查询逻辑变化非常大的,不建议做分库分表
  5. 数据量大了之后,核心点不在于数据库连接数,也不在于查询性能

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
在这里插入图片描述

数据迁移方案

mysql数据库扩容和数据迁移

基因法多分片查询

待更新

学习视频地址:2024新版 MySQL 分库分表从入门到精通视频教程

  • 20
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ShardingSphere是一个开源的分布式数据库中间件,用于实现分库分表分库分表是将一个数据库按照一定的规则分成多个库或者多个表,从而达到提高数据库性能和扩展性的目的。 在ShardingSphere中,可以通过配置公共表的方式来实现分库分表。通过设置配置文件中的参数,指定需要进行分库分表的表以及相应的规则和算法。例如,在配置文件中可以设置公共表和分库分表策略,如分库数、分表数、分片键的生成策略等。引用 同时,在使用ShardingSphere进行分库分表时,需要进行综合评估确定分库分表的数。一般建议初次分库分表时,将数据库分为4-8个库。引用 分库分表可以解决一些问题,例如垂直分表可以将热门数据和冷门数据分开存储,同时将大字段放在冷门数据表中。垂直分库可以按照业务进行拆分,将不同的业务放在不同的库中,解决单一服务器性能的瓶颈,提升整体架构的业务清晰度。水平分表可以解决单一表数据过大的问题,而水平分库可以将一个表的数据分别分到不同的库中,解决单一服务器数据过大的问题。引用 总结来说,ShardingSphere是一个用于实现分库分表的分布式数据库中间件,通过配置公共表和分库分表策略,可以将数据库按照一定规则进行分割,从而提高数据库性能和扩展性。分库分表的选择需要综合评估,并根据实际业务需求来确定分库分表的数策略

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值