news 2026/5/29 3:01:18

TiDB 架构解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
TiDB 架构解析

想必不少开发者都有过类似经历:受制于传统数据库的局限,处处碰壁。业务流量陡增,分库分表改到崩溃;离线分析查询,半天出不来结果。再加上跨库事务、数据同步、弹性扩缩容等问题,运维开发步步维艰。

直到接触了 TiDB,我才真正理解什么叫 “降维打击”。它作为一款兼容 MySQL 协议的 HTAP 数据库,把 OLTP(事务处理)和 OLAP(分析处理)的能力捏合在了一起,彻底解决了传统架构的痛点。今天,我将从 6 个核心模块,带你把 TiDB 从里到外扒得明明白白,看完你也能给团队做架构选型!

一、TiDB 介绍与架构:一张图看懂

先从这张架构图说起:

1. 【应用接入】

业务系统直接用 MySQL 协议连接 TiDB,不用改代码,无缝兼容。

2. 【计算层:TiDB 集群】

多个无状态 TiDB 节点组成,负责 SQL 解析、优化和执行,可根据负载水平扩容。

3. 【调度大脑:PD 集群】

整个分布式集群的 “中枢”,负责分配时间戳、管理元数据、调度数据分片和负载均衡。

4. 【存储层:TiKV + TiFlash】

  • TiKV:事务型 KV 存储,用 Raft 协议保证强一致,支撑 OLTP 业务。
  • TiFlash:列式存储,专为 OLAP 分析查询优化,实现事务与分析负载隔离。

为什么这么设计?

传统数据库(如 MySQL)是“计算和存储绑死在一起”的单体架构。表一大、并发一高,加机器都没用——因为数据都在一台机器上。

TiDB 把计算、存储、调度彻底拆开,每一层都可以独立扩容:

  • 读并发高了?加 TiDB 节点
  • 数据量大了?加 TiKV 节点
  • 分析查询慢了?加 TiFlash 节点

这就是云原生数据库的核心能力:按需伸缩,独立扩展。

📌要点:TiDB 采用 Shared-Nothing 架构,每个 TiKV 节点独立负责一部分数据(Region),通过 PD 统一调度,实现真正的水平扩展。这一点和传统的 Shared-Disk 架构(如 Oracle RAC)有本质区别。

二、TiDB 测试环境部署:15分钟跑起来

很多人觉得分布式数据库部署复杂,其实 TiDB 在这方面做得相当友好。

快速部署分为以下几步:

  1. 环境准备(CentOS 7.x / Ubuntu 18.04+)
  2. 下载 TiUP 集群管理工具
  3. 编写拓扑配置文件
  4. 一键部署
  5. 验证集群状态

极简部署实操

# Step 1: 安装 TiUPcurl--proto'=https'--tlsv1.2-sSfhttps://tiup-mirrors.pingcap.com/install.sh|sh# Step 2: 启动本地测试集群(单机模拟分布式)tiup playground# 就这么简单,一个命令,本地跑起完整 TiDB 集群!# 输出:# CLUSTER START SUCCESSFULLY# TiDB: 127.0.0.1:4000 (MySQL兼容端口)# TiKV: 127.0.0.1:20160# PD: 127.0.0.1:2379# TiFlash: 127.0.0.1:3930

就这么简单。一个命令,本地完整集群全部跑起来。用任何 MySQL 客户端连接127.0.0.1:4000就能操作。

生产环境部署拓扑建议

组件最低节点数推荐节点数说明
PD33 或 5奇数个,Raft 选举需要
TiDB12+无状态,按需扩
TiKV33+默认 3 副本,最少 3 节点
TiFlash01+按需部署
监控11Prometheus + Grafana

⚠️提醒:生产环境 PD 和 TiKV 绝对不能部署在同一台机器上——PD 挂了整个集群就瘫痪了,必须独立部署。

三、TiKV 数据存储模块:分布式 KV 的底层密码

这是 TiDB 最核心、也最容易被忽视的一层。很多同学用 TiDB 写了一年 SQL,都不知道底层数据是怎么存的。

TiKV 是 TiDB 的存储核心,也是很多架构师最关心的部分。它的设计细节,直接决定了数据的可靠性和性能。

3.1 核心存储引擎:RocksDB

TiKV 底层基于 RocksDB(优化版的 LevelDB)实现持久化存储,支持高并发的读写和快速的范围查询,完美适配了数据库的存储需求。

3.2 数据分片:Region 机制

TiKV 把数据按连续的 Key 范围分成一个个 Region,每个 Region 就像一个数据分片,默认大小 96MB。比如笔记里的例子,Region1 存储 Key1-Key3,Region2 存储 Key4-Key6,这种分片方式让数据天然具备水平扩展的能力,数据量大了,直接加 TiKV 节点就能扩容。

3.3 强一致保证:Raft 协议

