节点状态:

// org.apache.zookeeper.server.quorum.QuorumPeer.ServerState
public enum ServerState {
LOOKING, FOLLOWING, LEADING, OBSERVING;
}

测试环境可以用 2 个节点组成集群。2 个节点的集群中,节点需要得到 2 票,才能当选为 leader。

假定 2 个节点的 id 分别为 1 和 2,以 FastLeaderElection 为例,描述选举过程:
开始, 2 个节点均处于 LOOKING 状态,投票进行选举,2 个节点分别为自己投票,这样均只得 1 票,无法选举出 leader。
开始下一轮选举,节点 1 发现节点 2 的 id 比自己大,于是给节点 2 投票,随之节点 2 成为 leader。

投票信息
FastLeaderElection.Notification

选举 leader
FastLeaderElection.lookForLeader

比较 epoch,zxid,id。判断是否要更新当前节点的投票信息
FastLeaderElection.totalOrderPredicate

计票,判断选举是否结束
FastLeaderElection.termPredicate

选举完成后的同步

QuorumPeer.run() 代码片段:

case FOLLOWING:
try {
LOG.info("FOLLOWING");
setFollower(makeFollower(logFactory));
follower.followLeader();
} catch (Exception e) {
LOG.warn("Unexpected exception",e);
} finally {
follower.shutdown();
setFollower(null);
setPeerState(ServerState.LOOKING);
}
break;

Follower.followLeader() 代码片段:

syncWithLeader(newEpochZxid);
QuorumPacket qp = new QuorumPacket();
while (self.isRunning()) {
readPacket(qp);
processPacket(qp);
}

follower 无限 while 循环。

zookeeper 选举和同步的更多相关文章

  1. Zookeeper选举算法原理

    Zookeeper选举算法原理 Leader选举 Leader选举是保证分布式数据一致性的关键所在.当Zookeeper集群中的一台服务器出现以下两种情况之一时,需要进入Leader选举. (1) 服 ...

  2. 学习笔记:Zookeeper选举机制

    1.Zookeeper选举机制 Zookeeper虽然在配置文件中并没有指定master和slave 但是,zookeeper工作时,是有一个节点为leader,其他则为follower Leader ...

  3. Zookeeper 选举过程

    Zookeeper 选举过程 问题 选举过程 服务器之间是怎么通信的? 答:QuorumCnxManager使用TCP-socket实现选举过程中的连接通信 Leader的选举过程在什么时候实现? L ...

  4. Zookeeper选举机制(转)

    源:http://blog.csdn.net/tototuzuoquan/article/details/54426684 1.Zookeeper选举机制 Zookeeper虽然在配置文件中并没有指定 ...

  5. zookeeper 源码(一) 选举和同步数据

    前言 在开始阅读代码前我们先来了解一下zk 的大致结构,具体大概要实现的核心功能有那些,心中有个大概的框架阅读代码时再深入其中的细节,就会非常好懂,本人觉得这是一个阅读源码的好方法,可以最快地切入到源 ...

  6. zookeeper选举原理

    zookeeper的领导者选举和原子广播   目录:     1.工作原理概述     2.Fast Leader选举算法(领导者选举)     3.Leader与Follower同步数据(原子广播) ...

  7. 理解zookeeper选举机制

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  8. zookeeper选举状态介绍 摘自https://cloud.tencent.com/developer/news/303891

    zookeeper集群 配置多个实例共同构成一个集群对外提供服务以达到水平扩展的目的,每个服务器上的数据是相同的,每一个服务器均可以对外提供读和写的服务,这点和redis是相同的,即对客户端来讲每个服 ...

  9. 关于Zookeeper选举机制

    zookeeper集群 配置多个实例共同构成一个集群对外提供服务以达到水平扩展的目的,每个服务器上的数据是相同的,每一个服务器均可以对外提供读和写的服务,这点和redis是相同的,即对客户端来讲每个服 ...

随机推荐

  1. Java 基础功底

    Java 基础语法特性: 首先了解并做好Java Web 开发环境配置(包含 JDK 的配置)是非常必要的.其中 CLASSPATH 的值开始必须包含 ".",否则用 javac ...

  2. 批量Excel数据导入Oracle数据库

    由于一直基于Oracle数据库上做开发,因此常常会需要把大量的Excel数据导入到Oracle数据库中,其实如果从事SqlServer数据库的开发,那么思路也是一样的,本文主要介绍如何导入Excel数 ...

  3. C+++string类如何判断字符串为空

    string类是C++STL类之一,有很丰富的接口,判断string为空是经常用到的操作. string类为空,实际也就是元素为0个. 可以按照如下方式判断: 1.string类有自己的成员函数emp ...

  4. 【Python】【电子邮箱】

    #[[电子邮件]]'''Email的历史比Web还要久远,直到现在,Email也是互联网上应用非常广泛的服务. 几乎所有的编程语言都支持发送和接收电子邮件,但是,先等等,在我们开始编写代码之前,有必要 ...

  5. Java 中常见的各种排序算法汇总

    首先,Java中自已是有排序的 说明:(1)Arrays类中的sort()使用的是“经过调优的快速排序法”;(2)比如int[],double[],char[]等基数据类型的数组,Arrays类之只是 ...

  6. 排序——冒泡排序(java描述)

    百度百科:冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法. 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小.首字母从A到Z)错误就把他们交 ...

  7. git Bash下复制粘贴

    git复制:Ctrl+insert git粘贴:Shift+Insert git常用快捷键链接地址:https://www.jianshu.com/p/cc1fbd89e087 在gitHup上下载他 ...

  8. js判断字符串与字符串相互包含,以及数组是否包含某个元素;

    需求:判端一个字符串是否包含另一个字符串? 实现: var str  = "adc"; 判断str 中是否包含 "c" if( str.indexOf(&quo ...

  9. 网格视图GridView的使用

    网格视图GridView的排列方式与矩阵类似,当屏幕上有很多元素(文字.图片或其他元素)需要按矩阵格式进行显示时,就可以使用GridView控件来实现. 本文将以一个具体的实例来说明如何使用GridV ...

  10. (转)C# 之泛型详解

    什么是泛型 我们在编写程序时,经常遇到两个模块的功能非常相似,只是一个是处理int数据,另一个是处理string数据,或者其他自定义的数据类型,但我们没有办法,只能分别写多个方法处理每个数据类型,因为 ...