数据库分片:一波实战说说ShardingShpere怎么水平分片的

676 阅读3分钟

本文来源于公众号:勾勾的Java宇宙(微信号:Javagogo)

原文链接:mp.weixin.qq.com/s/Fy45BKBIZ… 作者:高洪涛

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

分片键

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

常用的算法有 UUIDSnowfalke 两种无状态生成算法。

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

分片键结构

其中有效部分有三个。

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

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

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

分片工具

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

  • PreciseShardingAlgorithm 配合哈希函数使用,可以实现哈希分片
  • RangeShardingAlogrithm 可以实现范围分片
  • 使用 ComplexShardingStrategy 可以使用多个分片键来实现融合分片算法
  • 有的时候,数据表的分片模式不是完全一致,对于一些特别的分片模式,可以使用 HintShardingStrategy 在运行态制定特殊的路由规则,而不必使用统一的分片配置
  • 如果用户希望实现诸如地理位置算法等特殊的分片算法,可以自定义分片策略
    • 使用 inline 表达式进行编写,基于配置不需要编译,适合简单的个性化分片计算
    • 使用 Java 代码,可以实现更加复杂的计算,但需要编译打包

自动分片

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

自动分片功能

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

自动分片过程

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

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

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


欢迎关注公众号 勾勾的Java宇宙(微信号:Javagogo),拒绝水文,收获干货!