Zookeeper 选举过程

问题

  1. 选举过程 服务器之间是怎么通信的?

    答:QuorumCnxManager使用TCP-socket实现选举过程中的连接通信

  2. Leader的选举过程在什么时候实现?

  3. Leader的选举过程是如何实现的?

  4. Zookeeper的角色都有哪些,且各自有什么作用

  5. Zookeeper集群为什么需要奇数个服务器

组件

Election

实现选举过程必须实现的接口

public interface Election {
//开启新一轮的选举:当服务器状态改为looking时,
public Vote lookForLeader() throws InterruptedException;
public void shutdown();
}
QuorumCnxManager

服务器之间的连接管理器,对每对服务器都维护一个连接

FastLeaderElection

Election的一个实现

Notification:通知包含其他服务器它改变了自己的投票

ToSend:消息包装类,向其他服务器发送通知(notification/ack)

Messenger:消息处理类,内部维护两个线程,发送/接受并处理

public class FastLeaderElection implements Election {
//参与选举的服务器的托管者
QuorumPeer self;
Messenger messenger;
//发送消息的存储队列:由Messenger中的WorkerSend发送
LinkedBlockingQueue<ToSend> sendqueue;
//从其他服务器接收到的通知的存储队列:由Messenger的WorkerRecv接收
LinkedBlockingQueue<Notification> recvqueue; //开启消息管理器:开启接收和发送线程
public void start() {
this.messenger.start();
}
//开启新一轮的选举
public Vote lookForLeader() throws InterruptedException {
//1. 向其他服务器发送投票消息
//2. 循环接收其他服务器的通知:在没有选举成功前且服务器仍在运行
//3. 处理投票:先判断是不是同一轮选举
//LOOKING:比较ZXID和myid,ZXID越大越优先,如果相同,比较myid
//4. 统计投票:判断是否已经有过半机器接受到相同的投票信息,那么就认为选出了leader
//5. 更改服务器状态:当确定leader时 相应服务器更改状态
}
}

实现

QuorumCnxManager实现服务器之间的通信
  1. QuorumConnectionReqThread::initiateConnection()->startConnection():QuorumCnxManager内部维护一个线程QuorumConnectionReqThread专门用于发送连接请求到服务器,线程其实调用外部方法initiateConnection()->startConnection()初始化连接,连接成功后,将服务器的sid从存储待处理连接的集合中移除;并启动相应的发/收消息的线程
  2. QuorumConnectionReceiverThread::receiveConnection()->handleConnection():如果服务器已经有其他连接,就将这个新接收的连接关闭
Zookeeper的角色
  1. Leader:
  2. Follower:实现Learner
  3. Observer:实现Learner

https://blog.csdn.net/tanga842428/article/details/52247756

https://blog.csdn.net/qq_21178933/article/details/82841679

https://blog.csdn.net/panxj856856/article/details/80403487

https://www.cnblogs.com/leesf456/p/6139266.html

Zookeeper 选举过程的更多相关文章

  1. zookeeper的选举过程

    zookeeper的选举过程大致如下: zookeeper的选举过程,就是选出一个在n/2+1个节点中选出一个节点为主节点的过程.比如,当我们启动一个有5个节点的zookeeper集群的时候.首先启动 ...

  2. Zookeeper分布式过程协同技术 - 群首选举

    Zookeeper分布式过程协同技术 - 群首选举 群首概念 群首为集群中服务器选择出来的一个服务器,并被集群认可.设置群首目的在与对客户端所发起的状态变更请求进行排序,包括:create.setDa ...

  3. 【分布式】Zookeeper的Leader选举-选举过程介绍(经典的Paxos算法解析)

    一.前言 前面学习了Zookeeper服务端的相关细节,其中对于集群启动而言,很重要的一部分就是Leader选举,接着就开始深入学习Leader选举. 二.Leader选举 2.1 Leader选举概 ...

  4. zookeeper选举原理

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

  5. zookeeper选举代码分析

    本文将以zookeeper的3.4.6版本作为源码分析版本.主要的代码类包括QuorumPeerMain.QuorumPeer.FastLeaderElection.QuorumMaj等. 假设有a, ...

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

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

  7. zookeeper选举流程

    如何在zookeeper集群中选举出一个leader,zookeeper使用了三种算法,具体使用哪种算法,在配置文件中是可以配置的,对应的配置项是”electionAlg”,其中1对应的是Leader ...

  8. zookeeper 选举和同步

    节点状态: // org.apache.zookeeper.server.quorum.QuorumPeer.ServerState public enum ServerState { LOOKING ...

  9. zookeeper选举机制

    在上一篇文章中我们大致浏览了zookeeper的启动过程,并且提到在Zookeeper的启动过程中leader选举是非常重要而且最复杂的一个环节.那么什么是leader选举呢?zookeeper为什么 ...

随机推荐

  1. Java后端技术面试汇总(第二套)

    1.Java相关 • Arraylist与LinkedList默认空间是多少:• Arraylist与LinkedList区别与各自的优势List 和 Map 区别:• 谈谈HashMap,哈希表解决 ...

  2. Postgresql 大小版本升级

    文章结构如下: Postgresql是一个非常活跃的社区开源项目,更新速度很快,每一次版本的更新都会积极的修复旧版本的BUG,性能上也会有不同幅度的提升.10之前的版本由三部分组成,10开始只有两部分 ...

  3. vue开大主要难点解决方式

    问题:在我们那vue开发项目时,多层嵌套组件最繁琐,组件传参成最难的问题,并且对兄弟组件传参也无能为力,也会导致代码很难维护. 解决:采用vuex状态管理,把所有的事件和状态都储存在store对象中, ...

  4. ubuntu终端安装ss

    大概就是这样

  5. IDEA修改Maven全局配置

    在使用过程中发现,IDEA每次新建一个Project ,这个maven配置都会初始化默认的. 这里需要设置下全局配置: File -> Other Settings -> Settings ...

  6. php 多肽实例

    多态定义:只关心一个接口或者基类,而不关心一个对象的具体类.(同一类型,不同结果) 这里两个例子: 第一个,我们发现,基类定义了标准,子类进行了自我规则的实现.这是多态的一个要求.同时,这是满足重写: ...

  7. flume--为搬砖而生,日志传输的一把好手

    (一)flume的产生 为什么会有flume 随着互联网的发展,人们对网络日志产生的信息也越来越重视.不仅如此,我们的服务器,比如Nginx,每天都会产生大量的日志.我们要将这些日志收集到指定的地方, ...

  8. C#将html table 导出成excel实例

    public void ProcessRequest (HttpContext context) { string elxStr = "<table><tbody>& ...

  9. cmd拷贝文件夹时,处理提示

    xcopy 若目标盘上不存在此子目录,而在目标盘的结束符又不以"\"为结束,则将提示: does destination specify a file name or direct ...

  10. Linux vim替换命令

    #替换每一行的第一个a:%s/a/b/#全部替换:%s/a/b/g#替换/时需要转义"\/"