Raft
Raft是一种分布式一致性协议,用于在计算机集群中实现容错的状态机复制。Raft协议的设计目标是简化流程,提高可理解性,同时保证安全性和活性。Raft协议将一致性问题分解为几个关键阶段:
- 领导者选举:集群中的每个节点可以处于三种状态之一:领导者、跟随者或候选者。每个节点都有一个递增的任期号,用于标识当前的选举轮次。当一个跟随者在一段时间内没有收到领导者的心跳消息时,它会认为领导者已经失效,自增任期号,转变为候选者,并向其他节点发送投票请求。当一个候选者收到大多数节点的投票时,它就成为新的领导者,并向其他节点发送心跳消息。当一个节点收到更高任期号的消息时,它会更新自己的任期号,并转变为跟随者。
- 日志复制:领导者负责接收客户端的更新请求,并将其作为日志条目追加到自己的日志中。然后,领导者向其他节点发送附带日志条目的附加消息,要求他们复制日志。当领导者确定一个日志条目被安全地复制到大多数节点时,它就将该条目提交,并应用到状态机中,然后返回结果给客户端。如果某个跟随者落后于领导者或与之不一致,领导者会根据每个跟随者维护的下一条日志索引来调整发送的日志条目,直到达成一致。
- 安全性:Raft协议保证了以下安全性条件:(1)如果一个日志条目在某个任期被提交,那么它在之后的任期也不会被覆盖。(2)如果一个节点成为某个任期的领导者,那么它必须包含该任期之前所有已提交的日志条目。(3)如果两个节点包含相同索引和任期号的日志条目,那么他们之前的所有日志条目也必须相同。(4)如果一个节点已经应用了某个索引处的日志条目到状态机中,那么其他节点不会在该索引处应用不同的日志条目。为了满足这些条件,Raft协议采用了以下策略:(1)每个节点只会在每个任期投一票,并且只会投给包含自己已知最新日志条目的候选者。(2)领导者只会追加新的日志条目,并且不会删除或修改已有的日志条目。(3)当一个新领导者被选出时,它会强制其他节点与自己保持日志一致。
特点
Raft协议的优点和缺点如下:
优点:
- Raft协议比Paxos算法更容易理解,容易实现。它强化了leader的地位,把整个协议可以清楚地分割成两个部分:leader在时,由leader向follower同步日志;leader失效了,选一个新leader,利用选举算法和日志的连续性做了一些简化。
- Raft协议与Paxos算法一样高效,效率上Raft等价于multi-Paxos。它适用于permissioned systems (私有链),只能容纳故障节点(CFT),不支持作恶节点。最大的容错故障节点是 (N-1)/2,其中 N 为集群中总的节点数量。
- Raft协议使用了随机化的选举超时时间和等待时间,来尽可能地避免选举碰撞和死锁,提高选举效率和成功率。它还使用了任期号和日志索引来保证日志的一致性和安全性,避免过期或冲突的消息。
缺点:
- Raft协议只适用于permissioned systems (私有链),只能容纳故障节点 (CFT),不容纳作恶节点。如果有恶意节点篡改或伪造消息,Raft协议无法检测和阻止。
- Raft协议依赖于leader的存在和稳定性,如果leader频繁变更或出现网络分区,Raft协议的性能和可用性会受到影响。同时,leader也是一个性能瓶颈,因为它要处理所有的客户端请求和日志复制。
- Raft协议在日志复制时采用了同步阻塞的方式,即leader要等待大多数follower确认日志条目后才能提交并应用到状态机中。这样会增加系统的延迟和负载,降低吞吐量。