【分布式核心】分布式一致性算法-Paxos、Raft、ZAB、Gossip
一致性算法的定义
一致性的分类
-
强一致性 -
说明:保证系统改变提交以后立即改变集群的状态。 -
模型: -
Paxos -
Raft(muti-paxos) -
ZAB(muti-paxos) -
弱一致性 -
说明:也叫最终一致性,系统不保证改变提交以后立即改变集群的状态,但是随着时间的推移最终状态是一致的。 -
模型: -
DNS系统 -
Gossip协议
一致性算法实现举例
-
Google的Chubby分布式锁服务,采用了Paxos算法 -
etcd分布式键值数据库,采用了Raft算法 -
ZooKeeper分布式应用协调服务,Chubby的开源实现,采用ZAB算法
Paxos算法
-
概念介绍
-
Proposal提案,即分布式系统的修改请求,可以表示为[提案编号N,提案内容value] -
Client用户,类似社会民众,负责提出建议 -
Propser议员,类似基层人大代表,负责帮Client上交提案 -
Acceptor投票者,类似全国人大代表,负责为提案投票,不同意比自己以前接收过的提案编号要小的提案,其他提案都同意,例如A以前给N号提案表决过,那么再收到小于等于N号的提案时就直接拒绝了 -
Learner提案接受者,类似记录被通过提案的记录员,负责记录提案
-
Basic Paxos算法 -
步骤
-
Propser准备一个N号提案 -
Propser询问Acceptor中的多数派是否接收过N号的提案,如果都没有进入下一步,否则本提案不被考虑 -
Acceptor开始表决,Acceptor无条件同意从未接收过的N号提案,达到多数派同意后,进入下一步 -
Learner记录提案
-
节点故障 -
若Proposer故障,没关系,再从集群中选出Proposer即可 -
若Acceptor故障,表决时能达到多数派也没问题 -
潜在问题-活锁 -
假设系统有多个Proposer,他们不断向Acceptor发出提案,还没等到上一个提案达到多数派下一个提案又来了,就会导致Acceptor放弃当前提案转向处理下一个提案,于是所有提案都别想通过了。 -
Multi Paxos算法 -
根据Basic Paxos的改进:整个系统只有一个Proposer,称之为Leader。 -
步骤
-
若集群中没有Leader,则在集群中选出一个节点并声明它为第M任Leader。 -
集群的Acceptor只表决最新的Leader发出的最新的提案 -
其他步骤和Basic Paxos相同
-
算法优化
Multi Paxos角色过多,对于计算机集群而言,可以将Proposer、Acceptor和Learner三者身份集中在一个节点上,此时只需要从集群中选出Proposer,其他节点都是Acceptor和Learner,这就是接下来要讨论的Raft算法
Raft算法
-
说明:Paxos算法不容易实现,Raft算法是对Paxos算法的简化和改进 -
概念介绍
-
Leader总统节点,负责发出提案 -
Follower追随者节点,负责同意Leader发出的提案 -
Candidate候选人,负责争夺Leader
-
步骤:Raft算法将一致性问题分解为两个的子问题,Leader选举和状态复制 -
Leader选举
-
每个Follower都持有一个定时器
-
状态复制
-
Leader负责接收来自Client的提案请求(红色提案表示未确认)
ZAB算法
-
说明:ZAB也是对Multi Paxos算法的改进,大部分和raft相同 -
和raft算法的主要区别:
-
对于Leader的任期,raft叫做term,而ZAB叫做epoch -
在状态复制的过程中,raft的心跳从Leader向Follower发送,而ZAB则相反。
Gossip算法
-
说明:Gossip算法每个节点都是对等的,即没有角色之分。Gossip算法中的每个节点都会将数据改动告诉其他节点(类似传八卦)。有话说得好:"最多通过六个人你就能认识全世界任何一个陌生人",因此数据改动的消息很快就会传遍整个集群。 -
步骤:
-
集群启动,如下图所示(这里设置集群有20个节点)