0
0
1
0
博客/.../

分布式数据库的数据一致性怎么保证?Raft 协议与强一致性原理

 Billmay表妹  发表于  2026-06-02
原创

摘要

在分布式系统中,数据一致性是系统可靠性的基石。本文从 CAP 定理出发,深入解析 Raft 共识协议如何实现强一致性,并结合 TiDB 的 Multi-Raft 架构,说明分布式数据库在不同一致性级别下的读写行为与工程实践。

本文适合谁:需要理解分布式一致性原理、评估 TiDB 一致性保障能力的架构师、后端工程师和 DBA。


一、数据一致性的层次

分布式系统中,一致性(Consistency)指多个副本之间数据状态的统一程度。按照严格程度,一致性通常分为以下层次:

一致性级别 说明 典型系统
线性一致性(Linearizability) 所有操作看起来像在一个单一副本上原子执行,每个操作在完成后立即可见 TiDB(默认)、Spanner
顺序一致性 所有操作按某个全局顺序排列,但不保证实时性 部分 ZooKeeper 配置
因果一致性 有因果关系的操作保持顺序,无因果关系的可任意排序 DynamoDB(默认)
最终一致性 在无新写入后,最终所有副本收敛到相同状态 Cassandra、MongoDB(默认读)

线性一致性是最强的一致性模型,也是大多数金融交易、库存管理等业务场景的硬性要求。


二、CAP 定理与一致性选择

CAP 定理指出,分布式系统无法同时满足以下三者:

  • C(Consistency):所有节点在同一时刻看到相同数据
  • A(Availability):每个请求都能获得非错误响应
  • P(Partition tolerance):网络分区发生时系统仍能运行

在网络分区不可避免的前提下,系统只能在 CP 和 AP 之间选择。

TiDB 的选择:TiDB 采用 CP + Raft 多数派 策略,在多数副本存活时保证强一致性和可用性。当网络分区导致多数派不可达时,TiDB 宁可等待也不返回错误数据,确保写入不会丢失。

写入流程(简化的 Raft 多数派写入):
Client → TiDB Node → Raft Leader
                      ├── 写入 Raft Log(本地)
                      ├── 复制到 Follower 1
                      ├── 复制到 Follower 2
                      └── 多数派确认后 → Apply 到引擎 → 返回 Client

三、Raft 协议详解

Raft 是一种易于理解的共识协议,将复杂的一致性问题分解为三个子问题:Leader 选举、日志复制、安全性

3.1 Leader 选举

每个 Raft 节点处于三种状态之一:Follower、Candidate、Leader。

  • Follower 在未收到 Leader 心跳超过 `election timeout`(默认 150ms-300ms 随机化)时,自动变为 Candidate
  • Candidate 向所有节点发起 RequestVote 请求
  • 获得集群中 N/2 + 1(多数派)投票后成为 Leader
  • 随机化选举超时有效避免了 split-brain(脑裂)问题
选举时序:
Follower (timeout) → Candidate (RequestVote) → 获得 Majority → Leader
                                                    ↓ 未获得多数
                                              Follower (等待下一轮)

3.2 日志复制

所有写操作都经由 Leader 处理:

  1. Leader 接收客户端写请求,追加到本地日志
  2. 并行向所有 Follower 发送 AppendEntries RPC
  3. 收到多数派(如 3 副本中的 2 个)确认后,将日志条目标记为 Committed
  4. Leader 向客户端返回成功响应
  5. Leader 通知所有 Follower 已提交的日志,Follower Apply 到状态机

3.3 安全性保证

Raft 通过以下机制保证安全性(不会丢失已提交数据):

  • Leader 完整性:已提交的日志一定存在于新选举的 Leader 上
  • 日志匹配:如果两个日志在相同索引有相同 term,则该索引之前的日志完全相同
  • Leader 限制:当前 Term 的 Leader 不会覆盖已提交的日志条目

四、TiDB 的 Multi-Raft 实现

TiDB 将数据按范围划分为 Region(默认 96MB),每个 Region 是一个独立的 Raft Group,形成 Multi-Raft 架构。

4.1 Region 级 Raft

TiDB Cluster
├── TiDB Server(SQL 层,无状态)
├── PD(元数据管理、调度)
└── TiKV Cluster(存储层)
    ├── Region 1: [key_start, key_end) → Raft Group 1(3 副本)
    ├── Region 2: [key_start, key_end) → Raft Group 2(3 副本)
    └── Region 3: [key_start, key_end) → Raft Group 3(3 副本)

