简介
Paxos是分布式协议的标准,由美国大佬莱斯利·兰伯特提出(2013年图灵奖,现在在微软研究院,学术软件laTex开发者)。Paxos是即使基于不可靠网络也能实现分布式服务器共识一致性的算法。分布式一致性(Distributed consenseus)不再阐述。
不过Paxos不仅仅复杂难以理解,同时也很难在工程上实现,即使强如Google,它完成的分布式锁系统Chubby(作为Paxos的实现)也曾经遭遇到许多的坑。而Raft,《InSearch of an Understandable Consensus Algorithm》,则是一个更加可实现的新的分布式协议,它从设计之初就以可理解性作为准则之一。是更加容易理解,实现的分布式一致性算法。
角色
分布式架构中,需要有一个主服务器(master)来管理其他的从服务器,统一他们的信息和状态,每一个节点,即一个服务器,虽然功能大体相同,但是都应该有各自的角色属性,或者说角色状态。在Raft中,每个服务器都可以扮演三种角色:
- Leader
处理所有的客户端的交互,日志的复制等,一般只有一个Leader。
- Candidate
当不存在一个Leader时,可以成为一个Candidate(候选者),来竞选成为Leader。
- Follower
存在一个已知的Leader时,其他的节点将会自动成为Follower听从Leader指挥。
选举
即推选一个Leader过程,当集群中不存在一个Leader时,就会有Follower成为候选者并开始选举。成为Leader需要候选者得到半数以上的票,为了以容错方式达成一致,我们不可能要求所有服务器100%都达成一致状态,只要超过半数的大多数服务器达成一致就可以了,假设有N台服务器,N/2 +1就超过半数,代表大多数了。
投票
每一个节点都存在一个Timeout,当一个节点的Timeout到达时,若此时没有Leader,则它将成为一个候选者,并向其他的节点发出投票请求,当它获得的票数大于N/2 +1时,该节点将当上Leader,此时Leader向其他节点发出心跳包,告诉其他节点它已当选Leader,并重置其他节点的Timeout。只要Leader不掉线,网络通畅,心跳包将持续发送到其他的Follower并重置他们的Timeout, 这样不会有下一个Candidate出现。注意,每一次重置的Timeout是范围内随机的一个值,这样能够制造’先后’。
多个候选者同票
每个节点都有一个随机的Timeout,并且候选者发出投票请求后也会重置其它Follower的Timeout(即投票过的节点不太可能再在这一次选举中成为候选者),但是仍然有可能有多个候选者同时产生并发出请求。此时先达到半数投票的候选者会成为新的Leader,若候选者得到了相同的票数,那么这些候选者会重新举行一次选举并重新获得一个随机的Timeout,当Timeout完成后候选者依旧会发出投票请求。一般来说第二次投票先成为候选者的成为Leader的可能性是最大的(两次随机值都相同的可能性极小)。当然机制已经在这,不外乎多选几次。