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