Raft协议
概念
Raft 是一个分布式一致性算法,被设计为比 Paxos 更易于理解,同时具备相似的性能和安全性。它常用于构建容错的分布式系统,确保多个节点在面对网络分区、节点失效等情况下能够达成一致
核心目标
- Leader选举:通过选举机制确保每个时间段只有一个节点(Leader)负责日志复制和状态变更。
- 日志复制:Leader 将客户端的操作(日志)复制到其他节点(Follower),确保日志的一致性。
- 状态机一致性:通过确保所有节点按相同顺序应用日志,实现一致性。
主要模块
1. 角色
- Leader:负责接收客户端请求,将操作以日志形式写入并同步给 Follower。
- Follower:响应 Leader 的同步请求,被动地接受 Leader 的日志和指令。
- Candidate:在 Leader 失效后,由 Follower 转为 Candidate,通过投票选举自己为新 Leader。
2. 选举过程
- 若 Follower 超时未收到 Leader 的心跳信号,会转为 Candidate 并发起选举。
- 每个节点在选举期间投票给自己,同时请求其他节点投票。
- 如果一个 Candidate 获得了超过半数的投票,则成为 Leader。
3. 日志复制
- Leader 接收到客户端请求后,将其作为日志条目添加到自己的日志中。
- Leader 使用 AppendEntries RPC 将日志复制到 Follower。
- 当多数节点确认日志条目后,Leader 将日志提交,并通知所有节点应用日志到状态机。
4. 一致性保证
- 使用 任期号(Term) 防止陈旧的 Leader 发出无效指令。
- 确保日志条目在所有节点上按照相同顺序出现,避免状态不一致。
扩展:MultiRaft协议
MultiRaft 是 Raft 的一种扩展,旨在支持多个 Raft 实例同时运行,以便在大规模分布式系统中更高效地管理数据分片和分布式事务。
动机
- 单个 Raft 实例在处理大量数据时可能成为瓶颈。
- 在分布式系统中,通常需要对数据进行分区,每个分区由独立的一组节点管理。
- MultiRaft 提供了一种机制,通过运行多个 Raft 实例,每个实例负责一部分数据,从而提高系统的吞吐量和扩展性
核心思想
- 多实例并行运行:
- 每个 Raft 实例管理一个独立的数据分片(shard)。
- 每个实例有自己的 Leader、Follower 和日志,独立运行 Raft 协议。
- 共享底层资源:
- 多个 Raft 实例可以运行在相同的物理节点上,共享网络、存储和 CPU 等资源。
- 使用高效的调度机制协调实例间的资源竞争。
- 动态分片和迁移:
- 数据分片可以动态调整,每个分片由一个 Raft 实例管理。
- 分片可以在节点之间迁移,以应对节点故障或负载不均。
- 跨分片操作:
- 支持分布式事务,需要在多个 Raft 实例之间协调。
- 一般通过两阶段提交(2PC)或共识组间通信来实现。
对比
| 特性 | Raft | MultiRaft |
|---|---|---|
| 目标 | 提供单一一致性机制 | 提供分区一致性机制 |
| 运行实例 | 单个 Raft 集群 | 多个独立的 Raft 集群 |
| 适用场景 | 小规模系统 | 大规模分布式存储或事务场景 |
| 扩展性 | 有限,单点可能成为瓶颈 | 高扩展性,分片机制避免瓶颈 |
| 复杂度 | 较低 | 较高,需要处理跨分片事务 |