TiDB架构设计 #
一、整体架构概览 #
1.1 架构全景图 #
text
┌─────────────────────────────────────────────────────────────────────────────┐
│ 应用层 │
│ MySQL Client / JDBC / ORM / Application │
└─────────────────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ 负载均衡层 │
│ HAProxy / LVS / F5 │
└─────────────────────────────────────────────────────────────────────────────┘
│
┌───────────────────────┼───────────────────────┐
▼ ▼ ▼
┌─────────────────────┐ ┌─────────────────────┐ ┌─────────────────────┐
│ TiDB Server │ │ TiDB Server │ │ TiDB Server │
│ (计算层) │ │ (计算层) │ │ (计算层) │
│ │ │ │ │ │
│ SQL解析 → 优化 │ │ SQL解析 → 优化 │ │ SQL解析 → 优化 │
│ 执行 → 分布式执行 │ │ 执行 → 分布式执行 │ │ 执行 → 分布式执行 │
└─────────────────────┘ └─────────────────────┘ └─────────────────────┘
│ │ │
└───────────────────────┼───────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ Placement Driver (调度层) │
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ PD │ │ PD │ │ PD │ │
│ │ Leader │ │ Follower │ │ Follower │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
│ 功能: 元数据管理 / 调度决策 / 时间戳分配 / 负载均衡 │
└─────────────────────────────────────────────────────────────────────────────┘
│
┌───────────────────────┼───────────────────────┐
▼ ▼ ▼
┌─────────────────────┐ ┌─────────────────────┐ ┌─────────────────────┐
│ TiKV │ │ TiKV │ │ TiKV │
│ (存储层) │ │ (存储层) │ │ (存储层) │
│ │ │ │ │ │
│ Region 1 (Leader) │ │ Region 1 (Follower)│ │ Region 1 (Follower)│
│ Region 2 (Follower)│ │ Region 2 (Leader) │ │ Region 2 (Follower)│
│ Region 3 (Follower)│ │ Region 3 (Follower)│ │ Region 3 (Leader) │
└─────────────────────┘ └─────────────────────┘ └─────────────────────┘
│ │ │
└───────────────────────┼───────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ TiFlash (列存引擎) │
│ │
│ 实时同步 TiKV 数据 → 列式存储 → 加速 OLAP 分析查询 │
└─────────────────────────────────────────────────────────────────────────────┘
1.2 三层架构 #
| 层级 | 组件 | 职责 |
|---|---|---|
| 计算层 | TiDB Server | SQL解析、优化、执行 |
| 调度层 | PD | 元数据管理、调度、时间戳 |
| 存储层 | TiKV/TiFlash | 数据存储、分布式事务 |
1.3 设计理念 #
text
TiDB 设计原则
├── 存算分离
│ ├── 计算层无状态,可水平扩展
│ └── 存储层有状态,通过Raft保证一致性
│
├── 一切皆Region
│ ├── 数据按Range分片
│ └── 每个Region独立Raft复制
│
├── 去中心化
│ ├── 无单点故障
│ └── 自动故障恢复
│
└── 云原生
├── 容器化部署
└── 弹性伸缩
二、TiDB Server(计算层) #
2.1 核心功能 #
text
TiDB Server 处理流程
┌─────────────────────────────────────────────────────────────────────────────┐
│ │
│ MySQL Protocol │
│ │ │
│ ▼ │
│ ┌─────────┐ │
│ │ 连接管理 │ 连接池、权限验证 │
│ └────┬────┘ │
│ ▼ │
│ ┌─────────┐ │
│ │SQL解析器 │ 词法分析 → 语法分析 → AST │
│ └────┬────┘ │
│ ▼ │
│ ┌─────────┐ │
│ │ 预处理 │ 语义分析、名称解析、权限检查 │
│ └────┬────┘ │
│ ▼ │
│ ┌─────────┐ │
│ │ 查询优化│ 逻辑优化 → 物理优化 → 执行计划 │
│ └────┬────┘ │
│ ▼ │
│ ┌─────────┐ │
│ │ 执行器 │ 算子执行、数据流转 │
│ └────┬────┘
│ │ │
│ ▼ │
│ ┌─────────┐ │
│ │分布式执行│ 并行执行、数据聚合 │
│ └─────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
2.2 SQL解析 #
词法分析
sql
-- 输入SQL
SELECT name FROM users WHERE id = 1;
-- 词法分析结果
Token: SELECT (关键字)
Token: name (标识符)
Token: FROM (关键字)
Token: users (标识符)
Token: WHERE (关键字)
Token: id (标识符)
Token: = (操作符)
Token: 1 (数值)
Token: ; (分隔符)
语法分析
text
AST (抽象语法树)
SELECT
/ \
columns FROM
| |
name WHERE
/ \
id = 1 users
2.3 查询优化器 #
逻辑优化
text
逻辑优化规则
├── 谓词下推
│ └── 将过滤条件尽可能下推到存储层
│
├── 投影下推
│ └── 只读取需要的列
│
├── Join重排序
│ └── 优化多表Join顺序
│
└── 子查询展开
└── 将子查询转换为Join
sql
-- 原始查询
SELECT u.name, o.order_no
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE u.status = 'active';
-- 谓词下推后
-- 先过滤 users.status = 'active'
-- 再执行 Join
物理优化
text
物理优化选择
├── 扫描方式
│ ├── 全表扫描
│ └── 索引扫描
│
├── Join方式
│ ├── Hash Join
│ ├── Merge Join
│ └── Index Join
│
└── 聚合方式
├── Hash Aggregation
└── Stream Aggregation
2.4 执行引擎 #
火山模型
text
执行计划树 (火山模型)
┌───────────┐
│ Projection│
│ (name) │
└─────┬─────┘
│ Next()
┌─────┴─────┐
│ Filter │
│ id = 1 │
└─────┬─────┘
│ Next()
┌─────┴─────┐
│TableReader│
│ (users) │
└───────────┘
向量化执行
text
向量化执行 (批处理)
┌─────────────────────────────────────────────────────────────┐
│ │
│ 传统执行: 逐行处理 │
│ Row1 → Row2 → Row3 → ... → RowN │
│ │
│ 向量化执行: 批量处理 │
│ Batch [Row1, Row2, ..., Row1024] → 处理 │
│ │
│ 优势: 减少函数调用开销,提高CPU缓存命中率 │
│ │
└─────────────────────────────────────────────────────────────┘
2.5 分布式执行 #
text
分布式执行框架
┌─────────────────────────────────────────────────────────────────────────────┐
│ TiDB Server │
│ │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ 查询优化器 │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ 执行计划 │ │
│ │ │ │
│ │ ┌───────────┐ │ │
│ │ │ Root │ 协调节点 │ │
│ │ └─────┬─────┘ │ │
│ │ │ │ │
│ │ ┌─────┴─────────────────────────────────────┐ │ │
│ │ │ Exchange │ │ │
│ │ └─────┬─────────┬─────────┬────────────────┘ │ │
│ │ │ │ │ │ │
│ │ ┌─────┴───┐ ┌───┴───┐ ┌───┴───┐ │ │
│ │ │CopTask 1│ │CopTask2│ │CopTask3│ 下推到TiKV执行 │ │
│ │ └─────────┘ └───────┘ └───────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
│
┌───────────────────────┼───────────────────────┐
▼ ▼ ▼
┌───────────────┐ ┌───────────────┐ ┌───────────────┐
│ TiKV │ │ TiKV │ │ TiKV │
│ CopTask 1 │ │ CopTask 2 │ │ CopTask 3 │
│ (过滤+聚合) │ │ (过滤+聚合) │ │ (过滤+聚合) │
└───────────────┘ └───────────────┘ └───────────────┘
Coprocessor 下推
sql
-- 查询
SELECT COUNT(*), AVG(amount)
FROM orders
WHERE status = 'completed';
-- 下推执行
-- TiKV 节点本地过滤和聚合
-- 只返回聚合结果给 TiDB
三、TiKV(存储层) #
3.1 核心概念 #
Key-Value存储
text
TiKV 数据模型
┌─────────────────────────────────────────────────────────────┐
│ │
│ SQL 表 │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ id (PK) │ name │ age │ │ │
│ ├─────────┼─────────┼─────┤ │ │
│ │ 1 │ Alice │ 25 │ │ │
│ │ 2 │ Bob │ 30 │ │ │
│ │ 3 │ Carol │ 28 │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ 转换为 KV │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Key │ Value │ │
│ ├────────────────────────┼────────────────────────────┤ │
│ │ t{table_id}_r{row_id} │ [name, age] 编码后数据 │ │
│ │ t1_r1 │ [Alice, 25] │ │
│ │ t1_r2 │ [Bob, 30] │ │
│ │ t1_r3 │ [Carol, 28] │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
Key编码规则
text
Key 编码格式
┌─────────────────────────────────────────────────────────────┐
│ │
│ 行数据 Key: │
│ t{table_id}_r{row_id} │
│ 例: t10_r1, t10_r2 │
│ │
│ 索引 Key: │
│ 唯一索引: t{table_id}_i{index_id}{index_value}{row_id} │
│ 非唯一索引: t{table_id}_i{index_id}{index_value}{row_id} │
│ 例: t10_i1'Alice'1 │
│ │
│ 编码特点: │
│ - 有序编码,支持范围扫描 │
│ - 表数据连续存储 │
│ - 索引数据连续存储 │
│ │
└─────────────────────────────────────────────────────────────┘
3.2 Region分片 #
Region概念
text
Region 分片
┌─────────────────────────────────────────────────────────────┐
│ │
│ 整个 Key 空间 │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ Key: [minKey ......................... maxKey] │ │
│ │ │ │
│ └───────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ 按 Range 切分为多个 Region │
│ ┌──────────┬──────────┬──────────┬──────────┐ │
│ │ Region 1 │ Region 2 │ Region 3 │ Region 4 │ │
│ │ [a, f) │ [f, k) │ [k, p) │ [p, z] │ │
│ └──────────┴──────────┴──────────┴──────────┘ │
│ │
│ 每个 Region: │
│ - 默认 96MB │
│ - 独立的 Raft Group │
│ - 3 副本 │
│ │
└─────────────────────────────────────────────────────────────┘
Region分裂与合并
text
Region 分裂
┌─────────────────────────────────────────────────────────────┐
│ │
│ 分裂前: │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Region 1 [a, z] │ │
│ │ 大小: 200MB │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ 分裂后: │
│ ┌─────────────────────┐ ┌─────────────────────┐ │
│ │ Region 1 [a, m) │ │ Region 2 [m, z] │ │
│ │ 大小: 100MB │ │ 大小: 100MB │ │
│ └─────────────────────┘ └─────────────────────┘ │
│ │
│ 触发条件: Region 大小超过阈值 (默认 144MB) │
│ │
└─────────────────────────────────────────────────────────────┘
Region 合并
┌─────────────────────────────────────────────────────────────┐
│ │
│ 合并前: │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ Region 1 │ │ Region 2 │ │
│ │ [a, f) │ │ [f, k) │ │
│ │ 大小: 10MB │ │ 大小: 15MB │ │
│ └─────────────┘ └─────────────┘ │
│ │ │
│ ▼ │
│ 合并后: │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Region 1 [a, k) │ │
│ │ 大小: 25MB │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ 触发条件: 相邻 Region 大小都小于阈值 (默认 20MB) │
│ │
└─────────────────────────────────────────────────────────────┘
3.3 Raft一致性协议 #
Raft Group结构
text
Region Raft Group
┌─────────────────────────────────────────────────────────────┐
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Raft Group │ │
│ │ │ │
│ │ ┌───────────┐ │ │
│ │ │ Leader │ ◄── 处理读写请求 │ │
│ │ │ TiKV 1 │ │ │
│ │ └─────┬─────┘ │ │
│ │ │ 复制日志 │ │
│ │ ┌─────┴─────────────────┐ │ │
│ │ │ │ │ │
│ │ ▼ ▼ │ │
│ │ ┌───────────┐ ┌───────────┐ │ │
│ │ │ Follower │ │ Follower │ │ │
│ │ │ TiKV 2 │ │ TiKV 3 │ │ │
│ │ └───────────┘ └───────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ 特点: │
│ - 多数派写入成功即返回 │
│ - 自动 Leader 选举 │
│ - 日志复制保证一致性 │
│ │
└─────────────────────────────────────────────────────────────┘
写入流程
text
写入流程
┌─────────────────────────────────────────────────────────────┐
│ │
│ Client │
│ │ │
│ │ 1. 写请求 │
│ ▼ │
│ ┌───────────┐ │
│ │ Leader │ │
│ │ TiKV 1 │ │
│ └─────┬─────┘ │
│ │ │
│ │ 2. 写入本地日志 │
│ │ │
│ │ 3. 复制日志到 Follower │
│ │ │
│ ┌─────┴─────────────────┐ │
│ │ │ │
│ ▼ ▼ │
│ ┌───────────┐ ┌───────────┐ │
│ │ Follower │ │ Follower │ │
│ │ TiKV 2 │ │ TiKV 3 │ │
│ │ 4. 写日志 │ │ 4. 写日志 │ │
│ └─────┬─────┘ └─────┬─────┘ │
│ │ │ │
│ │ 5. 确认 │ 5. 确认 │
│ │ │ │
│ └───────┬───────────┘ │
│ │ │
│ ▼ │
│ ┌───────────┐ │
│ │ Leader │ │
│ │ TiKV 1 │ │
│ │ 6. 多数派│ │
│ │ 确认 │ │
│ │ 7. 提交 │ │
│ │ 8. 返回 │ │
│ └───────────┘ │
│ │ │
│ ▼ │
│ Client │
│ 写入成功 │
│ │
└─────────────────────────────────────────────────────────────┘
3.4 存储引擎 #
RocksDB
text
TiKV 存储架构
┌─────────────────────────────────────────────────────────────┐
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ TiKV │ │
│ │ │ │
│ │ ┌─────────────────────────────────────────────┐ │ │
│ │ │ Raft Engine │ │ │
│ │ │ (Raft 日志存储) │ │ │
│ │ └─────────────────────────────────────────────┘ │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ ┌─────────────────────────────────────────────┐ │ │
│ │ │ RocksDB │ │ │
│ │ │ (数据存储) │ │ │
│ │ │ │ │ │
│ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │
│ │ │ │ MemTable│ │ MemTable│ │ MemTable│ │ │ │
│ │ │ │ (活跃) │ │ (不可变)│ │ (不可变)│ │ │ │
│ │ │ └────┬────┘ └────┬────┘ └────┬────┘ │ │ │
│ │ │ │ │ │ │ │ │
│ │ │ ▼ ▼ ▼ │ │ │
│ │ │ ┌─────────────────────────────────────┐ │ │ │
│ │ │ │ SST Files │ │ │ │
│ │ │ │ L0 L1 L2 L3 L4 L5 L6 │ │ │ │
│ │ │ └─────────────────────────────────────┘ │ │ │
│ │ │ │ │ │
│ │ └─────────────────────────────────────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
LSM-Tree结构
text
LSM-Tree 写入流程
┌─────────────────────────────────────────────────────────────┐
│ │
│ 写入 │
│ │ │
│ ▼ │
│ ┌─────────┐ │
│ │ Write │ 1. 写入 WAL (预写日志) │
│ │ Ahead │ │
│ │ Log │ │
│ └────┬────┘ │
│ │ │
│ ▼ │
│ ┌─────────┐ │
│ │MemTable │ 2. 写入内存表 │
│ │ (活跃) │ │
│ └────┬────┘ │
│ │ 大小达到阈值 │
│ ▼ │
│ ┌─────────┐ │
│ │MemTable │ 3. 转为不可变 │
│ │ (不可变)│ │
│ └────┬────┘ │
│ │ │
│ ▼ │
│ ┌─────────┐ │
│ │ Flush │ 4. 刷写到磁盘 SST 文件 │
│ │ to Disk │ │
│ └────┬────┘ │
│ │ │
│ ▼ │
│ ┌─────────┐ │
│ │Compact │ 5. 后台压缩合并 │
│ │ │ │
│ └─────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
四、PD(调度层) #
4.1 核心功能 #
text
PD 功能模块
┌─────────────────────────────────────────────────────────────┐
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Placement Driver │ │
│ │ │ │
│ │ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ 元数据管理 │ │ 时间戳分配 │ │ │
│ │ │ │ │ │ │ │
│ │ │ - 集群信息 │ │ - TSO分配 │ │ │
│ │ │ - Region信息│ │ - 全局有序 │ │ │
│ │ │ - 节点信息 │ │ - 事务ID │ │ │
│ │ └─────────────┘ └─────────────┘ │ │
│ │ │ │
│ │ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ 调度器 │ │ 负载均衡 │ │ │
│ │ │ │ │ │ │ │
│ │ │ - Balance │ │ - 热点调度 │ │ │
│ │ │ - Evict │ │ - 容量均衡 │ │ │
│ │ │ - Scatter │ │ - Leader均衡│ │ │
│ │ └─────────────┘ └─────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
4.2 TSO时间戳 #
text
TSO (Timestamp Oracle)
┌─────────────────────────────────────────────────────────────┐
│ │
│ TSO 结构 (64位) │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 64 bits │ │
│ │ ┌─────────────────────────┬────────────────────┐ │ │
│ │ │ 物理时间 (38位) │ 逻辑计数 (16位) │ │ │
│ │ │ │ │ │ │
│ │ │ 毫秒级时间戳 │ 同一毫秒内计数 │ │ │
│ │ └─────────────────────────┴────────────────────┘ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ 示例: │
│ 物理时间: 1700000000000 (毫秒) │
│ 逻辑计数: 123 │
│ TSO: 1700000000000 << 16 | 123 │
│ │
│ 特点: │
│ - 全局唯一 │
│ - 单调递增 │
│ - 用于事务版本控制 │
│ │
└─────────────────────────────────────────────────────────────┘
4.3 调度策略 #
Balance调度
text
Region 均衡调度
┌─────────────────────────────────────────────────────────────┐
│ │
│ 场景: TiKV 节点存储容量不均衡 │
│ │
│ 调度前: │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ TiKV 1 │ │ TiKV 2 │ │ TiKV 3 │ │
│ │ 80% 容量 │ │ 40% 容量 │ │ 50% 容量 │ │
│ │ 100 Regions │ │ 50 Regions │ │ 60 Regions │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
│ PD 检测到不均衡,发起调度 │
│ │
│ 调度后: │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ TiKV 1 │ │ TiKV 2 │ │ TiKV 3 │ │
│ │ 60% 容量 │ │ 60% 容量 │ │ 60% 容量 │ │
│ │ 70 Regions │ │ 70 Regions │ │ 70 Regions │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
Leader均衡
text
Leader 均衡调度
┌─────────────────────────────────────────────────────────────┐
│ │
│ 场景: Leader 分布不均,部分节点压力大 │
│ │
│ 调度前: │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ TiKV 1 │ │ TiKV 2 │ │ TiKV 3 │ │
│ │ 80 Leaders │ │ 20 Leaders │ │ 30 Leaders │ │
│ │ 高负载 │ │ 低负载 │ │ 中负载 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
│ PD 发起 Leader 转移 │
│ │
│ 调度后: │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ TiKV 1 │ │ TiKV 2 │ │ TiKV 3 │ │
│ │ 43 Leaders │ │ 43 Leaders │ │ 44 Leaders │ │
│ │ 负载均衡 │ │ 负载均衡 │ │ 负载均衡 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
热点调度
text
热点检测与调度
┌─────────────────────────────────────────────────────────────┐
│ │
│ 热点检测: │
│ - 监控 Region 读写 QPS │
│ - 监控 Region 流量大小 │
│ - 识别热点 Region │
│ │
│ 热点调度策略: │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 1. 打散热点 Region 的副本到不同节点 │ │
│ │ │ │
│ │ 2. 热点 Region 分裂 │ │
│ │ ┌──────────┐ ┌─────┬─────┐ │ │
│ │ │ Hot Region│ ──► │ R1 │ R2 │ │ │
│ │ └──────────┘ └─────┴─────┘ │ │
│ │ │ │
│ │ 3. 转移热点 Leader │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
五、TiFlash(列存引擎) #
5.1 HTAP架构 #
text
HTAP 混合负载架构
┌─────────────────────────────────────────────────────────────┐
│ │
│ 应用请求 │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ TiDB Server │ │
│ │ │ │
│ │ 优化器自动选择: │ │
│ │ - OLTP 请求 → TiKV (行存) │ │
│ │ - OLAP 请求 → TiFlash (列存) │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │ │
│ │ │ │
│ ▼ ▼ │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ TiKV │ │ TiFlash │ │
│ │ 行存 │ │ 列存 │ │
│ │ OLTP │ │ OLAP │ │
│ │ │ │ │ │
│ │ 点查/事务 │ │ 分析查询 │ │
│ └─────────────┘ └─────────────┘ │
│ │ ▲ │
│ │ │ │
│ └───── Raft 同步 ─────┘ │
│ │
│ 特点: │
│ - 数据实时同步 │
│ - 一套系统两种负载 │
│ - 事务分析互不干扰 │
│ │
└─────────────────────────────────────────────────────────────┘
5.2 列存优势 #
text
行存 vs 列存
┌─────────────────────────────────────────────────────────────┐
│ │
│ 行存 (TiKV) │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Row1: [id, name, age, email, address, phone] │ │
│ │ Row2: [id, name, age, email, address, phone] │ │
│ │ Row3: [id, name, age, email, address, phone] │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ 适合: 点查、事务处理、全字段读取 │
│ │
│ ───────────────────────────────────────────────────── │
│ │
│ 列存 (TiFlash) │
│ ┌─────────┬─────────┬─────────┬─────────┬─────────┐ │
│ │ id │ name │ age │ email │ address │ │
│ ├─────────┼─────────┼─────────┼─────────┼─────────┤ │
│ │ 1 │ Alice │ 25 │ a@x.com │ ... │ │
│ │ 2 │ Bob │ 30 │ b@x.com │ ... │ │
│ │ 3 │ Carol │ 28 │ c@x.com │ ... │ │
│ └─────────┴─────────┴─────────┴─────────┴─────────┘ │
│ │
│ 适合: 分析查询、聚合计算、少量列读取 │
│ │
│ 优势: │
│ - 只读取需要的列 │
│ - 更好的数据压缩 │
│ - 向量化执行 │
│ │
└─────────────────────────────────────────────────────────────┘
5.3 数据同步 #
text
TiKV → TiFlash 同步机制
┌─────────────────────────────────────────────────────────────┐
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ TiKV │ │
│ │ │ │
│ │ Region Leader │ │
│ │ │ │ │
│ │ │ Raft Log │ │
│ │ ▼ │ │
│ │ ┌─────────────────────────────────────────────┐ │ │
│ │ │ Raft Group │ │ │
│ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │
│ │ │ │ TiKV │ │ TiKV │ │ TiFlash │ │ │ │
│ │ │ │ Follower│ │ Follower│ │ Learner │ │ │ │
│ │ │ └─────────┘ └─────────┘ └─────────┘ │ │ │
│ │ └─────────────────────────────────────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ TiFlash 作为 Learner: │
│ - 只同步数据,不参与投票 │
│ - 不影响 TiKV 性能 │
│ - 数据强一致性 │
│ │
└─────────────────────────────────────────────────────────────┘
六、数据流转 #
6.1 写入流程 #
text
完整写入流程
┌─────────────────────────────────────────────────────────────┐
│ │
│ Client │
│ │ │
│ │ INSERT INTO users (name) VALUES ('Alice') │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ TiDB Server │ │
│ │ │ │
│ │ 1. SQL 解析、优化 │ │
│ │ 2. 获取 TSO (start_ts) │ │
│ │ 3. 编码 Key-Value │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ │ 从 PD 获取 Region 位置 │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ PD │ │
│ │ │ │
│ │ 返回 Region Leader 位置 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ │ 发送写入请求到 TiKV Leader │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ TiKV │ │
│ │ │ │
│ │ 4. 获取 Latch (行锁) │ │
│ │ 5. 检查数据版本 │ │
│ │ 6. 通过 Raft 写入日志 │ │
│ │ 7. 复制到 Follower │ │
│ │ 8. 多数派确认后提交 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ │ 返回写入成功 │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ TiDB Server │ │
│ │ │ │
│ │ 9. 获取 commit_ts │ │
│ │ 10. 提交事务 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ Client │
│ 写入成功 │
│ │
└─────────────────────────────────────────────────────────────┘
6.2 读取流程 #
text
完整读取流程
┌─────────────────────────────────────────────────────────────┐
│ │
│ Client │
│ │ │
│ │ SELECT * FROM users WHERE id = 1 │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ TiDB Server │ │
│ │ │ │
│ │ 1. SQL 解析、优化 │ │
│ │ 2. 生成执行计划 │ │
│ │ 3. 获取 TSO (read_ts) │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ │ 从 PD 获取 Region 位置 │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ PD │ │
│ │ │ │
│ │ 返回 Region 位置信息 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ │ 发送读取请求 │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ TiKV │ │
│ │ │ │
│ │ 4. 根据 read_ts 读取对应版本数据 │ │
│ │ 5. MVCC 版本可见性检查 │ │
│ │ 6. 返回数据 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ TiDB Server │ │
│ │ │ │
│ │ 7. 数据处理、过滤 │ │
│ │ 8. 结果聚合 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ Client │
│ 返回结果 │
│ │
└─────────────────────────────────────────────────────────────┘
七、总结 #
TiDB架构核心特点:
| 特点 | 说明 |
|---|---|
| 存算分离 | 计算层无状态,存储层有状态 |
| 水平扩展 | 各层独立扩展,线性增长 |
| 高可用 | Raft协议,自动故障恢复 |
| 强一致 | 分布式事务,ACID保证 |
| HTAP | 行存列存并存,事务分析一体 |
下一步,让我们学习 TiDB 支持的数据类型!
最后更新:2026-03-27