ZooKeeper 网络通信机制
Posted 郭朝阳@
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ZooKeeper 网络通信机制相关的知识,希望对你有一定的参考价值。
<font color=#999AAA ZooKeeper 网络通信机制
Zookeeper 内部的网络通信的具体实现
- 1、执行选举使用的是: BIO 通信(ServerSocket Socket)
- 2、ZooKeeper 作为一个 C/S 体系的软件,对外提供服务,是 NIO 实现
- 3、ZooKeeper 的 C/S 架构也提供了 netty 的实现,但是需要去配置才可以实现。默认是就是 NIO,从性能上来说使用NIO和Netty是一样的,netty只是对NIO进行了封装的框架。
ZooKeeper 内部在 3.4.14 版本以前都是使用的 单 selector 的实现!从 zookeeper-3.5.x 版本往后,采用了 一主(AcceptThread:OP_ACCEPT)多从(SelectorThread: OP_READ 和 OP_WRITE)的多线程 reactor 模式,事实上,真正完全数据读写工作,是一个线程池: WorkerThreaPool 性能得到了极大的提升。
如果你们的ZK集群并发能力不够, 1. 偶尔并发能力不足,可以增加obzerve节点。2. 经常性的并发能力不够增加follwer节点。
注意不是 一味的增加节点,并发量就能提升,可以升级版本试试,性能会有大幅度提升
Java IO
-
1、BIO JDK-1.1(编码简单,效率低) 阻塞模型
ZK选举过程中,多个节点之间的相互通信使用的网络通信模型 -
2、NIO JDK-1.4(效率有提升,编码复杂) 基于reactor实现的异步非阻塞网络通信模型
通常的IO的选择:
1、原生NIO
2、基于NIO实现的网络通信框架:netty -
3、AIO JDK-1.7(效率最高,编码复杂度一般) 真正的异步非阻塞通信模型
几乎不用
NIO 的三大API (不详细介绍NIO,直接谷歌百度资料)
1、Buffer 2、Channel 3、Selector
ZooKeeper 中的通信有两种方式
1、NIO,默认使用 NIO
2、Netty,未来版本
关于 ZooKeeper 中的服务端和客户端
- 1、服务端:QuorumPeer ===> 启动了 ServerCnxnFactory,启动了NIO服务端,监听了2181端口 ===> 接收到客户端的一个链接请求,则生成一个 ServerCnxn,当该对象创建好之后,会为当前这个客户端建立成功的链接,创建一个 Session 对象。
- 2、客户端:ZooKeeper ===> 启动和初始化了一个 ClientCnxn(SendThread EventThread) 对象,发送 ConnectRequest 给服务端
两个最重要的 API: C/S 架构模式
- 1、ServerCnxn 服务端的通信组件: zookeeper集群启动的时候,会初始化 ServerCnxn
- 2、ClientCnxn 客户端的通信组件: 当编写代码:new ZooKeeper(1,2,3) 底层会初始化一个通信客户端对象
关于客户端和服务端的一个定义:谁发请求,谁就是客户端,谁接收和处理请求,谁就是服务端
- 1、真正的 client 给 zookeeper 发请求
- 2、zookeeper 中的 leader 给 follower 发命令
- 3、zookeeper 中的 follower 给 leader 发请求
总结
后续的原代码中这李涉及的相关类和方法会有详细的注释。
ServerCnxn:org.apache.zookeeper.server.ServerCnxn
- Stats,表示ServerCnxn上的统计数据。
- Watcher,表示事件处理,监听器。
- ServerCnxn,表示服务器连接,表示一个从客户端到服务器的连接。
- ClientCnxn,存在于客户端用来执行通信的组件。
- NettyServerCnxn,基于Netty的连接的具体实现。
- NIOServerCnxn,基于NIO的连接的具体实现。
- ServerCnxnFactory, 服务端通信组件的工厂实现 也有两种:NioserverCnxnFactory + NettyServerCnxnFactory
以上是关于ZooKeeper 网络通信机制的主要内容,如果未能解决你的问题,请参考以下文章