背景:解决分布式一致性问题
分布式系统通常由异步网络连接的多个节点构成,每个节点有独立的计算和存储。通常来说,分布式一致性一般指数据的一致性。比如分布式存储系统,通常以多副本冗余的方式实现数据的可靠存储。同一份数据的多个副本必须保证一致,而数据的多个副本又存储在不同的节点中,这里的分布式一致性问题就是存储在不同节点中的数据副本的取值必须一致。
分布式一致性Paxos算法
Paxos算法就是如何快速正确的在一个分布式系统中对某个数据的值达成一致,并且保证不论发生任何异常,都不会破坏整个系统的一致性。
注: 这里某个数据的值并不只是狭义上的某个数,它可以是一条日志,也可以是一条命令,根据应用场景不同,某个数据的值有不同的含义。
目标:
在分布式环境下确定一个值,这个值被所有节点承认。 Paxos算法需要解决的问题就是如何在一个可能发生机器宕机或网络异常(包括消息的延迟、丢失、重复、乱序,还有网络分区)的分布式系统中,快速且正确地在集群内部对某个数据的值达成一致,并且保证不论发生以上任何异常,都不会破坏整个系统的一致性。
角色:
Paxos将系统中的角色分为提议者 (Proposer),决策者 (Acceptor),和最终决策学习者 (Learner):
- Proposer: 提出提案 (Proposal)。Proposal信息包括提案编号 (Proposal ID) 和提议的值 (Value)。
- Acceptor: 参与决策,回应Proposers的提案。收到Proposal后可以接受提案,若Proposal获得多数Acceptors的接受,则称该Proposal被批准。
- Learner: 不参与决策,Proposers/Acceptors学习最新达成一致的提案(Value)。
在具体的实现中,一个进程可能同时充当多种角色。比如一个进程可能既是Proposer又是Acceptor又是Learner。
流程:
Prepare阶段:
- Proposer选择一个提案编号n并将prepare请求发送给 Acceptor。
- Acceptor收到prepare消息后,如果提案的编号大于它已经回复的所有prepare消息,则Acceptor将自己上次接受的提案回复给Proposer,并承诺不再回复小于n的提案。
Accept阶段:
- 当一个Proposer收到了多数Acceptor对prepare的回复后,就进入批准阶段。它要向回复prepare请求的Acceptor发送accept请求,包括编号n和根据prepare阶段决定的value(如果根据prepare没有已经接受的value,那么它可以自由决定value)。
- 在不违背自己向其他Proposer的承诺的前提下,Acceptor收到accept请求后即接受这个请求。
raft算法
Paxos 算法虽然给出了共识设计,但并没有讨论太多实现细节,也并不重视工程上的优化,因此后来在学术界和工程界出现了一些改进工作,包括 Fast Paxos、Multi-Paxos,Zookeeper Atomic Broadcast(ZAB)和 Raft 等。这些算法重点在于改进执行效率和可实现性。
raft算法基于paxos,但更易理解、易论证、易实现,提高了工程实践性。 Raft和Paxos一样只要保证超过半数的节点正常就能够提供服务。
raft算法引入了领导者角色 ,通过先选出领导节点来简化流程和提高效率。每个任期内选举一个全局的领导者。领导者角色十分关键,决定日志(log)的提交。每个日志都会路由到领导者,并且只能由领导者向跟随者单向复制。
角色:
- 领导者(Leader)
- 候选者(Candidate)
- 候选者(Candidate)
核心原理:
Raft算法的核心原理包括三个关键组件:领导者选举、日志复制和安全性。
- 领导者选举:
每个节点在任意时刻可能处于三种状态之一:领导者(leader)、跟随者(follower)和候选者(candidate)。
初始情况下,所有节点都是跟随者。如果一个跟随者在一段时间内没有收到来自领导者的心跳消息,它会转变为候选者并开始选举过程。
候选者会向其他节点发送投票请求,并在收到多数节点的选票后成为新的领导者。
如果在选举过程中出现多个候选者获得相同票数的情况,那么会进行新一轮的选举,直到只有一个候选者获胜。 - 日志复制:
Raft算法使用日志来记录系统中的所有操作。每个节点都有一个日志,其中包含一系列的日志条目。
当客户端向领导者发送写请求时,领导者会将该请求作为一个新的日志条目追加到自己的日志中,并向其他节点发送日志复制请求。
其他节点收到复制请求后,会将该日志条目追加到自己的日志中,并向领导者发送确认消息。
一旦领导者收到多数节点的确认消息,该日志条目被视为已提交,并将其应用到状态机中执行相应操作。 - 安全性:
Raft算法通过多数投票机制来确保系统的安全性。任何一条已提交的日志条目都必须在多数节点上复制和执行,才能保证数据的一致性。
如果一个节点成为领导者,并开始复制日志条目,但在复制完成之前失去了领导者地位,那么新的领导者将继续复制剩余的日志条目。
如果一个节点在复制过程中发现自己的日志与领导者的日志不一致,它将回退到领导者的日志状态,并重新进行复制。
总的来说,Raft算法通过领导者选举、日志复制和安全性机制,实现了分布式系统中的一致性和可靠性。它的设计简单易懂,易于实现,并且提供了强一致性保证。
选举过程:
- 初始状态下,所有节点都是跟随者(Follower)状态。
- 如果一个跟随者在一段时间内没有收到来自领导者(Leader)的心跳消息,它会转变为候选者(Candidate)并开始选举过程。
- 候选者向其他节点发送投票请求,并请求其他节点投票给自己。
- 其他节点在收到投票请求后,如果还没有投票给其他候选者,且候选者的日志更新且比自己的日志新,就会投票给候选者。
- 如果候选者收到了多数节点的选票(包括自己的一票),那么它就成为新的领导者。
- 如果在选举过程中出现多个候选者获得相同票数的情况,那么会进行新一轮的选举,直到只有一个候选者获胜。
通过以上步骤,Raft 算法实现了分布式系统中的领导者选举机制,确保系统能够选出稳定的领导者来协调其他节点的操作。