Raft是一种基于leader实现各节点日志一致性的共识算法。被越来越多的分布式系统框架使用,比如Etcd、Consul等。Seata以后也会指Raft,很快就会发布Kafka的Kafka2.8也引入了Raft,并在基础上做了一些修改Raft,在Kafka2.8中称为KRaft。从这个角度来看,Raft是目前大多数分布式系统首选的共识算法,学习Raft会让你在分布式领域如鱼得水。这篇文章的主要内容是我对Raft选举领导者的理解总结。各位,根据我的理解,Raft是强领导者模型,即一切都依赖于领导者,是一种共识算法,实现了各个节点的一系列共识和日志一致性。Raft具有三种成员资格:Leader、Follower和Candidate。Follower:在Raft中,只有leader与client进行交互。因此,当没有发生选举时,follower只是默默地处理leader发来的消息,起到数据冗余的作用。当leader的心跳超时时,follower的参与者会主动推荐自己作为候选人进行竞选。候选人:成为候选人后,会向其他节点发送请求投票的消息,以获取其他节点的选票。如果获得大多数选票,则将选举领导者。Leader:所有数据都服从于leader。它也是与客户端交互的唯一角色。它处理请求,管理日志复制,不断向follower发送心跳信息,不断刷新follower节点的超时时间,以防follower发起新的选举。选举过程我以一个新初始化的Raft集群为例:1.初始状态初始化后每个Raft节点的心跳超时时间是随机的。如上图,节点C的超时时间最短(120ms),任期号为0则所有角色都是follower。2.请求投票此时,没有节点是leader。节点等待心跳超时后,会推荐自己作为候选者,并向集群中的其他节点发起投票信息请求。此时任期号+1,自荐会获得自己的一票。3.追随者投票追随者收到投票信息请求后,如果候选人符合投票要求,他将是宝贵的(因为追随者只能在每个任期投票给先到的候选人,后到的候选人投票时不能投票给候选人),同时更新任期号。4.选举leader当节点C赢得多数选票时,它将成为本任期的leader。5.Leader和Follower保持心跳Leader周期性地向其他节点发送心跳消息,告知自己是Leader,同时刷新Follower的超时时间,防止Follower发起新的Leader选举。关于任期从上面的选举过程我们知道,Raft中的选举是有任期机制的。顾名思义,每个领导人都有自己的任期。更换领导时,任期也会增加。在Raft任期中还需要注意以下细节:如果一个节点发现自己的任期号小于其他节点,则将自己的任期号更新为大于自己的值;从上面的选举过程来看,每一个推荐人如果成为候选人,都会得到自己的一票;如果候选人或领导者发现他的任期数小于其他节点,他将立即更新自己为追随者。这个非常重要。按照我的理解,这个机制可以解决同时有多个leader的情况。例如leaderA挂掉后,集群中的其他节点会选举出新的leaderB,节点B恢复后会收到来自新leader消息的heartbeat,此时节点A会立即回到follower状态;如果一个节点收到一个小于自己任期数的请求,它将拒绝该请求。对于随机超时的follower,如果follower在一定时间内没有收到leader的心跳,就会发起新一轮的leader选举。想象一下,如果所有的follower同时发起leader选举。什么样的场景?会不会同时造成选举混乱?如果同时启动选举,会不会因为选票被瓜分而导致选举失败?如果想自己调试观察Raft选举过程,可以访问以下网址:https://raft.github.io/本文转载自微信公众号《后端进阶》,可以通过关注以下二维码。转载本文请联系后端高级公众号。