每个 Region 都会有 3 个副本(也可配置 5 副本),组成一个 Raft Group,通过 Raft 协议实现数据的强一致复制。写操作会先写入 Raft 日志,同步到多数副本后才会返回成功,即使某个节点宕机,其他副本也能接管服务,保证数据不丢、服务不中断。

  • Leader负责读写
  • Follower同步复制

📌要点:Region 分裂是自动触发的——当 Region 大小超过阈值,会自动一分为二,PD 会重新调度副本分布。整个过程对业务完全透明。

3.4 并发控制:MVCC

为了支持高并发读写,TiKV 实现了多版本并发控制(MVCC),每个 Key 会保存多个版本的数据,通过版本号区分不同事务的修改。比如 Key1 会保存多个版本的 Value,读操作可以直接读取对应版本的数据,避免了读写阻塞,大幅提升了并发性能。

3.5 数据模型:从表到 KV 的映射

一张 MySQL 表在 TiDB 内部的存储逻辑:

原始表结构:

┌──────────────────────────────────┐ │ User (id INT PK, name VARCHAR) │ ├──────┬───────────┬───────────────┤ │ id │ name │ _tidb_rowid │ ← 隐式主键 ├──────┼───────────┼───────────────┤ │ 1 │ 张三 │ ... │ │ 2 │ 李四 │ ... │ └──────┴───────────┴───────────────┘ ↓ 映射为 KV 对 ↓ Key: t{TableID}_r{RowID} Value: [col1_val, col2_val, ...] 实际存储: Key: t{53}_r{1} → Value: [1, "张三"] Key: t{53}_r{2} → Value: [2, "李四"] 索引的存储: Key: t{53}_i{IdxID}_{col_val}_{RowID} Value: [空]

核心思想:把关系型数据库的表和索引,全部映射成扁平的 Key-Value 键值对。这样不管多复杂的 SQL,到了存储层都是 KV 操作,极度简洁高效。

3.6 Raft 共识协议:怎么保证数据不丢?

这是很多面试必考题,Raft 的流程(在之前课程已讲过,这里不再详细阐述):

三个关键点:

  1. 写请求只走 Leader
  2. 保证写入顺序
  3. 多数派确认才提交(3 副本时,至少 2 个节点确认)
  4. 自动故障转移(Leader 挂了,剩余节点自动重新选举)

四、TiDB SQL 层计算引擎:把 SQL 翻译成 KV 操作

很多人好奇:TiDB 是怎么把 SQL 语句,转换成对 TiKV 的读写操作的?这就要靠 SQL 层的计算引擎了。

1. 数据映射:SQL 表 ↔ KV 键值对

TiDB 会把关系型数据库的表数据,转换成 TiKV 能识别的键值对:

  • 表数据:Key 是t[TableID][RowID],Value 是这一行的列数据,比如上面用户表,张三的记录就会被转换成对应的键值对存储。
  • 索引数据:Key 是t[TableID][IndexID][IndexedColumnsValue],Value 是对应的 RowID,通过索引可以快速定位到数据行。

这种映射方式,让 TiDB 可以用键值存储的方式,模拟出关系型数据库的完整能力。

2. SQL 执行流程:从查询到结果的旅程

我们执行select count(*) from user where name = '张三'为例,拆解一下执行过程:

  1. 构造 KV 范围:根据查询条件,生成对应的 Key 范围,比如匹配name='张三'的索引键范围。
  2. 读取数据:向 TiKV 发送请求,读取范围内的数据。
  3. 过滤与聚合:TiDB 对返回的数据进行过滤,只保留符合条件的记录,再执行count聚合操作。
  4. 返回结果:把最终结果返回给客户端。

这种计算引擎设计,让 TiDB 既支持简单的 CRUD 操作,也能处理复杂的聚合查询,同时兼容 MySQL 的语法和执行逻辑,业务迁移几乎零成本。

五、PD 数据调度模块:集群的 “智能大脑”

PD 作为 TiDB 集群的元数据管理和调度中心,很多人只知道它是 “元数据存储”,却不知道它的调度能力才是 TiDB 的精髓。

1. 核心职责

  • 元数据管理:存储整个集群的节点信息、Region 分布、数据位置,就像集群的 “地图”。
  • 数据调度:根据集群负载、节点状态,自动调整 Region 的分布,比如把热点数据迁移到空闲节点,保证集群负载均衡。
  • Raft 调度:管理 Raft 副本的分布,保证每个 Region 的副本分布在不同节点,避免单点故障,同时自动进行 Leader 负载均衡,让读写请求均匀分布。

2. 调度场景:解决集群的 “疑难杂症”

  • 节点扩容:新增 TiKV 节点时,PD 会自动把其他节点的 Region 迁移过来,无需人工干预。
  • 节点故障:某个 TiKV 节点宕机,PD 会自动把该节点上的副本调度到其他节点,保证副本数量足够。
  • 热点数据:某个 Region 的读写请求过高,PD 会自动拆分 Region,或者把 Leader 迁移到其他节点,缓解压力。

