在分布式系统中,一致性指在集群中的多个节点在状态上达成一致。但在现实场景下,由于程序崩溃,网络故障,硬件故障,断电等原因,结点间的一致性很难保证,这样就需要Paxos,Raft等一致性协议。
leader身份:负责处理接收客户端交互请求,日志复制等,一般正常情况下只有一个leader。
follwer身份:类似选民,完全被动,在探测不到leader存在时,follwer在超时时间过后会转化为candidate。
candidate身份:候选人:可以被选为一个新的leader。
term:选举任期。
election timeout:选举超时时间。raft中是随机的。
Raft集群各个节点之间是通过RPC通讯传递消息的,每个节点都包含一个RPC服务端与客户端,初始时启动RPC服务端,状态设置为follwer。
1.超过半数投票
2.节点只能相应任期号大于或等于自己任期的请求,投票后term+1.
3.同一个任期内(term)内只能选举一次
系统初始化时,有4个节点,分别是a,b,c,d。
在election timeout的驱使下,follwer会转换成candidate,去拉取半数以上选举后就会当选leader。
正式流程:
1.加入a的随即时间最短,a醒来,term变为1(初始都是0),切换到candidate状态,首先投自己一票,并通知其余节点发起选举,等待其他节点的回复,根据来自其他节点的消息,可能有三种结果。
1.1.a收到半数以上投票,当选leader(a的term大)。此时,a会给其他节点发送消息,避免其他节点发起新的选举。
1.2.被告知别人已当选,a自行切换到follwer。
1.3.一段时间内,所有节点都没有收到大部分选票,则保持candidate状态,重新发起选举,知道产生leader。
1.通过election timeout一定层度上解决了候选人争抢选票,导致的选举时间过长的问题。
2.Raft的优点,比Paxos算法更容易理解,而且更容易工程化实现。