1.分布式一致性协议
两阶段提交2PC
三阶段提交3PC
Paxos算法
Multi Paxos
EPaxos
Fast Paxos
Raft算法
ZAB算法
2.拜占庭将军问题
拜占庭帝国疆域辽阔,有众多军队。为了防御的目的,这些军队驻扎在不同的区域,彼此之间只能通过信使进行通讯。在打战的时候,为了更好的赢得胜利,拜占庭军队内所有的将军必须达成一致的共识,执行相同的行动计划。但是信使可能是奸细,也可能叛变,篡改信件影响将军们的决定。在这种条件下,有没有办法让将军们达成一致的共识?
拜占庭将军问题的提出是为了说明在分布式系统中通过不可靠的信道无法达成一致性状态。
分布式系统通常部署在局域网中,在没有被攻破的情况下消息不会被篡改,通过数据校验算法可以很容易实现消息的完整性和正确性,所以在局域网中可以认为通讯信道是可靠的,局域网中的分布式系统不存在“拜占庭将军问题”。
3.Paxos算法
Paxos算法是一个一致性算法,可以提高分布式系统的容错性,让分布式系统达到数据一致性。
3.1 Paxos算法有三种角色
Proposer:提案者
Acceptor:表决者
Learner:同步者
同一个节点可以承担三种角色,在三个角色之间切换
3.2 Paxos算法的基本要求
- 提案编号需要全局维护,并保证全局唯一和递增;
- 每个提案者在提出提案时,要为这个提案先获取一个新的提案编号;
- 每个表决者在accept某提案后,要将该提案的提案编号N记录在本地,这些已经被accept的所有提案的最大提案编号假设为maxN。每个表决者只会accept编号大于自己本地记录的maxN的提案;
- 在众多提案中只有一个提案被选中;
- 一旦一个提案被选中,其他服务器会主动将这个提案同步(Learn)到本地;
- 如果没有提案被提出,就没有提案被选中。
3.3 Paxos算法的执行过程
分为两个阶段:
一、准备阶段,prepare
二、接受阶段,accept,包含commit
prepare(N)表示编号为N的提案的预处理请求。
proposal(myid,N,value)表示编号为N,值为value的提案的接受请求。
准备阶段的执行过程
(1)提案者先准备一个编号为N的提案,然后向所有的表决者发送prepare(N)请求,用于试探集群是否支持这个编号的提案。
(2)每个表决者接受到prepare(N)请求后,与自己本地记录的maxN进行比较,然后按照以下几种方式处理:
(a)如果N<maxN,这个提案已经过期,表决者拒绝接受这个prepare(N)请求,向提案者不发送响应,或者向提案者发送错误响应。
(b)如果N>maxN,表决者可以接受这个提案,首先将这个提案编号N记录下来(假设存储在preN中),然后向提案者发送响应,响应的内容为已经接受的编号最大的提案Proposal(myid,maxN,value)。表决者保证之后收到其他比N小的编号为N2的提案的prepare(N2)和accept(N2)请求时,都会拒绝。
(c)不可能相等,提案编号是全局维护的,每次获取提案编号时都会增加。
接受阶段的执行过程
(1)当提案者发出prepare(N)的请求后,如果收到半数以上的表决者通过的反馈,然后提案者向所有的表决者发送提案的proposal(myid,N,value)接受请求。
(2)表决者接受到proposal(myid,N,value)请求后,首先与本地记录的maxN和preN进行比较,如果N>maxN && N>=preN,则accept这个提案,向提案者发送成功响应;否则拒绝这个提案,向提案者不发送响应,或者向提案者发送错误响应。
(3)若提案者没有接受到超过半数的成功反馈,提案者放弃提案并终止操作,或者提案者获取新的提案编号N2,重新进入prepare阶段。
(4)若提案者接收到超过半数的成功反馈,向外广播提交信息:
向成功反馈(即accept该提案的接受请求)的表决者发送提交请求(可执行数据同步信号),即通知这些表决者执行接受到的提案。
向未成功反馈的表决者发送“提案+提交”请求,即通知这些表决者执行这个提案。
在prepare阶段比较了N和maxN,在accept阶段为什么还要比较一次?
如果在accept阶段不进行比较,当两个提案相继发出时,集群都会接受,从而不符合“在众多提案中只有一个提案被选中”的基本要求。
3.4 Paxos算法存在活锁问题
如果提案者发起的提案被表决者拒绝后,不放弃发起提案,继续获取新的编号再次发起提案。当有多个提案者都发起提案时,在极端情况下会陷入死循环。
Fast Paxos算法只允许一个进程能发起提案,通过这解决了Paxos算法的活锁问题。
Paxos算法在实际工程应用中存在诸多不便,为了更好的实现,基于Paxos算法做了一些改进,出现了Multi Paxos、Fast Paxos、EPaxos算法等。
参考资料
《从Paxos到Zookeeper分布式一致性原理与实践》 电子工业出版社 倪超