🔍 登录 注册

TiDB 架构拆解与一次真实容量评估实录

今 今晚打老虎 2026-10-23 👁 0 ⏱ 4min

TiDB 架构拆解与一次真实容量评估实录

选分布式数据库最容易犯的错,是拿单机数据库的直觉做决策:以为"加节点就线性扩容"、"SQL 兼容就等于行为兼容"。TiDB 的架构决定了它的强项与软肋都很明确。本文拆解架构,并给出一份真实的容量评估过程。

一、三层结构与各自的代价

Client ──MySQL 协议──▶ TiDB Server(无状态 SQL 层)
                          ├─▶ PD(调度与元数据时钟)
                          └─▶ TiKV(Raft 复制的 KV,数据分片 = Region)

三条关键推论,直接决定选型:

  1. TiDB Server 无状态,SQL 解析/优化在这层。计算能力横向加机器即可,但复杂查询的优化器能力弱于成熟的单机引擎;
  2. 一次跨 Region 事务要走 Raft 多数派,写入延迟的下限由网络 RTT 决定。跨地域部署的写入延迟会显著上升;
  3. 热点 Region 是核心瓶颈单位。单个 Region 覆盖的 key range 被单节点承接,所有写入压在同一节点上时,加 TiKV 节点也无效。

理解 Region(默认 96MB,过大自动 split)是容量评估的基本单位。

二、事务模型的取舍

TiDB 默认悲观事务(Pessimistic),行为接近 InnoDB:加锁后提交。乐观事务在写冲突密集场景会大量重试,生产很少用。

两个必须提前验证的行为差异:

-- 自增 ID 不保证连续,且缓存分配(默认 30000 步长)
-- 依赖 AUTO_INCREMENT 做业务发号会立刻掉坑
ALTER TABLE orders AUTO_ID_CACHE 1;       -- 严格递增但吞吐下降
-- 正确做法:业务侧发号(Snowflake/号段)
-- 大事务限制:单事务默认 100GB 上限,实际远低于此就会明显退化
-- 批量刷数必须分批
SET @@tidb_mem_quota_query = 4<<30;

还有一条常被忽略:AUTO_RANDOM 适合打散写入,它是为规避 Region 热点设计的:

CREATE TABLE evt (
  id BIGINT PRIMARY KEY AUTO_RANDOM(5),
  body JSON
);

三、一次真实容量评估的输入清单

拿到一个 3TB 订单库要迁 TiDB 的需求,评估输入只有六项,缺一项结论都不可信:

| 输入项 | 采样方式 | |---|---| | 日写入行数与字节 | binlog 统计一周 | | 读写比与新查询占比 | 慢日志 + 应用埋点 | | 热点 key 分布 | SHOW HOT REGIONS / PD 面板 | | 最大单事务体量 | 应用审计 | | 需要的最强一致性读 | 与业务确认(tidb_read_staleness 是否可用) | | 峰值 QPS 与 P99 目标 | 网关统计 |

采样后先做"能不能迁"的判定,而不是先算节点数。三类场景不适合:单行超高频更新(计数器)、依赖跨表强一致外键级联、以及重 OLTP 存储过程。

四、节点容量估算

TiKV 容量按"数据总量 ÷ 副本数 × 空间放大系数"估:

数据总量 = 逻辑数据 × 压缩比(0.35~0.5)
单节点承载 = 3TB × 0.4 ÷ 3副本 ÷ 节点数 × 1.4(空间放大+均衡余量)

3TB 逻辑数据、6 个 TiKV 节点 → 单节点约 400GB,SSD 上余量健康。

TiDB Server 数量按 SQL 并发估:经验上一个 16C 的 TiDB Server 支撑 1~2k QPS 简单查询。峰值 8k QPS 配 6 个。PD 固定 3 节点(奇数、多数派)。

TiFlash 单列:分析型查询走列存副本,不占 TiKV 计算。有报表需求就加,别指望 TiKV 行存能扛住全表扫描。

ALTER TABLE orders SET TIFLASH REPLICA 2;
SELECT /*+ READ_FROM_STORAGE(TIFLASH[orders]) */ count(*) FROM orders WHERE dt='2026-10-01';

五、必须做的三类压测

不要用 sysbench 默认配置得出"能扛"的结论,它测的是均匀分布。

# 1. 均匀写入(基线)
sysbench oltp_write_only --tables=16 --table-size=10000000 --threads=128 run

# 2. 热点写入:单表 + 非打散主键,模拟 Region 热点
sysbench oltp_insert --tables=1 --table-size=50000000 --auto-inc=on run

# 3. 混合读写 + 长事务
sysbench oltp_read_write --percentile=99 --time=1800 --threads=256 \
  --read-only=off --composite-tests=on run

关注四个指标:P99 commit latency、TiKV apply duration、region scatter 频率、scheduler latch wait。热点测试里若出现单节点 CPU 显著高于其他、且 PD 频繁调度不收敛,就是热点未被 AUTO_RANDOM 打散的信号。

六、运维侧的真实成本

TiDB 把"主从搭建"的复杂度换成了"分布式调度"的复杂度,运维要新增四块能力:

  1. BR 备份恢复演练,不能只配不做。
tiup br backup full --pd $PD --storage s3://backup/tidb?provider=xxx
tiup br restore full --pd $PD --storage s3://backup/tidb
  1. Region 调度观察:SHOW HOT REGIONS、PD 的 balance 计划,扩容后要看收敛时间;
  2. 统计信息新鲜度:tidb_analyze_version=2,大表导入后要手动 ANALYZE TABLE,否则执行计划会错得离谱;
  3. 版本升级:跨大版本要先升 PD,滚动升级路径必须先在预发完整走一遍。

还有一个隐性成本:慢查询的排查工具链更复杂,一个 SQL 慢可能是优化器选了错索引、可能是 Region 热点、也可能是 Coprocessor 内存超限。要习惯读 EXPLAIN ANALYZE 里的 cop_task、wf(wait function)指标。

小结

TiDB 的适用判定不是"数据量多大",而是三个问题:是否存在单点写入热点、是否需要跨节点事务且能接受 RTT 级延迟、团队是否有能力运维分布式调度。数据量只是结果,不是原因。评估的正确顺序:拿全六项输入 → 判定场景适配 → 用 AUTO_RANDOM 等打散热点 → 按 Region 单位估容量 → 做含热点与非均匀的三类压测 → 演练备份恢复。走完这套流程再决策,比照着"容量上限"表格拍板可靠得多。

读完了?给作者一点支持

本文采用 CC BY 4.0 协议转载 · © 今晚打老虎

评论(0)

登录 后参与评论。

  • 还没有评论,来抢沙发。

🔗 相关文章