当单机 MySQL 在千万级数据量下频繁出现写入瓶颈、分库分表又让业务代码越来越重时,TiDB 这类分布式数据库就成了更省心的选择。作为一款兼容 MySQL 协议的开源 NewSQL,TiDB 通过存算分离架构实现了水平扩展与 HTAP 混合负载,既能像 MySQL 一样用 SQL 读写,又能在不打扰业务的前提下弹性扩容。
一、TiDB 架构全景:三种角色各司其职
TiDB 集群由三个核心组件构成,职责清晰、可独立扩缩容。理解它们是吃透 TiDB 的第一步。
| 组件 | 角色 | 是否存数据 |
|---|---|---|
| TiDB | 无状态 SQL 计算层,接收 MySQL 协议请求、解析执行计划 | 否 |
| TiKV | 分布式 KV 存储,按 Region 分片、Raft 多副本保证一致性 | 是(行存) |
| PD | 集群大脑,负责元数据、时间戳 TSO 与 Region 调度 | 否 |
| TiFlash | 列式存储扩展,承载 HTAP 中的分析型查询 | 是(列存) |
二、为什么不直接分库分表?
分库分表短期内能扛住流量,但跨库 JOIN、分布式事务、全局 ID 与扩容迁移都会把复杂度推给业务代码。TiDB 把这些问题下沉到存储层,对外暴露单一 MySQL 端点。
| 维度 | 单机 MySQL | 分库分表 | TiDB |
|---|---|---|---|
| 写入扩展 | 受单机限制 | 靠人工拆库 | 加节点自动均衡 |
| 跨分片查询 | 天然支持 | 需中间件拼接 | 优化器自动下发 |
| 分布式事务 | 不需要 | 自研/弱一致 | 原生 Percolator 模型 |
| 运维成本 | 低 | 高 | 中(TiUP 托管) |
三、本地快速体验:一行命令起集群
官方提供了 tiup 这套部署工具,本地最小体验只需一条命令。它会拉起 1 个 TiDB、3 个 TiKV 和 1 个 PD 的伪集群。
# 安装 tiup 并启动本地 playground(默认监听 4000 端口)
curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh
source ~/.bashrc
tiup playground v8.5.0 --db 1 --kv 3 --pd 1 --host 127.0.0.1
集群起来后,直接用 MySQL 客户端即可连入,协议完全兼容:
mysql -h 127.0.0.1 -P 4000 -u root
-- 直接跑标准 MySQL 语法
CREATE DATABASE demo;
USE demo;
CREATE TABLE users (id BIGINT PRIMARY KEY, name VARCHAR(50), created_at DATETIME);
INSERT INTO users VALUES (1, 'alice', NOW());
SELECT * FROM users;
四、核心机制:Region 自动分片与 Raft 多副本
TiKV 会把数据按 Key Range 切分成多个 Region(默认约 96MB 一个),每个 Region 以 Raft 组形式在三个 TiKV 节点间保持三副本。PD 会监控每个 Region 的负载,自动完成分裂(split)与调度(balance),无需人工干预。
-- 查看 Region 分布与调度状态
SELECT REGION_ID, START_KEY, END_KEY, LEADER_ID, APPROXIMATE_SIZE
FROM information_schema.tikv_region_status
ORDER BY APPROXIMATE_SIZE DESC LIMIT 10;
-- 查看 Raft 副本与隔离调度配置
SHOW CONFIG WHERE TYPE='tikv' AND NAME LIKE '%raftstore%';
五、水平扩展实战:加节点不停机
这是 TiDB 最香的环节:业务无感知地横向扩容。生产环境用 tiup cluster 托管,编写扩容拓扑后一键生效,Region 会自动 rebalance 到新节点。
# scale-out.yaml:新增两个 TiKV 节点
tikv_servers:
- host: 10.0.1.11
port: 20160
status_port: 20180
- host: 10.0.1.12
port: 20160
status_port: 20180
# 执行扩容(mycluster 为集群名)
tiup cluster scale-out mycluster scale-out.yaml
tiup cluster display mycluster # 观察 Region 迁移进度
六、HTAP 利器:TiFlash 列存加速分析
传统方案里 OLTP 和 OLAP 要两套库,ETL 同步又慢又易错。TiDB 的 TiFlash 以 Raft Learner 方式异步同步行存数据并转成列存,让同一份数据既能做事务又能做实时分析,互不干扰。
-- 为某张表开启 TiFlash 列存副本
ALTER TABLE orders SET TIFLASH REPLICA 1;
-- 引擎隔离:分析查询强制走 TiFlash,事务查询走 TiKV
SELECT /*+ READ_FROM_STORAGE(TIFLASH[orders]) */ COUNT(*), SUM(amount)
FROM orders WHERE created_at >= '2026-10-01';
| 场景 | 推荐引擎 | 原因 |
|---|---|---|
| 点查 / 小事务 | TiKV(行存) | 低延迟、强一致 |
| 聚合 / 报表 / 即席分析 | TiFlash(列存) | 向量化扫描、互不阻塞 |
七、从 MySQL 平滑迁移
TiDB 高度兼容 MySQL 5.7/8.0 协议与语法,绝大多数 ORM 与存量 SQL 可直接复用。数据迁移推荐官方 dumpling + tidb-lightning 组合,全量导出再高速导入。
# 1. 全量导出(兼容 mysqldump 语义)
dumpling -h 127.0.0.1 -P 3306 -u root -B myapp -o /data/export
# 2. 高速导入到 TiDB(tidb-lightning)
tidb-lightning --config tidb-lightning.toml
# tidb-lightning.toml 关键项:
# [tikv-importer] backend = "local"
# [mydumper] data-source-dir = "/data/export"
# [tidb] host = "127.0.0.1" port = 4000
迁移前建议用 sync-diff-inspector 做上下游数据一致性校验。若你此前已熟悉 MySQL 主从复制 与 索引底层原理,理解 TiDB 的复制与索引模型会非常顺手。
八、生产部署与运维要点
生产集群同样由 TiUP 统一纳管,从拓扑定义、部署、扩容到监控一条龙。强烈建议开启 Prometheus + Grafana 监控(TiDB 官方面板已内置),并定期做 BR 备份。
# 1. 按拓扑文件部署集群
tiup cluster deploy mycluster v8.5.0 topo.yaml
tiup cluster start mycluster
# 2. 启停与状态
tiup cluster stop mycluster
tiup cluster display mycluster
# 3. 逻辑/物理备份(BR 推荐用于大数据量)
tiup br backup full --pd "10.0.1.10:2379" -s "local:///data/backup"
# 4. 监控面板(随集群自带)
# Grafana 默认端口 3000,Prometheus 默认 9090
| 生产检查项 | 建议 |
|---|---|
| 副本数 | TiKV 至少 3 节点三副本 |
| 隔离 | TiKV/PD 跨机架或可用区打 label |
| 备份 | 每日 BR 全量 + 定时日志备份 |
| 监控 | Prometheus + Grafana + 慢查询日志 |
| 参数 | 按 MySQL 深度调优 思路校准连接与内存 |
九、选型与避坑建议
TiDB 适合「数据量大、需要弹性扩展、又想少改业务代码」的场景,尤其适合原本就跑在 MySQL 上的系统做平滑升级。但若只是几 GB 的小库,单机 MySQL 或 PostgreSQL 反而更轻;纯分析型负载可以看 DuckDB 这类嵌入式 OLAP。落地时常见坑:误把大事务当 MySQL 跑(TiDB 单事务有大小限制)、忽略 PD 的 TSO 单点压力、TiFlash 副本数设置过高拖慢写入。先用 tiup playground 在本地验证兼容性,再规划生产拓扑,是最稳妥的路径。