正是有了 PD 的智能调度,TiDB 集群才能实现真正的 “无人值守” 运维,大幅降低了分布式数据库的运维成本。

调度场景触发条件调度动作
Leader 均衡某节点 Leader 过多将部分 Leader 迁移到其他节点
Region 均衡某节点 Region 数量过多将部分 Region 副本迁移走
热点调度某 Region 读写 QPS 过高分裂 Region,分散压力
故障恢复某 TiKV 节点宕机自动在其他节点补副本
扩容均衡新节点加入自动迁移部分 Region 到新节点

六、OLAP 与 TiFlash 列式存储:HTAP 的 “最后一块拼图”

传统数据库的最大痛点,就是 OLTP 和 OLAP 无法兼顾:事务型数据库跑报表慢,分析型数据库无法支持实时写入。而 TiFlash 的出现,让 TiDB 真正成为了一款 HTAP 数据库。

1. 什么是 TiFlash?

TiFlash 是 TiDB 的列式存储引擎,专门为 OLAP 场景优化。它会异步同步 TiKV 的数据,转换成列式存储格式,大幅提升聚合查询、报表分析的性能。

2. 行存 VS 列存:两种存储的核心差异

  • TiKV(行存):按行存储数据,适合事务型业务,快速读写单行数据,比如订单创建、用户信息修改。
  • TiFlash(列存):按列存储数据,适合分析型业务,比如按用户维度统计订单量、按地区分析销售额,列存可以只读取需要的列,大幅减少 IO,提升查询速度。

3. HTAP 场景:一次数据写入,双场景复用

TiFlash 的典型应用场景:

  • 实时报表:业务数据写入 TiKV,TiFlash 自动同步数据,报表查询直接走 TiFlash,无需额外的数据同步和 ETL,报表延迟从小时级降到秒级。
  • 混合负载:业务系统正常进行事务操作,同时支持复杂的分析查询,互不影响,彻底告别 “业务库和报表库分离” 的架构。

七、TiDB 落地场景:这些业务用了都说香

聊完架构和模块,很多人会问:“我的业务到底适不适合用 TiDB?” 结合大厂的落地经验,这几个场景,TiDB 的优势拉满:

OLTP 场景:替代分库分表的 MySQL

业务数据量暴涨,MySQL 单库单表撑不住,分库分表又太麻烦?直接上 TiDB,兼容 MySQL 协议,业务代码几乎不用改,就能获得无限的水平扩展能力,金融交易、电商订单、物流轨迹这类高并发事务场景,都能完美适配。

HTAP 场景:事务 + 分析一体化

电商平台的用户行为分析、金融业务的实时风控、零售行业的销售报表,这类业务既要支持实时交易,又要做复杂分析,TiDB+TiFlash 的组合,直接实现 “一套数据,两种用途”,省去了数据同步、ETL 的成本,还能保证数据的实时性。

数据中台场景:统一的数据底座

企业里多个业务系统的数据孤岛严重,数据中台需要一个统一的存储底座,TiDB 兼容 SQL、支持分布式事务、能对接各种大数据生态,完美适配数据中台的建设需求。

写在最后:TiDB 不是 “银弹”,但它解决了大部分架构难题

从业 15 年,我见过太多架构师为了数据库的瓶颈头疼不已。TiDB 的出现,不是说它能解决所有问题,但它用一套架构,解决了传统数据库的扩容瓶颈、事务一致性、OLTP+OLAP 混合负载的痛点,给了我们一个更优雅的选择。

各位看官,看完 TiDB 的架构设计,不知对你手头项目的高可用、高并发架构优化,是否带来了一些新思路?欢迎在评论区聊聊你的看法~论

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/29 2:59:36

JTAG调试中nTRST信号的作用与连接策略

1. JTAG调试中的nTRST信号解析在嵌入式系统开发中,JTAG接口是调试ARM架构处理器的标准方式。nTRST(TAP Reset)信号作为JTAG接口的可选引脚,常常让开发者困惑是否需要连接。根据ARM官方技术文档和实际工程经验,我将详细…

作者头像 李华
网站建设 2026/5/29 2:57:17

ReAct推理链从Demo到生产:六个必须跨过的工程关卡

一、实验室里的ReAct和生产环境里的ReAct,根本不是同一个东西如果你关注Agent技术,大概率看过不少ReAct的Demo演示——大模型先输出一段Thought,然后调用一个工具,拿到结果后再输出一段新的Thought,几轮循环之后给出一…

作者头像 李华
网站建设 2026/5/29 2:56:21

FastAdmin后台自定义页面实战:从新建控制器到菜单配置的保姆级教程

FastAdmin后台自定义页面实战:从新建控制器到菜单配置的保姆级教程在快速开发后台管理系统的场景中,FastAdmin凭借其丰富的内置功能和灵活的扩展性,成为许多PHP开发者的首选框架。本文将带你从零开始,完整实现一个自定义后台页面的…

作者头像 李华