Raft学习笔记【二】——领导者选举

前言

昨天晚上在CSDN上找到了一篇Raft详解的文章,写的非常好,比我的文章好多了。特地这里分享给读者:

分布式共识算法 —— Raft详解_raft共识-CSDN博客,可能有同学要问了,都有那么好的文章了,比你的都写的好多了,那你还写什么?对于这个问题,我觉得我最近在网上看到的一句话说的挺好,也很适合作为这个问题的答案——”了解靠看,熟练靠用,真的掌握要靠教“。我现在觉得这句话说的特别好,之前我学习新知识,最多就靠看,靠用,但很少去教。一方面是因为没有适合教的对象,另一方面是教是件很耗费精力的事。但是,写博客就不一样,虽然写博客也很耗费时间和精力,但是每当我写博客的时候,我想的是每一个看我博客的读者都是我要去教的对象(虽然根本没几个人看哈哈),所以我一定要讲清楚,尽量讲明白。不能自己都有地方不清不楚的,就去误人子弟。这种方式很好地倒逼我去探究一个新知识的细节,这是靠看靠用很难达到的。看的时候可能不会的地方就不会了,也不去仔细思考;用的时候能用就行,也不管什么原理。所以,我依然认为,学习一个新知识,靠自己写博客依然是个非常好的方法。

——2024年3月13日


候选人选举

bg knowledge

上一篇我们说过,在raft算法中,集群中的每个节点只有3种状态。分别是follower,candidate和leader。其中,leader同一时间只能有一个。

leader是负责与客户端进行通信的主要节点。这怎么理解呢,大概可以当成这个分布式系统选出来的代言人,客户端的所有与该系统的交互,都通过和这个leader进行,而其他follwer节点是不知道它们之间的交流信息的。当客户端给系统提了一个“需求”,比如要求增加一条数据,或者删除一个数据时,这个leader要跑去通知所有的follower,只有当一半以上的followers都确认收到这条消息后,leader才会告诉客户端,你的“需求”我们完成了;如果没有达到一半以上的follower确认消息,leader就会告诉客户端“不好意思,你的需求失败了”。raft正是靠这种方式,保持了数据的一致性。

那么,这leader是怎么选出来的呢?

无leader阶段

在一个分布式系统刚初始化的时候,默认是没有leader的。而每个节点的任期记录(term)都为0,并且大家初始化一个一定时间范围内(可能是150ms到300ms之间)的随机计时器。

当有一个节点的计时器时间到了,发现集群内怎么没人给自己发消息?”难道说这个集群里没有一个老大?“,带着这样的想法,该节点决定既然没人当老大,那我来把!于是该节点一跃从follower成为candidate,并给每个节点发消息”家不可一日无主,国不可一日无君呀,兄弟们,我毛遂自荐,成为大家的老大,一定带大家走向富强!“,其他节点一看,反正没人当老大,就同意吧。于是当该candidate收到一半以上的选票,就当选了第一任的leader,开始作为集群的发言人和客户端进行交流。

leader统治阶段

当我们的leader当上老大后,就开始琢磨,“我作为如此伟大的一个节点,成为这个世界(集群)第一个老大,必须有什么东西来纪念我伟大的成就,既然如此,从此以后,广大follower就称呼我为秦始皇吧(雾)!!”。

当然,计算机认不出什么秦始皇,但给自己标个序号还是没问题的,于是它搞来了一个int,称之为term,并给自己封号为1(term = 1)。在我们的term 1统治期间,其他follwer一直心怀不轨,也想当个leader。但是迫于term 1的淫威(该节点每过一段时间就要昭告天下,通过一个心跳计时器,每过一段时间给所有follwer发去消息),集群中的follwer收到该心跳消息后,就只能一直压抑着心中的野心,老老实实听从leader的命令。

leader换届阶段

突然有一天,我们的term 1 leader“失联”了,长时间没给集群中的follwer发送消息。集群中第一个意识到好长时间没收到消息的节点心想“为什么那么长时间都没有term 1的消息了?是不是它已经寄了?王侯将相宁有种乎!”,于是我们的陈胜节点从follwer成为candidate,并将自己的term变为2,给每个节点发去消息“我是term 2,term 1那么就没动静多半是G了,我来带领大家吧”,其他节点一看,2比1高级呀,于是纷纷支持新节点,于是我们的陈胜节点当选了新一任的leader。

有的同学会想,那term1去哪了?这个可能有多方面的原因,有可能是他的任期到了,不能再给follower节点发送消息了,也有可能是它宕机了,还有可能只是它周围的网络发生了阻塞,他给集群内发送的心跳消息被阻塞在网络上,没有发送到follower手里。不管是哪种,新的leader已经选出来了,所以哪怕他回来了,他也只能老老实实地退居成follower,因为他回来后给大家发的消息还是“term 1”的,而大家见过term 2了,就不再理会term 1的消息了。而我们的term 1收到来自term 2的心跳消息时,才知道这世道已经变了,于是它只能退成follwer。

leader选举的另外两种结果

当然,并不是任何一个candidate节点都能当选leader的。除了上面那条时间线,在另一条时间线上在我们的term 1节点失联后,与陈胜节点同一时间意识到term 1失联的还有我们的项羽节点,于是两个节点都成为candidate,都给所有follower发去消息,而不幸的是,由于各方面原因(比如项羽节点附近的网络更加畅通)大家先收到项羽节点的投票请求,每个follower基本上会同意第一个给它们发去投票请求的节点(当然还有其他因素,后面再聊),而每个follower只有一票,当投了项羽节点后,后面再收到同样是term2的陈胜节点,就无法给他投票了。最终,项羽节点的得票数量超过了陈胜节点,项羽节点当选term 2 的leader,陈胜节点只能老老实实地变回follower。

当然还有一种情况,就是term2选举阶段,陈胜和项羽的得票数相同。这种情况下就不会产生新leader,而是会立刻再进行一轮选举,直到选出新leader,而由于每个节点内部的计时器是150ms-300ms之间随机的,所以这种情况相对较少。

就这样,集群内的节点通过一个又一个任期,一届又一届的选举,将这个系统一直运行了下去。


图解

后面的内容是我根据候选人原理选举自己画的一些帮助理解的图,仅供参考


结束语

下一篇讲解日志复制

  • 19
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值