文档章节

zk中选举Leader时的网络IO QuorumCnxManager解析

writeademo
 writeademo
发布于 10/14 16:26
字数 444
阅读 20
收藏 1

每台服务启动过程中,会启动一个QuorumCnxManager,负责各台服务器之间底层Leader选举过程中的网络通信

当集群中有服务器服务中断时,zk会重新选举leader

内部类

Message定义消息结构 包含了sid和内容ByteBuffer

ByteBuffer buffer;long sid;

InitialMessage

QuorumConnectionReqThread 发送连接请求类

QuorumConnectionReceiverThread

Listener 端口上的监听

SendWorker发送线程,从发送队列取出消息,发送给对应sid机器

一旦发现针对当前服务sid的消息队列为空,那么要从最近发送的消息中取出一条再次发送

为了保证服务端服务正常,zk能够保证重复消息进行正确处理

RecvWorker 接收消息的线程 不断从网络io中读取数据放入接收队列

 

 

 

类UML图

属性

RECV_CAPACITY

线程队列最大容量

SEND_CAPACITY

发送容量

PACKETMAXSIZE

包最大1024*512

observerCounter

观察者个数

QuorumPeer

集群数

mySid

ip地址

connectionExecutor

连接线程池服务执行者

authServer

已验证server

authLearner

学习者

connectionThreadCnt

处理连接的个数

recvQueue

接收队列

   
   

 

方法

初始化连接

public void initiateConnection(final Socket sock, final Long sid) {
    try {
        startConnection(sock, sid);
    } catch (IOException e) {
        LOG.error("Exception while connecting, id: {}, addr: {}, closing learner connection", new Object[]{sid, sock.getRemoteSocketAddress()}, e);
        closeSocket(sock);
        return;
    }
}


接收连接
public void receiveConnection(final Socket sock) {
    DataInputStream din = null;
    try {
        din = new DataInputStream(new BufferedInputStream(sock.getInputStream()));

        handleConnection(sock, din);
    } catch (IOException e) {
        LOG.error("Exception handling connection, addr: {}, closing server connection", sock.getRemoteSocketAddress());
        closeSocket(sock);
    }
}

© 著作权归作者所有

writeademo
粉丝 25
博文 692
码字总数 264466
作品 0
东城
私信 提问
zk集群版服务启动,Leader和Follower之间数据交互

集群版服务启动过程 LeaderElection算法 完成自己投票和投票算法的获取 集群特有,zookeeper首先会根据自身服务器id(sid) 最新的zxid(lastloggedZxid)和当前的服务器epoch(currentEpoch) 来生...

writeademo
10/12
15
0
ZooKeeper系列之(九):投票选举(1)

投票选举可以说是ZooKeeper中的难点所在,也是精华所在了。 ZooKeeper服务端集群在正常工作时需要一个Leader和无数个Follower,他们都对外提供统一的服务接口,客户端连接任意一台服务端发送...

守望者之父
09/09
14
0
Mesos+Marathon+Docker构建docker集群化管理

由Docker引领的容器技术最近一年在生产环境叫嚣的比较厉害,由于Docker本身拥有的一些特性,使得越来越多的人愿意并且想尝试在生产环境构建Docker,有关docker相关的介绍可以看我去年发布的文...

Andy-xu
2016/08/15
1K
0
深入分析ZooKeeper的实现原理

ZooKeeper的由来 主要是解决分布式环境下的服务协调问题而产生的,实现ZooKeeper需要做什么? 防止单点故障 所以这个中间件需要考虑到集群,而且这个集群还需要分摊客户端的请求流量 集群存在...

Java搬砖工程师
2018/11/19
190
0
分析Zookeeper的一致性原理

zookeeper(简称zk),顾名思义,为动物园管理员的意思,动物对应服务节点,zk是这些节点的管理者。在分布式场景中,zk的应用非常广泛,如:数据发布/订阅、命名服务、配置中心、分布式锁、集...

憬薇
2018/04/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

技术分享 | MySQL 8.0:字符集从 utf8 转换成 utf8mb4

作者:胡呈清 整理 MySQL 8.0 文档时发现一个变更:默认字符集由 latin1 变为 utf8mb4。想起以前整理过字符集转换文档,升级到 MySQL 8.0 后大概率会有字符集转换的需求,在此正好分享一下。...

爱可生
19分钟前
4
0
不管单机还是集群的限流实现已经给你准备好了

限流算法 计数器算法 维护一个counter,规定在单位时间内counter的大小不能超过最大值,每隔固定时间就将counter的值置零。如果这个counter大于设定的阈值,那么系统就拒绝请求 漏桶算法 维护...

阿提说说
30分钟前
4
0
文件管理

通过CLI登录进行文件管理 .表示当前目录,..表示父目录,具有隐藏文件。支持缩写与TAB键补全 1、目录操作 pwd#打印工作目录 cd <directory>#改变工作目录 dir [/all][<directory>]#查看目录内...

悠悠子佩
32分钟前
4
0
Netty学习笔记(10)——Netty中的Channel组件

1. Channel的功能 1. 与NIO中的Channel一样,它实现了网络操作的抽象类,聚合了一系列的网络IO功能,包括读写数据、建立连接、关闭连接等功能。通过外观模式,将数据读写、连接建立与断开等操...

江左煤郎
36分钟前
3
0
二叉树的深度

从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。 public int TreeDepth(TreeNode root) { return root == null ? 0 : 1 + Math.max(Tree...

Garphy
43分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部