vlambda博客
学习文章列表

算法领头羊丨分布式系统如何选举领导?

(本文阅读时间:7分钟)

大家好,我是本期的实验室研究员——李帅。领导选举是分布式系统中最棘手的事情之一。同时,理解 Leader 是如何选举产生的以及Leader 的职责,是理解分布式系统的关键。



微软MVP实验室研究员


算法领头羊丨分布式系统如何选举领导?
李帅
算法领头羊丨分布式系统如何选举领导?


在分布式系统中,通常一个服务由多个节点或实例组成服务集群,提供可扩展性、高可用的服务。

这些节点可以同时工作,提升服务处理、计算能力,但是,如果这些节点同时操作共享资源时,那就必须要协调它们的操作,防止每个节点覆盖其他节点所做的更改,从而产生数据错乱的问题。
所以,我们需要在所有节点中选出一个领导者 Leader,来管理、协调集群的所有节点,这种也是最常见的 Master-Slave 架构。
在分布式环境中的多个节点中选取主节点 Leader,通常会使用以下几种策略:
  1. 根据进程 Id 或者实例 Id,选择最大值,或者最小值作为主节点。
  2. 实现一种常见的领导者选举算法,比如 Bully 等。
  3. 通过分布式互斥锁,保证只有一段时间只有一个节点可以获取到锁,并成为主节点。
在本文中,我会介绍几种常见的选举算法,包括 ZAB、Bully、Token Ring Election。





Bully 算法

算法领头羊丨分布式系统如何选举领导?


Garcia-Monila 在 1982 年的一篇论文中发明了 Bully 算法,这是分布式系统中很常见的选举算法,它的选举原则是“长者”为大,也就是在所有存活的节点中,选取 ID 最大的节点作为主节点。
假如有一个集群, 各个节点可以相互连接,并且每个节点都知道其他节点的信息( Id 和节点地址),如下:


算法领头羊丨分布式系统如何选举领导?


集群初始化时,各个节点首先判断自己是不是存活的节点中 ID 最大的,如果是,就向其他节点发送 Victory 消息,宣布自己成为主节点,根据规则,此时,集群中的 P6 节点成为 Master 主节点。
现在集群中出现了一些故障,导致节点下线。如果下线的是从节点, 集群还是一主多从,影响不大, 但是如果下线的是 P6 主节点,那就变成了一个群龙无首的场面。


算法领头羊丨分布式系统如何选举领导?


现在我们需要重新选举一个主节点!
我们的节点是可以相互连接,并且节点间定时进行心跳检查, 此时 P3 节点检测到 P6 主节点失败,然后 P3 节点就发起了新的选举。
首先 P3 会向比自己 ID 大的所有节点发送 Election 消息。


算法领头羊丨分布式系统如何选举领导?


由于 P6 已经下线,请求无响应,而 P4,P5 可以接收到 Election 请求,并响应 Alive 消息。P3 节点收到消息后,停止选举,因为现在有比自己 Id 大的节点存活,他们接管了选举。


算法领头羊丨分布式系统如何选举领导?


接下来,P4 节点向 P5 和 P6 节点发送选举消息。


算法领头羊丨分布式系统如何选举领导?


P5 节点响应 Alive 消息,并接管选举。


算法领头羊丨分布式系统如何选举领导?


同样,P5 节点向 P6 节点发送选举消息。


算法领头羊丨分布式系统如何选举领导?


此时,P6 节点没有响应,而现在 P5 是存活节点中 ID 最大的节点,所以 P5 理所应当成为了新的主节点,并向其他节点发送 Victory 消息,宣布自己成为 Leader !


算法领头羊丨分布式系统如何选举领导?


一段时间后,故障恢复,P6 节点重新上线,因为自己是 ID 最大的节点, 所以直接向其他节点发送 Victory 消息,宣布自己成为主节点,而 P5 收到比自己 ID 大的节点发起的选举请求后,降级变成从节点。





Token Ring 算法 

算法领头羊丨分布式系统如何选举领导?

Token Ring Election 算法和集群节点的网络拓扑有较大关系,它的特点是,所有的节点组成一个环,而每个节点知道下游节点,并能与之通信,如下:


算法领头羊丨分布式系统如何选举领导?


集群初始化的时候,其中一个节点会向下一个节点先发起选举消息,其中包含了当前节点的 ID,下一个节点收到消息后,会在消息中附加上自己的 ID,然后继续往下传递,最终形成闭环。
本次选举从 P3 节点发起。


算法领头羊丨分布式系统如何选举领导?


P3 节点收到 P4 的消息后,发现消息中包含自己的节点 ID,可以确定选举消息已经走了整个环,这时还是按照 “长者为大” 的原则,从消息 "3,6,5,2,1,4" 中选取最大的 Id 为主节点,也就是选举 P6 为 Leader。
接下来,P3 节点向下游节点发送消息,宣布 P6 是主节点,直到消息走了整个环,回到 P3,至此,本次选举完成。


