「1024 TiDB AIGC 黑客松」Region 的一生

「1024 TiDB AIGC 黑客松」Region 的一生

【作品名称】Region 的一生
【选择的创作方向】产品特性解读 / 技术概念可视化
【作品形式】AI 漫画 / 条漫(6 格,一张总图)+ 技术短文
【作品介绍/描述】用六格漫画把 TiDB 的数据分片写成一段 Region 的一生:建表时独自诞生,长大后分裂,三副本投票写入,热点时被压垮,再由 PD 调度搬家。第一人称讲清 Multi-Raft 与弹性扩展。
【使用的 AIGC 工具】Cursor(选题、分镜、文案与技术校对);图像生成模型(六格漫画,画面内不放中文,文案全部后制)
【是否有传播到社媒】暂无


作品展示

活动对漫画的硬性要求是「系列漫画,不少于 4 格」,没有规定必须一张还是分张。发帖时先上传总图 region-life-strip.png(一张里能数出 6 格),分页可选。

总图用于一眼看完整故事。下面 6 张分页补对白和技术说明;画面内不放汉字,避免生成乱码。

第 1 格|我诞生那天,整张表只有我一个

Region: 一张新表刚建出来。按默认行为,行数据往往先落在一个 Region 里。那时候公路很空,机架很远,我一个人站在整条 Key 空间的入口。

业务侧只看见 CREATE TABLE 成功了。没有人会想起我。

第 2 格|我长到边界,就被一劈为二

Region: 连续的 Key 会堆在一起。体积过了分裂阈值,我就得把自己让出去。左边一段 [StartKey, SplitKey),右边一段 [SplitKey, EndKey)。

这不是故障,这是长大。TiKV 把一张无限大的有序 Map,切成可以搬家的小块。默认大小随版本和配置变化:早期常见约 96 MiB,较新集群也可以配到约 256 MiB。

第 3 格|我不是一个人住:两票,字才能落下

Region: 我有几个副本,默认常常是三个,各自待在不同的 TiKV 节点上。我们组成一个 Raft Group。其中一个是 Leader,读写默认找它;另外的是 Follower,跟着复制日志。

写请求不是喊一声就结束。多数副本确认,这次变更才算安全落下。一台机器暗下去,只要多数还在,字还在。这就是 Multi-Raft:不是整个集群共用一个 Raft,而是每个 Region 自己有一组票。集群变大,投票单元也跟着变多,而不是把所有数据绑死在同一组副本上。

第 4 格|有一次,所有流量都砸在我头上

Region: 那天不是我太大,是我太热。

自增主键、单调时间戳、新建表后立刻高并发写入——请求都挤进同一段 Key。PD 可以把我从这台机器搬到那台机器,可调度的最小单位就是我。一个热点 Region 被搬走,火也跟着走,只是换了一台机器接着烧。

远处那些空闲的兄弟帮不上忙。它们不在我的 Key 范围里。

第 5 格|楼上有人看全局:叫 PD

Region: 我看不见全图。看见全图的是 PD。

TiKV 节点用心跳汇报磁盘、Region 数量、是否过载;每个 Raft Group 的 Leader 也汇报自己在哪、副本在哪、读写有多快。PD 拿这些信息做调度,常用动作其实就几类:

  • 副本不够,补一个;副本太多,删一个
  • Leader 扎堆,把 Leader 转走
  • 节点要下线,先把我搬空
  • 我太大,建议分裂;我太小,可能合并

调度会占网络、磁盘和 CPU,所以速度被故意按住。扩容不是“加一台立刻均分”,而是 PD 按心跳把 Region 一批一批迁过去。

面对我这种单点热点,光搬家不够。还需要把我切开:自动的 Load Base Split,或建表时的 SHARD_ROW_ID_BITS / AUTO_RANDOM / PRE_SPLIT_REGIONS,以及手动的 SPLIT TABLE。切开以后,流量才有机会落到不同的 Leader 上。

第 6 格|他们只看见:成功

