`
wbj0110
  • 浏览: 1611021 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

图解zookeeper FastLeader选举算法

阅读更多

zookeeper配置为集群模式时,在启动或异常情况时会选举出一个实例作为Leader。其默认选举算法为FastLeaderElection

不知道zookeeper的可以考虑这样一个问题:某个服务可以配置为多个实例共同构成一个集群对外提供服务。其每一个实例本地都存有冗余数据,每一个实例都可以直接对外提供读写服务。在这个集群中为了保证数据的一致性,需要有一个Leader来协调一些事务。那么问题来了:如何确定哪一个实例是Leader呢?

问题的难点在于:

  • 没有一个仲裁者来选定Leader
  • 每一个实例本地可能已经存在数据,不确定哪个实例上的数据是最新的

分布式选举算法正是用来解决这个问题的。

本文基于zookeeper 3.4.6 的源码进行分析。FastLeaderElection算法的源码全部位于FastLeaderElection.java文件中,其对外接口为FastLeaderElection.lookForLeader,该接口是一个同步接口,直到选举结束才会返回。同样由于网上已有类似文章,所以我就从图示的角度来阐述。阅读一些其他文章有利于获得初步印象:

主要流程

阅读代码和以上推荐文章可以把整个流程梳理清楚。实现上,包括了一个消息处理主循环,也是选举的主要逻辑,以及一个消息发送队列处理线程和消息解码线程。主要流程可概括为下图:

fle-flow.png

推荐对照着推荐的文章及代码理解,不赘述。

我们从感性上来理解这个算法。

每一个节点,相当于一个选民,他们都有自己的推荐人,最开始他们都推荐自己。谁更适合成为Leader有一个简单的规则,例如sid够大(配置)、持有的数据够新(zxid够大)。每个选民都告诉其他选民自己目前的推荐人是谁,类似于出去搞宣传拉拢其他选民。每一个选民发现有比自己更适合的人时就转而推荐这个更适合的人。最后,大部分人意见一致时,就可以结束选举。

就这么简单。总体上有一种不断演化逼近结果的感觉。

当然,会有些特殊情况的处理。例如总共3个选民,1和2已经确定3是Leader,但3还不知情,此时就走入LEADING/FOLLOWING的分支,选民3只是接收结果。

代码中不是所有逻辑都在这个大流程中完成的。在接收消息线程中,还可能单独地回应某个节点(WorkerReceiver.run):

recv.png

从这里可以看出,当某个节点已经确定选举结果不再处于LOOKING状态时,其收到LOOKING消息时都会直接回应选举的最终结果。结合上面那个比方,相当于某次选举结束了,这个时候来了选民4又发起一次新的选举,那么其他选民就直接告诉它当前的Leader情况。相当于,在这个集群主从已经就绪的情况下,又开启了一个实例,这个实例就会直接使用当前的选举结果。

状态转换

每个节点上有一些关键的数据结构:

  • 当前推荐人,初始推荐自己,每次收到其他更好的推荐人时就更新
  • 其他人的投票集合,用于确定何时选举结束

每次推荐人更新时就会进行广播,正是这个不断地广播驱动整个算法趋向于结果。假设有3个节点A/B/C,其都还没有数据,按照sid关系为C>B>A,那么按照规则,C更可能成为Leader,其各个节点的状态转换为:

state.png

图中,v(A)表示当前推荐人为A;r[]表示收到的投票集合。需要注意一个细节,初始投票集合里包含了自己的投票,代码中自己会将推荐人推荐给自己,网络模块(QuorumCnxManager)直接将该消息放入接收队列。

可以看看当其他节点已经确定投票结果时,即不再是LOOKING时的状态:

state-ret.png

代码中有一个特殊的投票集合outofelection,我理解为选举已结束的那些投票,这些投票仅用于表征选举结果。

当一个新启动的节点加入集群时,它对集群内其他节点发出投票请求,而其他节点已不处于LOOKING状态,此时其他节点回应选举结果,该节点收集这些结果到outofelection中,最终在收到合法LEADER消息且这些选票也构成选举结束条件时,该节点就结束自己的选举行为。注意到代码中会logicalclock = n.electionEpoch;更新选举轮数

http://codemacro.com/2014/10/19/zk-fastleaderelection/

分享到:
评论

相关推荐

    自动动手写zookeeper选举算法与心跳同步

    本文将深入探讨Zookeeper中的选举算法和心跳同步机制,这两个概念对于理解Zookeeper如何保证集群的一致性和高可用性至关重要。 首先,让我们从选举算法开始。在Zookeeper中,最常用的选举算法是Fast Paxos,它是在...

    C# 关于zookeeper主从选举的源码

    - 为了实现选举,你需要理解Zookeeper的选举算法细节,并将其转化为C#代码。 5. **源码分析**: - 分析源码时,重点关注类的设计,如`ZookeeperNode`、`ZookeeperLeader`和`ZookeeperFollower`,它们分别代表...

    zookeeper选举机制图

    zookeeper选举机制图,内讲述了zookeeper是如何选举出leader、fllower的

    Zookeeper源码分析

    本文将深入剖析Zookeeper的工作原理,以及其内部实现的FastLeader选举算法和Paxos算法。 首先,我们来看Zookeeper的工作原理概述。Zookeeper采用一种基于ZAB协议的分布式一致性模型,该协议是为Zookeeper定制的,...

    zookeeperMaster选举以及数据同步代码

    Zookeeper提供了原子性的`Leader Election`算法,确保在节点之间选举出一个领导者。这个过程通常包括节点注册、心跳检测、投票选举等步骤。当一个节点发现当前没有领导者时,就会发起选举,每个节点根据其ID或状态...

    fast paxos算法与zookeeper leader选举源代码分析.doc

    fast paxos算法与zookeeper leader选举源代码分析.doc

    用java实现HS和LCR选举算法

    在分布式系统中,选举算法是确保一致性、容错性和稳定性的重要工具。HS(Hunt-Szymanski)算法和LCR(Lamport's Cluster Membership)算法是两种经典的领导者选举算法,常用于分布式环境中的主节点选择或者一致性...

    3、zookeeper的选举

    《Zookeeper选举详解——确保分布式一致性》 Zookeeper作为一个分布式协调服务,其核心功能之一就是通过选举机制确保数据的一致性。Leader选举是Zookeeper集群中的重要环节,它分为集群初始化启动时的选举和运行...

    zookeeper安装和选举说明

    接下来,我们谈谈Zookeeper的选举机制: Zookeeper使用一种叫做Zab(Zookeeper Atomic Broadcast)的协议来实现分布式一致性。在Zookeeper集群中,当一个新的节点加入或某个节点失效时,需要进行领导者选举以确定新...

    zookeeper基于paxos算法的资料。

    在Zookeeper中,Paxos算法被用来选举 Leader 和维护集群的状态一致性。Paxos算法通常包括提议者(Proposer)、接受者(Acceptor)和学习者(Learner)三个角色。在Zookeeper中,这些角色分别对应于客户端、服务器...

    选举leader1

    这里我们将深入探讨Zookeeper的FastLeader选举算法。 FastLeader选举算法旨在快速、高效地选举出领导者。在Zookeeper集群中,每个服务器都有一个唯一的Server ID,同时在运行过程中会产生一个Zxid(事务ID),用于...

    分布式选举算法

    为了克服这些限制,实际的分布式系统可能会结合其他选举算法,如Paxos、Raft或Zookeeper的选举机制,以提高可靠性和效率。学习和理解Bully算法是深入研究分布式系统和选举算法的良好起点,对于希望在IT领域从事...

    1、zookeeper3.7.1安装与验证

    其中,`2888`是follower与leader通信的端口,`3888`是选举时使用的端口。 6. **启动Zookeeper**: 在每台服务器上,以`alanchan`用户启动Zookeeper服务。使用`bin/zkServer.sh start`命令启动服务,通过`bin/zk...

    实现zookeeper集群节点管理及Master选举完整示例java项目下载(含依赖jar包).txt

    该项目通过zookeeper三个节点Node服务客户端代码,实现zookeeper集群管理与Master选举功能示例,项目结构如下图所示,其中依赖包包含:log4j-1.2.14.jar、slf4j-api-1.7.2.jar、slf4j-log4j12-1.7.2.jar、zookeeper-...

    idworker:idworker是一个基于zookeeper和snowflake算法的分布式ID生成工具,通过zookeeper自动注册机器(最多1024台),无需手动指定workerId和datacenterId

    idworker是一个基于zookeeper和snowflake算法的分布式统一ID生成工具,通过zookeeper自动注册机器(最多1024台),无需手动指定workerId和dataCenterId 怎么用 Maven < groupId>com.imadcn.framework</ groupId> ...

    Paxos到Zookeeper:分布式一致性原理与实践

    《Paxos到Zookeeper:分布式一致性原理与实践》从分布式一致性的理论出发,向读者简要介绍几种...第四部分(第7章)对ZooKeeper的架构设计和实现原理进行了深入分析,包含系统模型、Leader选举、客户端与服务端的工作原

    zookeeper的通俗原理解释

    Zookeeper 是基于 Paxos 算法实现的分布式协调服务,它提供了高可用、高性能、可扩展的解决方案。下面我们将通过一个通俗的例子来解释 Paxos 算法的原理和 Zookeeper 的实现机制。 Paxos 算法原理 Paxos 算法描述...

    zookeeper面试专题及答案

    ZooKeeper采用Paxos算法实现选举,当一个Zookeeper服务器认为自己是领导者时,它会向其他服务器发送提案,获得大多数服务器的同意后,该服务器成为领导者。 5. **Zookeeper的Watcher机制** Watcher是Zookeeper中...

    zookeeper-3.4.14.zip

    4. **选举算法**:在 Ensemble 模式下,ZooKeeper 使用选举算法来确定集群中的领导者,确保数据的一致性。 5. **原子操作**:所有对 ZooKeeper 的操作都是原子的,即要么全部完成,要么全部不完成,保证了数据操作...

    面试官:说一说Zookeeper中Leader选举机制.doc

    Zookeeper 中 Leader 选举机制 在分布式系统中,Leader 选举机制是非常重要的一环,Zookeeper 作为一个广泛应用于分布式系统的协调服务,自然也有自己的 Leader 选举机制。下面,我们将通过一个有趣的面试对话来...

Global site tag (gtag.js) - Google Analytics