3.5 与Paxos算法的区别

Paxos在维持领导者选举或者变量修改一致性上,采取一种类似议会投票的过半同意机制,比如设定一个领导者,需要将此看做一个议案,征求过半同意,每个节点通过一个议案会有编号记录,再次收到此领导者的不同人选,发现已经有编号记录便驳回,最后以多数通过的结果为准。

我们举个简单的例子,来阐述一下Paxos的基本思想:

假设我们有5台计算机A、B、C、D、E,每台计算机保存着公司CEO的信息,现在CEO任期到了,需要进行新一界选举了。

A计算机发起一个选举议案,提议CEO为“张三”,如果没有其他候选人议案,也没有网络问题,只要其中半数以上计算机收到并通过议案,那么最终“张三”当选CEO。

由于是分布式环境,并发请求、机器故障、网络故障等问题是常态,如果A和E同时提交选举议案,A提名“张三”,E提名“李四”,那么肯定会涉及多计算机的一致性问题了:

假设A、B、C先收到A的议案,D、E先收到E的议案,那么A继续提交给D时,D告诉它已经先收到E的议案了,因此驳回了A的请求。同样E继续提交给A、B、C时也碰到相同的问题。我们可以通过“在每台计算机同时接受议案提交时设置一个编号,编号先的通过,编号后的驳回”的方式来实现。

议案提交上去后,发现A、B、C投票“张三”为CEO,D、E投票“李四”为CEO,少数服从多数,因此最后结果为“张三”当选CEO。

3.5 与Paxos算法的区别 - 图1

图3-2 Paxos算法示意图

如果是C计算机发生了网络问题或者故障,双方投票相同,那么选举无法完成。

如果C计算机发生了网络问题或者故障,A、B、D投票“张三”,E投票“李四”,那么结果为“张三”当选,而C对于这些情况一无所知,但是当C计算机恢复正常时,他会发起一个“询问谁是CEO”的议案获取最新信息。

简言之,Paxos对每个节点的并发修改采取编号记录的方式保持一致性,对多个节点的并发修改采取少数服从多数的方式保持一致性。Paxos有点类似分布式二阶段提交方式,但是又不同,二阶段提交不能是多数节点同意,必须是全部同意。为了遵守过半节点同意的约束,Paxos算法往往要求节点总数为奇数。

Fourinone选取领导者采取的是一种谦让方式,集群中节点会先询问其他节点是否愿意当领导者,没人愿意它才担任;如果已经有了领导了,那它就谦让;正因为大家都谦让,不互相争抢,领导者之间能避免冲突保持一致性。一旦确定了领导者,就只跟该领导者打交道,所有对变量的操作都是通过领导者进行,不会再去操作其他候选节点,操作结果由领导者统一同步到候选节点,跟上面Paxos算法保证一致性的方式是不一样的,Paxos算法会去访问和操作所有节点征求同意,最后以多数节点的结果生效。

到此,我们可以想像一下基于Paxos方式的实现难度和工作量,Fourinone在领导者选举和一致性上要更加简化和直接。