ShardingSphere的分片策略

举报
周杰伦本人 发表于 2022/11/29 17:00:54 2022/11/29
【摘要】 ShardingSphere的分片策略本篇文章源码基于4.0.1版本上篇文章我们说到ShardingSphere通过路由引擎根据路由规则获取数据节点,然后生成路由结果,具体路由策略在ShardingStrategy的实现类中体现,这篇文章就说说ShardingSphere的分片策略,分配策略可以通过工厂类ShardingStrategyFactory来创建实例,这一块的代码在shardin...

ShardingSphere的分片策略

本篇文章源码基于4.0.1版本

上篇文章我们说到ShardingSphere通过路由引擎根据路由规则获取数据节点,然后生成路由结果,具体路由策略在ShardingStrategy的实现类中体现,这篇文章就说说ShardingSphere的分片策略,分配策略可以通过工厂类ShardingStrategyFactory来创建实例,这一块的代码在sharding-core模块的sharding-core-common子模块中

分片策略的组成

分片策略由分片算法和分片键组成,分片算法对应是接口是ShardingAlgorithm,分片策略类中会调用分片算法来进行分片处理

复合分片策略

复合分片策略对应的实现类是ComplexShardingStrategy,由于表与表之间存在复杂的关系,ShardingSphere没有帮我们实现分片算法,而是提供ComplexKeysShardingAlgorithm接口,由我们来自定义实现复合分片的算法。

Hint分片策略

Hint分片策略对应的实现类是HintShardingStrategy,它是根据Hint进行路由,我们在讲强制路由的时候就使用的这种分片策略,它的doSharding()方法中调用了HintShardingAlgorithm的分片算法,一般我们会自定义HintShardingAlgorithm的实现类,通过 HintShardingStrategyConfiguration加载了HintShardingAlgorithm实例

行表达式分片策略

行表达式分片策略对应的实现类是InlineShardingStrategy,它是根据分片键和行表达式来进行分配,行表达式通过Groovy进行解析,

不分片策略

NoneShardingStrategy是不分片策略的实现类,方法中不执行任何的路由操作。

标准分片策略

标准分片策略对应的实现类是StandardShardingStrategy,它的成员变量有分配列shardingColumn,分片算法有精确匹配分片算法PreciseShardingAlgorithm和范围匹配分配算法RangeShardingAlgorithm两种

精确匹配分片算法

精确匹配分片算法对应的接口是PreciseShardingAlgorithm,主要处理的是分配键的in和等号的SQL语句,它作为一个接口,实现类有:

  1. 对数据库进行模运算分片算法PreciseModuloDatabaseShardingAlgorithm,根据分片值对2进行取模运算
  2. 对表进行模运算分片算法PreciseModuloTableShardingAlgorithm,根据分片值对4进行取模运算

范围匹配分配算法

范围匹配分配算法算法对应的接口是RangeShardingAlgorithm,它处理的是分片键为一定范围的语句,实现类同样有两个:

  1. 对数据库进行模运算分片算法RangeModuloDatabaseShardingAlgorithm,根据最小值和最大值的范围遍历,根据分片值对2进行取模运算
  2. 对表进行模运算分片算法RangeModuloTableShardingAlgorithm,根据最小值和最大值的范围遍历,根据分片值对4进行取模运算

总结

这篇文章我们讲了ShardingSphere的分片策略,具体有5种:复合分片策略、Hint分片策略、行表达式分片策略、不分片策略、标准分片策略,并对每种分配策略用到的分配算法进行了介绍。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。