一、背景:Region 是 TiDB 的最小数据分片单位
TiDB 作为分布式数据库,核心设计理念之一就是 水平分片(sharding)。在存储层 TiKV 中,数据会被自动划分为多个 Region,每个 Region 默认包含一段连续的 key range(例如约 96 MiB 数据)。这些 Region 通过 Raft 协议复制到多个副本节点,以保证数据的一致性和高可用性。
每个 Region 对应的元数据由 PD 管理,PD 负责负载均衡、调度与分裂(split)。因此,Region 的大小直接影响系统的调度开销、元数据数量、Raft 心跳负载以及数据迁移成本。
二、v8.5 改动:Region 默认大小从 96 MiB 提升至 256 MiB
在 v8.5 版本中,PingCAP 官方将 Region 默认大小从 96 MiB 提升到 256 MiB。官方文档描述如下:
“Region default size increased from 96 MiB to 256 MiB to reduce Region management overhead and improve throughput.”— TiDB v8.5 Performance Highlights
改动前后参数对比
| 参数项 | v8.4 及以前 | v8.5 默认值 | 影响范围 |
|---|---|---|---|
region-split-size |
96 MiB | 256 MiB | Region 自动分裂阈值 |
region-max-size |
144 MiB | 384 MiB | 最大 Region 限制,超过会强制分裂 |
三、为什么要改?——Region 过多带来的隐性成本
在实际生产中,集群往往会产生数十万甚至上百万个 Region。这会带来几个显著问题:
- 调度压力增加:每个 Region 都需要 PD 进行心跳管理、调度与平衡。Region 越多,PD 的调度周期越长,CPU 占用越高。
- Raft 元数据膨胀:每个 Region 都有对应的 Raft log、元数据与 RocksDB 文件,数量过大会占用大量文件句柄与存储元数据空间。
- Compaction 开销增大:小 Region 意味着更多 SST 文件、更多 Level Compaction 操作,增加 I/O 放大。
- 热点分裂频繁:小 Region 在热点写入场景下更容易被频繁 split,导致写入抖动和资源浪费。
因此,提升默认 Region 大小 是一种“以空间换时间”的优化手段,可以显著降低调度与管理成本,从而提升集群整体稳定性与吞吐。
四、提升后的性能收益
根据 PingCAP 官方的 v8.5 性能报告,Region 默认大小调整后:
- OLTP 插入性能提升约 27%
- Analyze(统计信息收集)性能提升约 45%
这两个指标的提升与 Region 减少直接相关:
- 写入时分裂次数减少,降低了 Raft 日志与调度负载。
- Analyze 时扫描的 Region 数量减少,整体扫描 I/O 更集中。
在自建压测中,如果以 10 TB 数据为例:
- v8.4 时约有 10 TB / 96 MiB ≈ 110 k 个 Region;
- v8.5 时约为 10 TB / 256 MiB ≈ 39 k 个 Region;Region 数量减少近 65%,PD 负载、网络心跳流量、Region merge 操作次数均显著下降。
五、实际影响与兼容性
1. 对新集群的影响
- 从 v8.5 开始,新创建的集群默认即使用 256 MiB Region 大小。
- 适用于大多数场景,尤其是中大型集群(≥ 20 节点、≥ 数 TB 数据)。
2. 对旧集群升级的影响
- 升级到 v8.5 后,现有 Region 不会自动调整大小;只有新写入或触发 split 的 Region 才会按照新的参数生效。
- 可通过
region_merge与split-region命令逐步调整 Region 边界。 - 若业务以大量小表、小范围查询为主,可考虑保留旧值(96 MiB),避免大 Region 带来的热点聚合。
3. 适配建议
| 场景 | 推荐策略 |
|---|---|
| 写入密集型(如日志采集、时序数据) | 建议保留默认 256 MiB |
| 小表多查询型业务 | 可考虑调回 96 MiB 或更小 |
| 超大规模集群(> 100 TB) | 甚至可调高至 512 MiB 以减少 Region 数量 |
六、如何查看与修改 Region 参数
通过 TiKV 配置或命令行修改:
# 查看当前 Region 分裂阈值
tiup ctl:v8.5 tikv config show | grep region-split-size
# 修改 Region 默认大小(需重启生效)
tiup cluster edit-config <cluster-name>
# 修改 tikv 部分:
# server_configs:
# tikv:
# region-split-size: "256MB"
# region-max-size: "384MB"
如需动态调整,可结合 PD 调度策略与 region_merge 参数配合。
七、总结
这一改动看似简单,但实际上是 TiDB 团队针对多年生产反馈作出的系统性优化:
- 降低 PD 与 TiKV 调度压力:让大规模集群更平稳运行。
- 减少 Raft 心跳与 Compaction:有效提升系统整体吞吐与稳定性。
- 平衡“粒度”与“管理成本”:96 MiB Region 曾是安全保守选择,256 MiB 更适合现代 SSD / NVMe 硬件环境。
在未来版本中,随着存算分离架构的推进,Region 粒度可能继续与存储层 engine 协同优化。目前来看,TiDB v8.5 是一个值得升级的高性价比版本,尤其对中大型集群而言。
参考资料: