TiDB 内核解剖室SECTION 02

数据长大了会怎样?—— 一次写入驱动的自动分裂、扩容与均衡

1024 TiDB AIGC 黑客松 · 参赛作品 v0.2
KEY RANGE 空间 · 每一段就是一个 REGION(最右一段的 END_KEY 为空 = 正无穷)
本节口径与参数说明(技术解读准确性依据)
  • TiDB 的数据按 Key Range 切分为一个个 Region,每个 Region 覆盖一段连续、左闭右开的 Key 区间([start_key, end_key))。Region 是调度与复制的基本单位。
  • 分裂由 TiKV 主动发起,不是 PD 下命令。Region 大小逼近分裂阈值时,TiKV 自行执行分裂并上报 PD。分裂是"一个变两个",两个新 Region 各自仍持有完整的 3 个副本 —— 副本数不会因分裂而减少。
  • PD 负责调度,不负责存储数据。它按每个 store 的负载打分,把高分 store 上的 Region 迁往低分 store。搬迁以 peer(副本)为粒度,且带限流保护,不会打满网络。
  • 一个 Raft Group 的多个 peer 不能落在同一台 TiKV 上,因此 3 副本至少需要 3 个 store —— 这也是本演示台不允许把节点缩容到 3 台以下的原因。
  • 扩容后数据自动 rebalance,全程零人工干预,这正是「弹性扩缩容」的实际含义;缩容则必须先等 Region 迁走再下线节点。

口径与参数来源(已核验 · 2026-09-16 · TiDB 官方文档 stable 线 / release-8.5)
· 分裂后新 Region 大小 coprocessor.region-split-size 默认 256MiB(v8.4.0 之前为 96MiB);同区间隔 schedule.split-merge-interval 默认 1h。
· 调度限流默认值:region-schedule-limit 2048、leader-schedule-limit 4、replica-schedule-limit 64、hot-region-schedule-limit 4、merge-schedule-limit 8、max-snapshot-count 64、max-pending-peer-count 64;均衡缓冲区 tolerant-size-ratio 默认 0(自动调整)。
· 本台"安全下线"依据官方 Store 状态机(五态):手动下线进入 Offline 中间状态,当 leader_count 与 region_count 均为 0 后转为 Tombstone;心跳丢失超 20 秒转 Disconnect,超 max-store-down-time 默认 30 分钟转 Down 并开始补足副本。"若集群里不存在满足搬迁条件的其它目标 Store,该 Store 将一直处于 Offline 状态"——这正是本台"缩容下限保护"的官方依据。2026-09-20 真机实测补记:三节点 3 副本集群执行 store delete,被 PD 在入口直接拒绝(ErrStoresNotEnough:up stores 不允许降到副本数以下)—— 保护比"进入 Offline 后滞留"更前置;实跑原文见实测笔记的实测 09。
· 官方未公开 store 负载打分的具体公式、也未逐项列明各调度器的默认启用状态,故本台只呈现调度目标与调度结果,不呈现任何公式。
· 调度由巡检驱动:Region 健康巡检 patrol-region-interval 默认 10ms;副本调度使用 enable-joint-consensus 默认 true(v5.0 起引入)。
· 调度建议并非命令:PD 的操作"只是给 Region Leader 的建议,并不保证一定能得到执行"。
· 来源:PD 配置文件描述、TiDB 数据库的调度(docs.pingcap.com/zh/tidb/stable)。

以上带虚线的条目均可点击,查看官方原文、适用版本与文档链接 —— 琥珀色虚线表示"官方未列明,因此本作品一个字都不写"。全站共 69 项核验,覆盖八台演示台。

教学示意说明:真实集群单个 TiKV 通常承载数百至数千个 Region,本演示台为便于观察只渲染 1—6 个 Region 与 3—6 个节点,数量级经过压缩,机制与流程保持一致。

2026-09-24 修订(依 TiDB 官方同学反馈):① Key Range 边界 —— 最后一个 Region 的 END_KEY 为空,官方文档原文:"An empty key value for START_KEY or END_KEY indicates negative infinity or positive infinity respectively"(SHOW TABLE REGIONS),本台已把最右一段从 [u, z) 修正为 [u, +∞)。② Region 数与节点数的关系 —— balance-region 的目标是把副本在所有 Store 之间均匀分散,而 12 个 peer 摊 5 台只能得到 2/2/3/3/2,数学上无法均分;真实集群 Region 数远大于节点数,所以总能打散。本台已修正扩容逻辑:加节点时分裂同步继续发生,直到 Region 数追平节点数,再由 PD 均衡(5 台 → 5 个 Region → 15 peer → 每台 3 个)。

系列导航:01 Multi-Raft 日志复制 · 02 Region 分裂与 PD 调度 · 03 分布式事务 2PC · 04 向量搜索与 HNSW 索引

看完想自己上手?上面这些规则,在 09 · PD 调度官挑战 里变成了可以亲手操作的 7 个关卡 —— 搬副本、转 Leader、补副本、打散热点,每关的三星线就是按上述规则推演出的最优步数。

当前步骤
STEP 01 / 07
起步 · 一个 Region
点击下方"下一步"开始。
集群状态
TiKV 节点3
Region 数1
总副本数 peer3
分布1 / 1 / 1
倾斜度0
破坏性演示 · 亲手调度它

加节点请留意:你什么都没做,Region 就自己搬过去了。
下线时先看它怎么把 Region 搬空 —— 这就是"安全下线"的前提。