暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

实战数据分片:ShardingShpere是如何水平分片的

勾勾的Java宇宙 2021-02-23
430

自动分片是分布式数据库的主流功能,所有主要的分布式数据库,甚至数据库中间件都在尝试自动分片。为了介绍分片算法,我以 Apache ShardingShpere 为例。

分片键

ShardingShpere 首先提供了分布式的主键生成,这是生成分片键的关键。由于分布式数据库内一般由多个数据库节点参与,因此基于数据库实例的主键生成并不适合分布式场景。

常用的算法有 UUID 和 Snowfalke 两种无状态生成算法。

UUID 是最简单的方式,但是生成效率不高,且数据离散度一般。因此目前生产环境中会采用后一种算法。

其中有效部分有三个。

  • 时间戳:算法类似 UNIX 时间的表示形式,它是从一个特定时间开始到当前时间点之间的毫秒数,本案例中该算法可以使用近 70 年。

  • 工作节点 ID:保证每个独立工作的数据库节点不会产生重复的数据。

  • 访问序列:在同一个进程、同一个毫秒内,保证产生的 ID 不重复。

分片工具

为了保证分片计算的灵活性,ShardingShpere 提供了标准分片算法和一些工具,可以让用户灵活和统一地制定数据库分片策略。

  • PreciseShardingAlgorithm 配合哈希函数使用,可以实现哈希分片


  • RangeShardingAlogrithm 可以实现范围分片


  • 使用 ComplexShardingStrategy 可以使用多个分片键来实现融合分片算法


  • 有的时候,数据表的分片模式不是完全一致,对于一些特别的分片模式,可以使用 HintShardingStrategy 在运行态制定特殊的路由规则,而不必使用统一的分片配置


  • 如果用户希望实现诸如地理位置算法等特殊的分片算法,可以自定义分片策略

    • 使用 inline 表达式进行编写,基于配置不需要编译,适合简单的个性化分片计算

    • 使用 Java 代码,可以实现更加复杂的计算,但需要编译打包

自动分片

ShardingShpere 提供了 Sharding-Scale 来支持数据库节点弹性伸缩,该功能就是其对自动分片的支持。下图是自动分片功能展示图,可以看到经过 Sharding-Scale 的特性伸缩,原有的两个数据库扩充为三个。

自动分片包含下图所示的四个过程。

从图中可以看到,ShardingShpere 可以支持复杂的基于哈希的自动分片。

同时也应该看到,没有专业和自动化的弹性扩缩容工具,想要实现自动化分片是非常困难的。

以上是分片算法的实际案例,使用的是经典的水平分片模式。


推荐阅读:

话说数据库选型:从SQL到Distributed SQL

年后要准备晋升答辩,PPT还没写,危!

在TLB多路组相联缓存设计中,如何实现LRU缓存?



文章转载自勾勾的Java宇宙,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论