算法领头羊丨分布式系统如何选举领导?


现在集群中出现了一些故障, 导致主节点 P6 下线,位于上游的 P3 节点首先发现了(通过心跳检查),然后 P3 节点重新发起选举,当下游的 P3 节点无法连接时,会尝试连接下游的下游节点 P5,发送选举消息,并带上自己的节点 Id,消息逐步往下游传递。


算法领头羊丨分布式系统如何选举领导?


直到选举消息重新回到 P3 节点,从 "3,5,2,1,4" 节点列表中选取最大的 ID,也就是现在 P5 成为主节点。
接下来,P3 节点向下游节点发送消息,宣布 P5 是主节点。


算法领头羊丨分布式系统如何选举领导?


直到消息走了整个环,回到 P3,至此,本次选举完成。





ZAB - ZooKeeper

的原子广播协议 

算法领头羊丨分布式系统如何选举领导?

众所周知,Apache ZooKeeper 是云计算的分布式框架, 它的核心是一个基于 Paxos 实现的原子广播协议(ZooKeeper Atomic Broadcast),但实际上它既不是 Basic-Paxos 也不是 Multi-Paxos。
目前在 ZooKeeper 中有两种领导选举算法:LeaderElection 和 FastLeaderElection(默认), 而 FastLeaderElection 选举算法是标准的 Fast-Paxos算法实现。
下面我会介绍 ZAB 协议中的领导选举的实现。
首先,我们有三个节点,S1,S2,S3 , 每个节点在本地都有一份数据和投票箱,数据包括myid, zxid 和 epoch。
  • myid 每个节点初始化的时候需要配置自己的节点 Id,不重复的数字。

  • epoch 选举的轮数,默认为0,选举时做累加操作。epoch 的大小可以表示选举的先后顺序。

  • zxid ZooKeeper 的全局事务Id, 64位不重复的数字,前 32 位是 epoch,后32位是 count 计数器, zxid 是怎么做到全局唯一的呢?实际上集群选中 Leader 后,一个写的操作,首先会统一在 Leader 节点递增 zxid,然后同步到 Follower 节点,在一个节点上保证一个数字递增并且不重复就简单多了, zxid 的大小可以表示事件发生的先后顺序。


算法领头羊丨分布式系统如何选举领导?


现在开始投票,投票内容就是上面说的节点的本地数据,【myid,zxid,epoch】, 每个节点先给自己投一票,并放到自己的投票箱,然后把这张票广播到其他节点。


算法领头羊丨分布式系统如何选举领导?


一轮投票交换后,现在,每个节点的投票箱都有所有节点的投票。


算法领头羊丨分布式系统如何选举领导?

根据投票箱里的投票的节点信息,进行竞争,规则如下:

首先会对比 zxid,zxid 最大的胜出(zxid越大,表示数据越新), 如果 zxid 相同,再比较 myid (也就是 节点的 serverId),myid 较大的则胜出, 然后更新自己的投票结果,再次向其他节点广播自己更新后的投票 。

节点 S3:根据竞争规则,胜出的票是 S3 自己,就无需更新本地投票和再次广播。

节点 S1 和 S2: 根据竞争规则, 重新投票给 S3,覆盖之前投给自己的票,再次把投票广播出去。

注意,如果接收到同一个节点同一轮选举的多次投票,那就用最后的投票覆盖之前的投票。

此时,节点 S3 收到节点 S1和S2的重新投票,都是投给自己,符合 "过半原则",节点 S3 成为 Leader,而 S1 和 S2 变成 Follower, 同时 Leader 向 Follower 定时发送心跳进行检查。


算法领头羊丨分布式系统如何选举领导?





总结


本文主要介绍了分布式系统中几个经典的领导选举算法,ZAB、Bully、Token Ring Election, 选举规则有的是 "长者为大",而有的是 "民主投票",少数服从多数, 大家可以对比他们的优势和缺点,在实际应用中选择合适的选举算法。
为什么没有介绍 Paxos 算法呢?因为 Paxos 是共识算法,而 Basic-Paxos 中,是不需要 Leader 节点即可达成共识,可谓 "众生平等", 而在 Multi-Paxos 中提到的 Leader 概念,也仅仅是为了提高效率。当然 Paxos 是非常重要的,可以说它是分布式系统的根基。

  

微软最有价值专家(MVP)



微软最有价值专家是微软公司授予第三方技术专业人士的一个全球奖项。29年来,世界各地的技术社区领导者,因其在线上和线下的技术社区中分享专业知识和经验而获得此奖项。
MVP是经过严格挑选的专家团队,他们代表着技术最精湛且最具智慧的人,是对社区投入极大的热情并乐于助人的专家。MVP致力于通过演讲、论坛问答、创建网站、撰写博客、分享视频、开源项目、组织会议等方式来帮助他人,并最大程度地帮助微软技术社区用户使用 Microsoft 技术。
更多详情请登录官方网站:
https://mvp.microsoft.com/zh-cn


微软MVP,期待你加入