https://shardingsphere.apache.org/index_zh.html
//TODO:功能介绍
基本概念
逻辑表(t_order),真实表(t_order_0),数据节点(ds_0.t_order_0),广播表(所有的分片数据源中都存在,表结构和表中的数据在每个数据库中均完全一致),分片键,分片算法,分片策略,全库路由(查询所有库的所有表,结果和笛卡尔积)。
功能列表
- 数据分片:CRUD
- Hint强制路由:当在SQL语句中没有分片字段信息时,使用HintManager以编程方式设置分片值
- 读写分离:修改操作默认走主库,查询操作默认走从库
- 编排治理:将配置信息保存到数据中心而不是本地文件中,结合Web界面使用 *
- 分布式事务:支持XA事务和BASE柔性事务,XA事务管理器为Atomikos,BASE柔性事务管理器为seata-workshop *
- 数据脱敏:数据脱敏是一个独立完整的功能,可以与数据分片一起使用,也可以单独剥离使用 *
- 弹性伸缩:目前只计划支持MySQL和PostgreSQL,因此MSQLServer无法使用,数据迁移只能自主实现 -
- Web界面:图形化界面使用配置中心和数据中心 //DONE 4.1.1版本配置失败,不知道什么原因 -
- 全局唯一ID:UUID,雪花算法 *
分片实现
ShardingShpere JDBC中的分片实现包含3个核心概念:分片键,分片算法和分片策略。
1.分片键:用于分片的数据库表字段,支持单字段分片,也支持多字段分片, SQL语句中如果无分片字段,将执行全路由,性能较差(当然,ShardingSphere JDBC还可以通过Hint分片来弥补)。
2.分片算法:通过不同的分片算法支持不同的分片操作场景,分片算法需要应用方开发者自行实现,ShardingSphere JDBC只提供了分片算法接口。
(1)精确分片算法:PreciseShardingAlgorithm,用于处理使用单一分片键的“=”,”IN”分片操作,需要配合StandardShardingStrategy分片策略使用。
(2)范围分片算法:RangeShardingAlgorithm,用于处理使用单一分片键的“BETWEEN AND”分片操作,需要配合StandardShardingStrategy分片策略使用。
(3)复合分片算法:ComplexKeysShardingAlgorithm,用于处理使用多分片键的操作,需要配合ComplexShardingStrategy分片策略使用。
(4)Hint分片算法:HintShardingAlgorithm,用于处理使用Hint行分片的操作(数据库表结构或SQL语句中没有分片字段信息),需要配合HintShardingStrategy使用。
3.分片策略 = 分片键 + 分片算法,分片算法必须与分片策略一起配合使用,ShardingSphere JDBC提供了5中分片策略。
(1)标准分片策略:StandardShardingStrategy,提供对SQL语句中的“=”, “>”, “<”, “>=”, “<=”, “IN”和“BETWEEN AND”的分片操作支持,StandardShardingStrategy只支持单分片键,搭配PreciseShardingAlgorithm和RangeShardingAlgorithm两个分片算法。PreciseShardingAlgorithm是必选的,用于处理“=”和“IN”的分片操作;RangeShardingAlgorithm是可选的,用于处理“>”, “<”, “>=”, “<=”,“BETWEEN AND”的分片操作;如果不配置RangeShardingAlgorithm,SQL中的“BETWEEN AND”将按照全库路由处理。
(2)复合分片策略:ComplexShardingStrategy,提供对SQL语句中的“=”, “>”, “<”, “>=”, “<=”, “IN”和“BETWEEN AND”的分片操作支持,ComplexShardingStrategy支持多分片键,由于多分片键之间的关系复杂,因此并未进行过多的封装,而是直接将分片键值组合以及分片操作符透传至分片算法,完全由应用开发者实现,提供最大的灵活度。
(3)行表达式分片策略:InlineShardingStrategy,使用Groovy的表达式,提供对SQL语句中的“=”和“IN”的分片操作支持,只支持单分片键。对于简单的分片算法,可以通过简单的配置使用,从而避免繁琐的Java代码开发,如: “t_user_$->{u_id % 8}”表示t_user表根据u_id模8,而分成8张表,表名称为t_user_0到t_user_7。
(4)Hint分片策略:HintShardingStrategy,通过Java API指定分片键值而非从SQL中提取分片键值的方式进行分片操作的策略。
(5)不分片策略:NoneShardingStrategy,不对表进行分片。
分片策略可用于数据库和表的分片,值得注意的是:对于一个逻辑表,只能使用一种分片策略,如果一个表同时配置了多种分片测试,启动时将会报错。
只有当SQL语句中明确带有分片字段,或者通过HintManager明确设置分片信息时才会执行分片算法,否则不会执行分片算法,而是执行全路由查找。
实践采坑
在使用ShardingSphere JDBC过程遇到的坑:
1.文档方面,最新文档中描述的示例都是最新版的代码实现,不同版本的示例中引用的Java类不同,这点一定要注意
最新文档地址:https://shardingsphere.apache.org/document/current/cn/overview/
指定版本的文档地址:https://shardingsphere.apache.org/document/legacy/
引用不同版本的jar包时就需要参考对应版本的文档示例,否则会出现无法找到Java类的错误。
https://www.jianshu.com/p/432b6e341afe 分布式系统中,数据库的分表、分库和分区基本概念梳理
https://www.infoq.cn/article/key-steps-and-likely-problems-of-horizontal-split-table 水平分库分表的关键步骤以及可能遇到的问题
https://www.cnblogs.com/rinack/p/11241111.html Sharding-Jdbc 自定义分库分表-复合分片算法自定义实现
https://blog.csdn.net/du_senge/article/details/86511119 sharding (四)不分库 只分表 (根据 id 主键) complex: 复合分片策略,用于多分片键的场景
https://www.jianshu.com/p/432b6e341afe 分布式系统中,数据库的分表、分库和分区基本概念梳理
https://blog.csdn.net/Shair911/article/details/102827973 第五章:Sharding-JDBC 自定义分片算法
http://www.r9it.com/20190729/sharding-jdbc-03.html Sharding-JDBC 系列 03 - 自定义分片算法
https://www.cnblogs.com/chengxy-nds/p/13919981.html sharding-jdbc 分库分表的 4种分片策略,还蛮简单的
https://www.cnblogs.com/jackion5/p/13658615.html 基于ShardingJDBC的分库分表详细整理
https://www.jianshu.com/p/864fc1d72a8a Sharding-JDBC-强制路由
https://zhuanlan.zhihu.com/p/162841382 ShardingSphere 4.x 编排治理之配置中心注册中心
https://www.atomikos.com/Main/TransactionsEssentials The Leading Open Source JTA/XA
https://www.baeldung.com/java-atomikos A Guide to Atomikos
https://github.com/seata/seata-workshop 基于 Seata 微服务架构下数据一致性的实践
https://blog.csdn.net/qq_41072148/article/details/108372553 sharding-ui配置使用教程
https://note.youdao.com/ynoteshare1/index.html?id=32be199cbaa71bd4a408bc4ed05df097&type=note sharding-proxy+sharding-ui使用配置.md
数据分片扩容不迁移方案
1.按范围分片
2.双倍节点扩容
3.一致性Hash分片:需要迁移部分节点数据
https://cloud.tencent.com/developer/article/1048685 100亿数据平滑数据迁移,不影响服务
https://kefeng.wang/2018/07/22/mysql-sharding/ MySQL 分库分表及其平滑扩容方案
https://www.jianshu.com/p/d296fa2bf61b 数据库分库分表(三)扩容无须数据迁移的分片算法
https://www.cnblogs.com/barrywxx/p/11532122.html 分库分表平滑扩容
https://www.jianshu.com/p/432b6e341afe 分布式系统中,数据库的分表、分库和分区基本概念梳理 <==== 这个是一致性Hash分片的具体实践
基础的一致性Hash算法可以满足在添加或删除节点时只迁移部分数据,但是存在数据倾斜的问题;通过增加虚拟节点的方式可以解决数据倾斜的问题,但是当添加或删除节点时迁移数据会很麻烦。
https://www.jianshu.com/p/15697cafe487 一致性hash的一些问题
https://www.cnblogs.com/jajian/p/10896624.html 分布式系统中一致性哈希算法
https://blog.csdn.net/free_ant/article/details/111461606 Springboot+Sharding-JDBC分库分表实践四之一致性Hash算法
https://blog.csdn.net/lihongxun945/article/details/51482903 数据库sharding和一致性哈希算法
https://zhuanlan.zhihu.com/p/73232520 Java面试:扩容无须数据迁移的分片算法