zookeeper FastLeaderElection

     zk 为了实现Paxos算法的快速收敛,添加Leader选举算法,只有Leader角色才可以发起提案。为了熟悉并使用zk,近来也具体看了zk(3.4.8)部分代码,主要逻辑(集群模式)分析如下:

  1. zk启动,zk启动脚本是zkServer.sh

        调用 (org.apache.zookeeper.server.quorum.QuorumPeerMain) 的main方法 -> QuorumPeerConfig 加载配置文件 ->  QuorumPeer 实例化相关网络连接服务  -> 启动 QuorumPeer 

这里主要根据自己读取源码,分析一下QuorumPeer启动时  FastLeaderElection的选举实现。

      

  2 Leader选举算法实现(FastLeaderElection)分析,网络上相关的文章比较多,具体就是每个 QuorumPeer 启动时,会尝试向其它节占发送Leader选举信息包(Notification),

    主要实现代码逻辑在   FastLeaderElection.lookForLeader()方法中,具体就是每个peer分析收到的Notification,对比其中各个字段的值,看哪一个peer获得了大多数投票。

  总体代码,我基本看了一下,网络收发包,本机分析。

  

  问题:

      如果在配置文件中,没有配置(或者都配置成一样)每个peer的 long leader, long zxid, long epoch,那么每个节占的会为其初始化一个 Long.MIN_VALUE值。

  

    如何是否存在以下情况:

          如果没有配置 long leader, long zxid, long epoch,(或者有多个节点,某个值设置的一样)每个节点按初始值进行发包 ,最终会进入

        

              

                                 图 2

            然后每个节点都等待其它其它的消息,然后同时每个peer又同时修改自己的 long   , long zxid, long epoch,这样是不是存在一定的活锁情况?(当然具体可能因为网络时延的时间,应该不是每个peer都这么一样,估计就不会出现这个情况)?

      为此,是否需要在 QuorumPeerConfig 加载配置文件时,验证一下 每个peer不server.id不可相同,在图 2的while中每个节点,随机一下等待时间?

             以上只是个人阅读源码的一点想法,可能还没有更深入的理解,先记在这儿,后续再研读!

      

    

时间: 2024-07-28 15:09:35

zookeeper FastLeaderElection的相关文章

ZooKeeper启动过程

1.如何启动 zkServer.sh[Linux]或 zkServer.cmd[Windows] 以zkServer.cmd为例(zkServer.sh中内容太多): 可以清晰的看出:调用了QuorumPeerMain这个类,传的参数为%ZOOCFG%[在zkEnv.cmd中定义,就是zoo.cfg]. 到QuorumPeerMain类中一看,果然有个main方法,且接受一个参数[配置文件路径]: 当然,接受的参数不是一个也没关系,只不过就不能集群了,只能以单机模式运行.仅当接受一个参数作为配置

ZooKeeper启动过程2:FastLeaderElection

前一篇文章中说到,启动ZooKeeper集群时,需要分别启动集群中的各个节点,各节点以QuorumPeer的形式启动,最后到达startLeaderElection和lookForLeader. 先说startLeaderElection 首先,初始化节点自身的currentVote[当前投票]为[myid.zxid.currentEpoch] 然后,初始化选举算法createElectionAlgorithm,默认使用FastLeaderElection算法,在这里,启动两个线程WorkerS

Zookeeper中的FastLeaderElection选举算法简述

Zookeeper是一个开源的分布式应用协调项目, 当中为了保证各节点的协同工作,Zookeeper在工作时须要有一个Leader. 而Leader是怎样被选举出来的?Zookeep中使用的缺省算法称为FastLeaderElection. Zookeeper的基本前提是多个节点都具备全局其他全部节点的基本信息(IP/port/SID),而SID是节点的唯一编号. 正常工作时"从节点"会从"主节点"(Leader)同步版本号信息,称为zxid. 一旦整个系统重新启动

Zookeeper源码阅读(十八) 选举之快速选举算法FastLeaderElection

目录 前言 FastLeaderEleaction基本结构 选举方法分析 思考 参考 前言 在过去的两节里已经分析了选举过程中的一些实体类和网络IO相关的机制与源码,这一节将会对zookeeper选举的核心类FastLeaderElection进行分析. FastLeaderEleaction基本结构 可以看到FastLeaderElection的基本结构还是比较清晰的,主要从新的成员变量类和内部类来分析下FastLeaderElection的基本结构. Notification /** * N

浅谈分布式服务协调技术 Zookeeper

Google的三篇论文影响了很多很多人,也影响了很多很多系统.这三篇论文一直是分布式领域传阅的经典.根据MapReduce,于是我们有了Hadoop:根据GFS,于是我们有了HDFS:根据BigTable,于是我们有了HBase.而在这三篇论文里都提及Google的一个Lock Service -- Chubby,哦,于是我们有了Zookeeper. 随着大数据的火热,Hxx们已经变得耳熟能详,现在作为一个开发人员如果都不知道这几个名词出门都好像不好意思跟人打招呼.但实际上对我们这些非大数据开发

图解zookeeper FastLeader选举算法【转】

转自:http://codemacro.com/2014/10/19/zk-fastleaderelection/ zookeeper配置为集群模式时,在启动或异常情况时会选举出一个实例作为Leader.其默认选举算法为FastLeaderElection. 不知道zookeeper的可以考虑这样一个问题:某个服务可以配置为多个实例共同构成一个集群对外提供服务.其每一个实例本地都存有冗余数据,每一个实例都可以直接对外提供读写服务.在这个集群中为了保证数据的一致性,需要有一个Leader来协调一些

zookeeper选举代码分析

本文将以zookeeper的3.4.6版本作为源码分析版本.主要的代码类包括QuorumPeerMain.QuorumPeer.FastLeaderElection.QuorumMaj等. 假设有a,b,c三个zookeeper服务,serverid分别是1.2.3: 1.先启动集群中的a服务,先投票自己a为leader,并将投票信息发送给自己; QuorumPeerMain对象调用QuorumPeer线程的startLeaderElection方法,最终调用FastLeaderElection

zookeeper启动入口

最近正在研究zookeeper,一些心得记录一下,如有错误,还请大神指正. zookeeper下载地址:http://zookeeper.apache.org/releases.html,百度一下就能找到,不过还是在这里列一下. 我认为学习一个东西,首先要理出一个头绪,否则感觉无从下手,这里我从启动开始研究,即从zkSever.sh入手. if [ "x$JMXDISABLE" = "x" ] then echo "JMX enabled by defau

理解zookeeper选举机制

*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* BLOCKS =============================================================================*/ p, blockquote, ul, ol, dl, table, pre { margin: 15px 0; } /* HEAD