TiDB 是一个开源的分布式关系型数据库,具有 计算与存储分离 的架构,支持 HTAP(混合事务/分析处理) workload。本文介绍 TiDB 主要架构组件和常见术语。
简介
- TiKV 是 CNCF 的项目,分布式事务键值数据库。它基于 Google Spanner 和 HBase 的设计,但管理起来更简单,而且不依赖任何分布式文件系统
- TiKV 是一种高度可扩展、低延迟且易于使用的键值数据库
PingCAP 与 TiKV 的关系
-
创造者与被创造者
- PingCAP (pingcap.com) 是一家商业公司,是分布式数据库 TiDB 的开发商。
- TiKV (tikv.org) 是 PingCAP 为了解决 TiDB 的底层存储问题而开发的一个分布式 Key-Value 数据库引擎。最初 TiKV 是 PingCAP 公司内部的一个核心组件。
-
捐赠与独立治理
- 为了促进技术生态的发展和中立性,PingCAP 将 TiKV 项目捐赠给了 CNCF(云原生计算基金会)。
- tikv.org 是 TiKV 独立运作后的官方开源项目网站。现在 TiKV 是 CNCF 的毕业项目 (Graduated Project),这意味着它在名义上不再属于 PingCAP 公司私有,而是一个由开源社区(包括 PingCAP 员工和其他公司贡献者)共同维护的独立开源项目。
-
商业与核心依赖
- 尽管 TiKV 已经捐赠出去,但 PingCAP 仍然是 TiKV 社区最主要的代码贡献者和维护者。
- PingCAP 的核心商业产品 TiDB,其底层存储引擎依然完全依赖 TiKV。因此,PingCAP 对 TiKV 的技术演进和稳定性高度关注,二者在技术上是紧密绑定的
共生关系。
核心架构组件 (Core Components)
TiDB 的架构主要由四大核心组件组成:
TiDB Server (计算层 / SQL 层)
- 角色:对外暴露 MySQL 协议,相当于系统的
前台或大脑皮层。
- 功能:
- 接收客户端 SQL 请求。
- 执行 SQL 解析(Parser)和优化(Optimizer)。
- 生成执行计划。
- 无状态 (Stateless):自身不存储数据,只负责计算。这意味着可以通过简单的增加节点来扩展计算能力(Scale-out)。
- 交互:从 PD 获取元数据和时间戳,从 TiKV/TiFlash 读取或写入数据。
PD (Placement Driver) Server (调度层 / 元数据管理)
PD (Placement Driver) 是 TiDB 集群的管理模块,同时也负责集群数据的实时调度。
- 角色:整个集群的
大脑和元数据中心。
- 功能:
- 存储元数据:记录每个 Region(数据分片)在哪里。
- 调度 (Scheduling):自动平衡集群负载(例如将热点 Region 移动到空闲节点,或在节点下线时补充副本)。
- TSO (Timestamp Oracle):提供全局唯一且递增的时间戳,用于实现分布式事务(MVCC)。
- ID 分配:分配全局唯一的 ID。
- PD:默认监听 2379 (提供给客户端和 TiKV/TiDB 的服务端口) 和 2380 (PD 节点间的通信端口)。
- PD 的 2379 端口完全兼容 etcd v3 协议:
- PD 嵌入了 etcd:PD 内部为了实现高可用(HA)和元数据存储,直接嵌入了一个 etcd server。
- 功能复用:PD 利用 etcd 的 Raft 算法来保证数据的一致性,并用它来存储集群的拓扑结构、Region 分布等元数据。
- 工具兼容:可以直接使用
etcdctl(etcd 的官方命令行工具)连接 PD 的 2379 端口来查看成员状态或存储的键值对(例如:etcdctl --endpoints=127.0.0.1:2379 member list)。
TiKV Server (行存储层 / 事务存储)
- 角色:分布式的 Key-Value 存储引擎,数据的大本营。
- 功能:
- 行式存储 (Row-based):适合 OLTP(事务处理)业务。
- 数据持久化:底层使用 RocksDB 引擎。
- 强一致性:使用 Raft 协议保证多副本数据一致性。
- Coprocessor:支持算子下推(在存储层直接进行过滤、聚合),减轻 TiDB Server 压力。
TiFlash (列存储层 / 分析存储)
- 角色:列式存储扩展,专门用于 OLAP(分析处理)。
- 功能:
- 列式存储 (Column-based):适合大批量数据扫描和分析。
- 异步复制:以 Raft Learner 的身份从 TiKV 异步复制数据,不阻塞主库写入。
- HTAP 关键:允许用户对同一份数据同时进行事务处理(TiKV)和分析查询(TiFlash),实现物理隔离,互不干扰。
常见术语 (Common Terminology)
理解这些术语是深入 TiDB 的基础:
数据分片与组织
- Region:
- TiDB 数据存储和调度的基本单位。
- 默认大小为 96MB。
- 数据在 TiKV 中是按 Key 有序排列的,连续的一段 Key Range 组成一个 Region。
- Peer:
- Region 的副本。一个 Region 通常有 3 个副本(Peers),分布在不同的 TiKV 节点上。
- Store:
- 指一个 TiKV 实例(通常对应一块物理磁盘或一个节点)。
一致性与共识 (Raft 相关)
- Raft Group:
- 每一个 Region 的多个副本(Peers)组成一个 Raft Group。
- Leader:
- Raft Group 中负责处理读写请求的主副本。
- Follower:
- 从 Leader 同步日志的副本。当 Leader 挂掉时,Follower 可以被选为新的 Leader。
- Learner:
- 只同步数据,不参与投票,也不提供对外读写服务(TiFlash 也是以 Learner 角色接入)。
- Split / Merge:
- 当 Region 过大(>144MB)时会发生 Split(分裂);过小或空闲时会发生 Merge(合并)。
事务与执行
- TSO (Timestamp Oracle):
- 由 PD 提供的全局时间戳服务,包含物理时间和逻辑时间,用于确定事务的先后顺序。
- MVCC (Multi-Version Concurrency Control):
- 多版本并发控制。TiDB 在 Key 后面加上版本号(Timestamp),使得读写操作互不阻塞,支持历史快照读取。
- 2PC (Two-Phase Commit):
- 两阶段提交。TiDB 采用 Percolator 模型(Google 的分布式事务模型)来实现跨节点的分布式事务。
- 分为 Prewrite 和 Commit 两个阶段。
- Coprocessor (算子下推):
- TiDB Server 将部分计算逻辑(如
Limit, Order By, Where 过滤)推送给 TiKV 执行,TiKV 只返回处理后的有效数据,减少网络传输。
底层存储
- RocksDB:
- TiKV 内部实际将数据写入磁盘的单机 KV 引擎(LSM-Tree 结构)。TiKV 只是在 RocksDB 之上加了 Raft 协议和分布式管理。
- SST (Sorted String Table):
一条 SQL 是如何执行的?
- 用户 发送 SQL 到 TiDB Server。
- TiDB 解析 SQL,并向 PD 询问:
这些数据在哪些 Region 上?由于 MVCC,我现在应该读哪个时间版本的数据(获取 TSO)?
- TiDB 根据 PD 返回的路由信息,将请求分发给对应的 TiKV (或 TiFlash) 节点。
- TiKV (通过 Coprocessor) 查找数据,进行初步过滤,返回结果给 TiDB。
- TiDB 汇总数据,进行最后的计算,返回给 用户。
安装部署
快速体验 v4.0.2(过时)
CentOS 7.4
mkdir -p /data/tidb/logs/
mkdir /data/tidb/pd
mkdir /data/tidb/tikv
并同步时间
ntpdate ntp.aliyun.com
wget http://download.pingcap.org/tidb-latest-linux-amd64.tar.gz
wget http://download.pingcap.org/tidb-latest-linux-amd64.sha256
sha256sum -C tidb-latest-linux-amd64.sha256
sha256sum -c tidb-latest-linux-amd64.sha256
tar -zxvf tidb-latest-linux-amd64.tar.gz
[root@a1 tidb-v4.0.2-linux-amd64]# tar -zxvf tidb-latest-linux-amd64.tar.gz /data/tidb/
[root@a1 tidb-v4.0.2-linux-amd64]# cd /data/tidb/tidb-v4.0.2-linux-amd64
[root@a1 tidb-v4.0.2-linux-amd64]# ll
total 1148
drwxr-xr-x 2 root root 4096 Jul 1 19:18 bin
-rw-r--r-- 1 root root 1009394 Apr 16 15:23 PingCAP Community Software Agreement(Chinese Version).pdf
-rw-r--r-- 1 root root 158646 Apr 16 15:23 PingCAP Community Software Agreement(English Version).pdf
[root@a1 tidb-v4.0.2-linux-amd64]# ./bin/pd-server --data-dir=/data/tidb/pd --log-file=/data/tidb/logs/pd.log &
[1] 9470
[root@a1 tidb-v4.0.2-linux-amd64]# ps -ef|grep pd-server
root 9470 8016 2 15:08 pts/7 00:00:00 ./bin/pd-server --data-dir=/data/tidb/pd --log-file=/data/tidb/logs/pd.log
[root@a1 tidb-v4.0.2-linux-amd64]# ./bin/tikv-server --pd="127.0.0.1:2379" --data-dir=/data/tidb/tikv --log-file=/data/tidb/logs/tikv.log &
[2] 9520
[root@a1 tidb-v4.0.2-linux-amd64]# ps -ef|grep tikv-server
root 9520 8016 1 15:09 pts/7 00:00:00 ./bin/tikv-server --pd=127.0.0.1:2379 --data-dir=/data/tidb/tikv --log-file=/data/tidb/logs/tikv.log
[root@a1 tidb-v4.0.2-linux-amd64]# ./bin/tidb-server --store=tikv --path="127.0.0.1:2379" --log-file=/data/tidb/logs/tidb.log &
[3] 9666
[root@a1 tidb-v4.0.2-linux-amd64]# ps -ef|grep tidb-server
root 9666 8016 5 15:09 pts/7 00:00:00 ./bin/tidb-server --store=tikv --path=127.0.0.1:2379 --log-file=/data/tidb/logs/tidb.log
mysql -h 127.0.0.1 -P 4000 -u root