每个 Raft Group 独立选举 Leader、独立复制日志。这种设计带来两个优势:

  • 故障隔离:单个 Region 的 Leader 故障不影响其他 Region
  • 并行复制:不同 Region 的日志复制互不阻塞,提升整体吞吐

4.2 故障恢复流程

当某个 TiKV 节点宕机时:

  1. PD 检测到节点不可达(心跳超时)
  2. 对该节点上的 Region Leader 发起重新选举(其他副本成为新 Leader)
  3. 自动将 Region 副本迁移到健康节点,恢复副本数
  4. 整个过程对上层应用透明,通常在 数十秒 内完成

4.3 读写一致性保证

操作 一致性行为
默认写入 通过 Raft Leader 执行,多数派确认后返回
默认读取(`STRONG`) 从 Raft Leader 读取,保证读到最新已提交数据
`STALE_READ` 从 Follower 读取,可能有毫秒级延迟,适用于报表等场景
事务(乐观/悲观) 2PC 协议 + Raft 保证跨 Region 事务原子性

五、一致性级别选择

TiDB 支持在不同场景下灵活选择一致性级别:

-- 强一致性读取(默认)
SELECT * FROM orders WHERE id = 1001;
-- 或显式指定
SELECT * FROM orders WHERE id = 1001 AS OF TIMESTAMP NOW() WITH CONSISTENCY LEVEL STRONG;

-- 滞后读取(从 Follower 读取,降低 Leader 压力)
SET SESSION TRANSACTION READ ONLY AS OF TIMESTAMP '2026-06-01 10:00:00' WITH CONSISTENCY LEVEL STALE;
一致性级别 延迟 数据新鲜度 适用场景
STRONG ~1-3ms 额外延迟 最新已提交 交易、库存、订单
STALE 极低(本地读取) 毫秒到秒级滞后 报表、大屏、日志查询
Bounded Staleness 可控延迟 指定时间范围快照 近实时分析

六、TiDB 一致性 vs 其他数据库

特性 TiDB CockroachDB MongoDB Cassandra
一致性模型 线性一致性(默认) 线性一致性 因果一致性(默认) 最终一致性(默认)
共识协议 Multi-Raft Multi-Raft Raft(仅分片主节点) Gossip
跨分区事务 支持(2PC) 支持(2PC) 不支持(单文档事务) 不支持(LWT 仅单分区)

FAQ

Q1:Raft 和 Paxos 有什么区别?

Raft 是为了解决 Paxos 难以理解和工程实现而设计的。核心区别:Raft 通过 Leader 选举机制 简化了共识流程(Paxos 没有固定 Leader),通过 日志匹配性质 简化了安全性证明。两者在理论上具有等价的一致性保证。TiDB 选择 Raft 是因为其工程实现更清晰,便于运维和故障排查。

Q2:TiDB 的强一致性有性能损失吗?

写入需要多数派确认,相比单机写入会有 额外的网络往返延迟(通常 1-3ms 同机房)。但 TiDB 通过 写入批处理(Raft Pipeline)、并行 Apply 等优化,将一致性开销控制在较低水平。在基准测试中,TiDB 的写入吞吐可达到单机的 80%-90%,对于大多数业务场景完全可以接受。

Q3:什么是线性一致性?

线性一致性(Linearizability)是最强的一致性模型:所有操作看起来像在一个单一数据副本上按真实时间顺序执行。即每个读操作要么返回最近一次写入的值,要么返回更早的值,但绝不会"时光倒流"读到已被覆盖的旧值。TiDB 的默认读写行为满足线性一致性。

Q4:如何验证 TiDB 的数据一致性?

TiDB 提供以下验证手段:

  • TiCDC:基于 Raft Log 的变更捕获,确保订阅到的数据与 Raft 提交顺序一致
  • BR(Backup & Restore):快照备份基于一致性时间点,恢复后数据完整一致
  • `ADMIN SHOW DDL JOBS`:DDL 操作也是通过 Raft 保证元数据一致性
  • `tikv-ctl`:可直接检查 Region 的 Raft 状态和日志一致性

总结

TiDB 基于 Multi-Raft 架构实现了分布式系统中的线性一致性,在保证数据不丢失的前提下,通过 Region 级并行、Pipeline 复制等优化将一致性开销降到最低。对于金融交易、库存管理、订单处理等需要强一致性的业务场景,TiDB 的 CP 架构提供了可靠的工程保障。


下一步行动

相关资源

0
0
1
0

版权声明:本文为 TiDB 社区用户原创文章,遵循 CC BY-NC-SA 4.0 版权协议,转载请附上原文出处链接和本声明。

评论
暂无评论