本文来源于公众号:勾勾的Java宇宙(微信号:Javagogo)
原文链接:mp.weixin.qq.com/s/Fy45BKBIZ… 作者:高洪涛
自动分片是分布式数据库的主流功能,所有主要的分布式数据库,甚至数据库中间件都在尝试自动分片。为了介绍分片算法,我以 Apache ShardingShpere 为例。
分片键
ShardingShpere 首先提供了分布式的主键生成,这是生成分片键的关键。由于分布式数据库内一般由多个数据库节点参与,因此基于数据库实例的主键生成并不适合分布式场景。
常用的算法有 UUID 和 Snowfalke 两种无状态生成算法。
UUID 是最简单的方式,但是生成效率不高,且数据离散度一般。因此目前生产环境中会采用后一种算法。
其中有效部分有三个。
-
时间戳:算法类似 UNIX 时间的表示形式,它是从一个特定时间开始到当前时间点之间的毫秒数,本案例中该算法可以使用近 70 年。
-
工作节点 ID:保证每个独立工作的数据库节点不会产生重复的数据。
-
访问序列:在同一个进程、同一个毫秒内,保证产生的 ID 不重复。
分片工具
为了保证分片计算的灵活性,ShardingShpere 提供了标准分片算法和一些工具,可以让用户灵活和统一地制定数据库分片策略。
- PreciseShardingAlgorithm 配合哈希函数使用,可以实现哈希分片
- RangeShardingAlogrithm 可以实现范围分片
- 使用 ComplexShardingStrategy 可以使用多个分片键来实现融合分片算法
- 有的时候,数据表的分片模式不是完全一致,对于一些特别的分片模式,可以使用 HintShardingStrategy 在运行态制定特殊的路由规则,而不必使用统一的分片配置
- 如果用户希望实现诸如地理位置算法等特殊的分片算法,可以自定义分片策略
- 使用 inline 表达式进行编写,基于配置不需要编译,适合简单的个性化分片计算
- 使用 Java 代码,可以实现更加复杂的计算,但需要编译打包
自动分片
ShardingShpere 提供了 Sharding-Scale 来支持数据库节点弹性伸缩,该功能就是其对自动分片的支持。下图是自动分片功能展示图,可以看到经过 Sharding-Scale 的特性伸缩,原有的两个数据库扩充为三个。
自动分片包含下图所示的四个过程。
从图中可以看到,ShardingShpere 可以支持复杂的基于哈希的自动分片。
同时也应该看到,没有专业和自动化的弹性扩缩容工具,想要实现自动化分片是非常困难的。
以上就是分片算法的实际案例,使用的是经典的水平分片模式。
欢迎关注公众号 勾勾的Java宇宙(微信号:Javagogo),拒绝水文,收获干货!