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. git简易操作手册

    从远程仓库新建 $ git clone https://github.com/xxxr/Repository.git $ cd Repository/ $ git config --global us ...

  2. 创建全文索引----SQLserver

    1.启动 Microsoft Search 服务 开始菜单-->SQL程序组-->服务管理器-->下拉筐-->Microsoft Search 服务-->启动它. 2. ...

  3. 多线程编程-- part5.1 互斥锁ReentrantLock

    ReentrantLock简介 Reentrantlock是一个可重入的互斥锁,又被称为独占锁. Reentrantlock:分为公平锁和非公平锁,它们的区别体现在获取锁的机制上是否公平.“锁”是为了 ...

  4. 实体类与数据库字段不匹配问题,java.sql.SQLSyntaxErrorException: Unknown column 'xxx' in 'field list'

    控制台报错 ### Error querying database. Cause: java.sql.SQLSyntaxErrorException: Unknown column 'user_nam ...

  5. MySQL之RPM安装说明及配置

    1.查看当前系统是否安装过Linux rpm -qa | grep -i mysql 未安装无任何输出:安装会打印对应mysql的rpm安装包. 2.准备安装包: MySQL-client-5.5.4 ...

  6. 牛客练习赛26 E-树上路径 (树链剖分+线段树)

    链接:https://ac.nowcoder.com/acm/contest/180/E 来源:牛客网 树上路径 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语 ...

  7. C++中的变量属性小结

    其实在C++中,一个变量除了数据类型以外,还有3种属性: (1)存储类别:C++中允许使用auto,static,register,extern 4种存储类别. (2)作用域:指在程序中可以使用该变量 ...

  8. 第五章Java

    2 [单选题] 已知MyInterface是一个接口,ClassA是实现该接口的一个类,ClassB是ClassA的子类,则下面说法哪个正确?   A. ClassB obj = new ClassA ...

  9. 使用Nginx的proxy_cache缓存功能取代Squid[原创]

    使用Nginx的proxy_cache缓存功能取代Squid[原创] [文章作者:张宴 本文版本:v1.2 最后修改:2009.01.12 转载请注明原文链接:http://blog.zyan.cc/ ...

  10. 阅读之spring+Dubbo

    pringBoot+Dubbo 搭建一个简单的分布式服务 地址 什么是 Duboo? Apache Dubbo (incubating) |ˈdʌbəʊ| 是一款高性能.轻量级的开源Java RPC ...