Consensus一致性
指多个服务器在状态达成一致。但是在一个分布式系统中,因为各种意外,有的机器宕机,无法和其他服务器达成一致状态的时候,通过这个一致性协议确保容错性,即使系统中有个别服务器宕机,也不影响其处理过程。
为了使容错方式达成一致,我们不可能要求所有服务器都达成一致性状态,只要超过半数的服务器达成一致就可以了。假设有N台服务器,只要有N/2+1台达成一致就不影响系统。
Timeout/HeartBeat心跳周期
从选民中选出候选者,会有一个Timeout。候选者中选出领导者也会有一个Timeout,选民投票也会有Timeout。每个Timeout内只能执行一次操作,比如选民投票只能投一次,候选者只能发一次消息叫选民投它们。等到当前Timeout结束,第二个Timeout才可以进行二次操作。
在Raft中,任何时候一个服务器可以扮演以下角色之一:
1)Leader:领导者,处理所有客户端交互,日志复制等,一般一次只有一个Leader。当部分机器宕机,所有服务器被分成了N部分,那么就会选举出N个Leader。当网络恢复,旧的Leader会降级为Follower,留下最新那个Leader,执行Commit操作。
2)Follower:选民,完全被动,负责投票和听Leader的命令。
3)Candidate:候选者,在Leader宕机或者没有Leader的时候,在Timeout内,系统自动选出来的Candidate候选者,可以有多个。C候选者选出来后,会向F选民发出消息:“投票给我!”在同一Timeoue内,F选民就会给它投票,只要超过半数的服务器投给它,那这个C候选者就可以变成L领导者。如果有多个候选者得到的票数一样,那么这几个候选者在它们的Timeout就会重新发起投票消息,选民在它们的Timeout结束后,就会给收到的最早的候选者消息投票。重复这个过程,直到某一候选者得到超过半数的投票。当然,在这个过程中,候选者也可以投票给自己。
执行日志复制操作
1)领导者发出消息让选民复制日志:“请复制”,选民复制完成之后回复领导者:“已复制”,此时是uncommit状态。当领导者收到超过一半的选民回复,就会把状态改成Commit
2)如果领导者在发出让选民复制日志消息之后,领导者挂了,那选民就重新选领导者,然后执行操作1。如果是部分选民挂了,那这部分选民就自主选一个新领导者,执行操作1。当网络恢复了,服务器修好了,两个领导者碰到,旧的领导者就会降级成选民,然后新领导者把uncommit状态改为commit
如果觉得《Raft分布式系统算法》对你有帮助,请点赞、收藏,并留下你的观点哦!