Region: 手机亮了一下。对用户来说,这是一笔订单。对 SQL 来说,这是一次提交。对我来说,这是 Leader 收下提案,多数副本写下日志。

他们不会念我的 Region ID。
他们也不需要念。

复杂留在地下。地面上只需要一次成功。


创作说明

很多人第一次接触平凯数据库 / TiDB,会把它理解成「能水平扩展的 MySQL」。这句话能上手,但解释不了监控里为什么会出现几万个 Region,也解释不了为什么加了 TiKV,写入却还打在少数几台机器上。

我把底层三件套画成一个人的一生:

格子 产品能力 想让读者带走的一句
诞生 按 Key 范围切分 表是 SQL 的单位,Region 才是存储和调度的单位
分裂 水平扩展的基本动作 数据不是「一块盘」,是可以搬家的一段区间
投票 Multi-Raft 多副本 写入看多数派,不是看集群里有多少台机器
热点 单 Region 瓶颈 搬节点搬不散一把火,得把这段 Key 切开
调度 PD Placement Driver 心跳收集全局,再建议 Leader 执行 Add/Remove/Transfer/Split
地面 对业务的意义 用户看见成功,是因为地下还在投票、分裂和搬家

几个容易混的点,单独写清

1. Region 和表不是一回事。
一张表可以对应很多 Region;一个 Region 只覆盖一段连续 Key。索引通常还有自己的 Key 空间,也会形成 Region。所以「这张表很热」有时其实是「某段主键或某段索引很热」。

2. 副本数和 TiKV 台数不是一回事。
默认三副本时,一个 Region 只需要三份。集群从 3 台扩到 30 台,每个 Region 仍然是三副本,只是这些副本可以被调度到更多节点上。扩展的是容量和并行度,不是把每条记录复制 30 份。

3. PD 的指令是建议,不是魔法。
调度通过 Region Leader 的心跳带回操作。Leader 会按自身状态决定何时执行。所以你在监控里看到 operator,不代表下一秒拓扑已经变完。

4. 下线有中间态。
心跳丢失先会 Disconnect;超过 max-store-down-time(常见默认 30 分钟)才进入 Down,并开始补副本。手动下线则走 Offline:先把 Region 搬空,再进入 Tombstone。没搬空就关机器,等于主动制造缺副本。

5. 热点有两类,解法不同。

  • 许多热 Region 堆在少数 Store 上:PD 可以把它们打散。
  • 极少数 Region 自己就热:必须分裂、打散写入键,或改表设计。Load Base Split 会在读 QPS / 流量 / 读线程 CPU 持续超阈值后尝试找一个更均衡的切点;它对「单行被疯狂点查」这类切不开的热点,帮助有限。

为什么用第一人称,而不是架构图

架构图能把 TiDB、PD、TiKV 画全,但读者的眼睛会停在框上。Region 才是那条每天都在发生的生产线:诞生、长大、投票、过热、搬家。把它写成「我」,是为了让 Multi-Raft 和 PD 调度从名词变成情节。

漫画分镜由 Cursor 辅助完成,画面用图像模型生成后人工挑选;中文全部后制,避免模型把字画飘。技术表述对照了 TiDB 文档中心的存储、调度、热点处理与 Split Region 说明,并做了版本差异标注。画面是示意,不是运行手册。

留给社区的一句话

看见 Region,才算看见 TiDB。

扩容是把一段段 Key 搬走;可靠是让多数副本先举手;变快有时不是加机器,而是别让所有请求排进同一扇门。

1 个赞

很棒!第一人称的 Region 视角!
恭喜老师您的作品审核通过,可进入下一阶段社区投票~ 期待创作更多有趣的技术解读作品呀!

感谢您参与 1024 AIGC 黑客松并分享这么精彩的作品!温馨提醒:在您的图文/视频作品中,如果使用了外部素材(如特定字体、网图、视频片段或背景音乐),请注意确认其商用/开源授权。建议优先使用开源免费可商用素材(如思源黑体、阿里普惠体、Unsplash 等),或保留素材来源说明。尊重版权,让我们的创意走得更远,祝您取得好成绩!