一、 Paxo共识如何做事情?
Paxos里面有三种角色,Proposer, Acceptor, Learner,其中learner完全被动复制已经形成共识的内容,这里不做介绍。
首先Proposer会向每一个acceptor发送一个数字n,这里n可以理解成工钱。
Acceptor接受到n后,知道有事情做了,于是回复Proposer同意请求,这里面可能有网络的原因,第三个Acceptor并没有及时反馈。但是当大多数Acceptor回复时,Proposer就可以进行下一步操作了。
接下来Proposer发送Accept请求,该请求就是具体的内容,acceptor需要做的事情。Acceptor接受后,将在本地进行执行。
至此,Paxos最核心的想法就已经说完了。
二、 Raft如何做事情呢?
Raft算法里面也有3个角色,Leader,Candidate,Follower。这里面的事情处理相较于Paxos来说非常简单,Leader直接发送给Follower需要干什么,Follower然后完成任务,返回他Leader一个Ok。
那这里如何选举Leader呢?首先需要Follower发现,目前已经没有leader了,因此需要有人来担此大任!因此,他主动申请想要作Leader,于是他成为candidate请求其他follower投票。如果获得大多数Follower的投票,该Candidate就成为Leader了。
三、 如何处理两种算法中的选举冲突?
首先我们来看Paxos里面有什么选举冲突?
如下图,当存在两个Proposer时,究竟听取谁的意见呢?这里Paxos算法采取谁的数字大听谁的,也可以理解为谁的工钱多,听谁的。如图,B的数字更大,因此B的建议将会被采纳,并进行下一步操作。
接下来看看Raft中的选举冲突。
这里主要讨论的是平票的情况,如图,两个Candidate存在,他们都想成为Leader,然后给Follower发送请求,由于网络的原因,最后他们可能获得平票的结果。这样就不会有Leader出现。
那这种情况该如何处理呢?
Raft采取了随机选举超时机制,也就是当Follower发现没有Leader时,究竟需要等待多久,才发起请求成为Candidate呢?如图,Follower1发现没有Leader后立马发送请求,让别的节点给自己投票,而Follower2,还在等待上一任Leader的消息。这样的话,首先成为Candidate的节点,就更容易成为Leader,这样极大程度上解决了平票的问题。