一、存储架构与 Raft 日志管理
TiKV 采用分层存储架构实现 Raft 协议的高效运作,其核心设计围绕 RocksDB 引擎构建。每个 TiKV 节点部署两个独立 RocksDB 实例:
-
raftdb:专用于存储 Raft 日志条目,采用顺序写入模式优化日志追加性能。每个 Region 对应独立的 Raft 日志流,通过逻辑隔离保证不同 Region 的日志独立性。
-
kvdb:存储用户数据及元信息,包含四个关键 Column Family:
- raft 列族:记录 Region 元数据(如副本分布、状态机版本),采用低频率更新策略以减少 IO 压力。
- lock 列族:管理分布式事务锁,通过内存锁表与持久化存储结合实现悲观锁的快速获取与释放。
- write 列族:存储事务提交记录,采用 MVCC 机制维护版本链以实现高效的历史版本查询。
- default 列族:保存用户实际数据,通过 Key 编码策略实现 Region 内数据的局部性优化。
日志持久化过程采用双阶段提交机制:先将日志写入 raftdb 的 WAL(Write-Ahead Log),随后异步提交至 kvdb。此设计在保证数据一致性的同时,通过分离日志与数据 IO 路径提升并发吞吐。
二、Raft 状态机核心工作流程
2.1 Leader 选举与心跳机制
TiKV 实现 Raft 选举优化策略:
- 预投票阶段:候选节点在发起正式选举前广播预投票请求,避免因网络分区导致无效 Leader 产生。
- 动态心跳超时:根据集群负载动态调整心跳间隔(默认 2s),在节点恢复时快速触发选举以缩短不可用时间。
- Leader 优先级调度:PD(Placement Driver)维护节点健康度评分,优先选择低负载节点作为 Leader 候选,实现负载均衡。
2.2 日志复制与提交
日志复制过程采用流水线优化:
- 并行发送:Leader 节点将日志条目分批发送至 Follower,利用 gRPC 流式接口减少 RTT 开销。
- 乱序确认:Follower 采用异步写入模式,允许乱序确认日志条目,通过日志索引连续性检查保证最终一致性。
- 批量提交:当多数节点确认某日志索引后,Leader 触发批量提交指令,将连续日志区间一次性应用到状态机。
2.3 成员变更与配置切换
TiKV 实现 Joint Consensus 算法处理成员变更:
- 两阶段提交:先将集群切换至新旧配置共存的中间状态,待新配置稳定后再完全切换,避免脑裂风险。
- 自动驱逐机制:对于长时间无响应的节点,Leader 自动发起配置变更提案将其移出集群,由 PD 触发副本补充。
三、Multi-Raft 机制实现
3.1 Region 与 Raft Group 管理
- 动态分裂策略:当 Region 大小超过阈值(默认 512MB),触发 Split 操作生成子 Region。分裂点选择基于 Key 分布热点检测,避免产生过大范围查询。
- 共享线程池:所有 Raft Group 共享全局线程池,通过优先级队列调度不同 Region 的 IO 请求。关键系统操作(如 Leader 转移)享有更高调度优先级。
- 局部性优化:将同一物理节点上的多个 Region 副本分配到不同磁盘路径,利用 NUMA 绑定减少跨核访问延迟。
3.2 跨 Region 事务协调
- 事务路由缓存:TiDB Server 维护 Region 路由表,将事务涉及 Key 预先映射到目标 Region,减少 PD 元数据查询次数。
- 并行提案:跨 Region 事务拆分为多个单 Region 提案并行提交,通过 2PC 协议保证原子性。每个参与者 Region 独立执行 Prepare 阶段,由协调者统一触发 Commit。
四、性能优化关键技术
4.1 日志存储优化
- Raft Engine 替代方案:新一代日志引擎采用 LSM-tree 优化结构,相比原生 RocksDB 减少 50% 写放大。通过分离日志索引与数据块,实现快速日志检索。
- 异步快照生成:后台线程定期生成增量快照,使用 zstd 压缩算法将快照体积降低至原始数据的 30%。传输过程采用分块校验机制,支持断点续传。
4.2 网络传输优化
- Batch Pipeline:将多个日志条目合并为单个网络包发送,头部携带元数据描述包内条目区间,接收方并行解析。
- 零拷贝传输:日志数据在内存中保持序列化格式,网络层直接传输原始字节,避免序列化 / 反序列化开销。
五、容错与恢复机制
5.1 故障检测与恢复
- 自适应心跳:Follower 节点动态计算 Leader 平均心跳间隔,在超时阈值(3 倍平均间隔)内未收到心跳则触发选举。
- 快速数据修复:宕机节点重启后,优先从 Leader 拉取缺失日志(而非全量快照),通过 Log GC 机制清理已提交日志。
5.2 脑裂防护
- 租约机制:Leader 节点在心跳中携带租约有效期(通常为 10 个心跳周期),Follower 在租约期内拒绝其他候选者的选举请求。
- epoch 校验:每个配置变更递增 epoch 值,处理请求时校验 epoch 有效性,拒绝过期配置的提案。
六、与 PD 协同工作机制
PD 通过 Raft 协议维护集群元数据,与 TiKV 形成双层共识体系:
- 负载反馈环:TiKV 节点定期上报 Region 负载指标(QPS、磁盘利用率等),PD 根据全局视图生成调度指令。
- 热点疏散策略:当检测到某 Region 的 Leader 处理请求超过阈值(如 10 万 QPS),PD 触发 Leader 迁移至低负载节点。
- 副本均衡算法:基于 CRUSH 算法将 Region 副本分散到不同故障域,同时考虑节点硬件差异(SSD 与 HDD 混合部署场景)。