编程 DDM 建库时 shard_number 怎么算:shard_unit × RDS 数,扩容要走预校验→切路由→清理

2026-10-31 00:05:51

DDM 逻辑库分片数在 CreateDatabase 时算死,扩容要过预校验、切路由、清理三步

DDM(Distributed Database Middleware)是兼容 MySQL 协议的分布式关系型数据库中间件,用于突破单机数据库的容量与性能瓶颈。但它不是“连上去就能任意扩”的 MySQL:逻辑库的分片数量在创建那一刻就按几个字段算定了,后续变更则是一组带状态的接口。

三个字段把分片数算死

CreateDatabase 的入参是 CreateDatabaseDetail,分片相关的是 ShardMode、ShardNumber、ShardUnit,其余字段只提供上下文:

  • Name:逻辑库名称,长度 2–48 个字符;必须以小写字母开头;只能包含小写字母、数字、下划线,不能有大写字母和其它特殊字符;禁用关键字 information_schema、mysql、performance_schema、sys。
  • ShardMode:拆分模式。cluster 表示拆分模式,single 表示非拆分模式。
  • ShardUnit:单个 RDS 上的逻辑库分片数。非必选。非拆分逻辑库固定为 1;拆分逻辑库大于等于 1、小于等于 64。
  • ShardNumber:同一种工作模式下逻辑库的分片数量。ShardUnit 不为空时,取 ShardUnit 与关联 RDS 数量的乘积;ShardUnit 为空时,大于关联的 RDS 数量,小于等于关联 RDS 数量 × 64。
  • UsedRds:逻辑库关联的 RDS,类型为 []DatabaseInstabcesParam。
// fourRds:已确定的 4 个关联 RDS
detail := ddm.CreateDatabaseDetail{
	Name:        "order_db",
	ShardMode:   "cluster",
	ShardNumber: 8,
	ShardUnit:   2,
	UsedRds:     fourRds, // 8 = 2 × 4
}

两种填法只有两种结果:要么显式给 ShardUnit,分片数就是 ShardUnit × RDS 数量;要么留空,DDM 在“大于 RDS 数量、不超过 RDS 数量 × 64”的区间内取值。创建完成后,没有接口让应用改 ShardNumber 本身,只能走分片变更。

扩容是一条预校验 → 切换 → 清理的链

分片变更在 SDK 里是一组方法,而不是一条语句:

  • CheckMigrateLogicDb:分片变更预校验;
  • CheckPreliminaryResults:查询分片变更预校验异步结果——预校验不是同步返回,要按结果接口取;
  • ChangeStrategy:修改切换路由策略,变更过程中路由怎么切由它控制;
  • CleanMigration:清理分片变更;
  • CancelMigration:取消分片变更,变更中途放弃时用;
  • CheckDataNodeConnection:检查数据节点连接,变更前后确认数据节点可达。

链路的形状由此固定:先预校验,再异步取校验结果,通过后才切路由,最后必须清理。清理和取消都是显式动作,所以变更不是“失败就自动回滚到底”,残留状态要自己收尾。

容易混淆的是内核版本那条线:ChangeDatabaseVersion、ListDatabaseAvailableVersions、RollBackDatabaseVersion、ShowRiskInfo 处理的是内核版本变更与风险提醒,与分片变更是两套接口。创建实例、建库、绑 EIP 也用 CreateDdmInstance、CreateDatabase、BindEip,参数组用 CreateDdmConfigurations。

hash 还是 range:拆分键尽量落在关联字段上

DDM 支持 hash 和 range 两大类拆分算法。hash 类把数据均匀分布到各个分片;按关联字段拆分的表会落在同一分片,从根上避免数据跨分片 JOIN。拆分键选得对不对,直接决定后面 SQL 能不能写。

应用侧 SQL 的边界

DDM 兼容 MySQL 协议及其语法,但分布式数据库与单机存在差异,SQL 使用有限制。上线前先做当前应用 SQL 与 DDM 支持语法的兼容性评估;具体语句可以在待执行 SQL 前加 DDM EXPLAIN 查看执行计划,再判断是否落到单分片。

JOIN 不是禁区:DDM 支持分布式 JOIN,表设计时可以通过字段冗余支持跨分片 JOIN,主要方式有三种——广播表、ER 分片、Share Join。真正被禁的是多个表的跨库 update 和 delete,这类语句需要改写成带分片键的单库操作。

把这几条串起来看:ShardMode、ShardNumber、ShardUnit 在 CreateDatabase 时定下分片拓扑,ShardUnit 与关联 RDS 数量共同决定 ShardNumber;拓扑要变就走预校验、切路由、清理这条链;应用侧则靠拆分键设计、DDM EXPLAIN 和跨库写限制把 SQL 约束在可执行范围内。

推荐文章

程序员茄子在线接单