赞
踩
待填坑
单点和集群部署见kafka篇
生产环境解压即可使用的zk: 见百度网盘
链接:https://pan.baidu.com/s/1ixZEKwtGsHfNSu5Qggw6Mw?pwd=h0h2
提取码:h0h2
zkCli.sh -server master:2181
进入交互界面后,按h
查看帮助
常用 ls /x/xx
get /xx/xx
stat xx
zooInspector
链接:https://pan.baidu.com/s/1MfWkKq05hR3LTcBdygs5YQ?pwd=pck4
提取码:pck4
入口类:QuorumPeerMain,调用initializeAndRun() 方法中会根据配置来决定启动单机Zookeeper还是集群Zookeeper
如果启动单机版,会调用 ZooKeeperServerMain.main(args); ,如果启动
集群版,会调用 QuorumPeerMain.runFromConfig(config);
runFromConfig 方法是单机版启动的主要方法,该方法会做如下几件事:
如何高效的与客户端进行通信,让网络 IO 不成为 ZooKeeper 的瓶颈是ZooKeeper 急需解决的问题, ZooKeeper 中使用 ServerCnxnFactory 管理与客户端的连接,其有两个实现:
一个是 NIOServerCnxnFactory ,使用Java原生 NIO 实现,为默认通信组件;
一个是NettyServerCnxnFactory ,使用netty实现;使用 ServerCnxn 代表一个客户端与服务端的连接。
NIOServerCnxnFactory 启动时会启动四类线程:
AcceptThread
run 执行 selector.select() ,并调用 doAccept() 接收客户端连接。该方法会轮询获取一个SelectorThread,将当前链接分配给该 SelectorThread
SelectorThread
run方法调select方法从Socket读取数据,并封装成 workRequest ,并将workRequest 交给 workerPool 工作线程池处理
select() 中的核心调用地方是handleIO()
WorkerThread
数据处理将有业务链对象RequestProcessor处理,通过 WorkerService 管理一组 worker thread 线程,前面我们在看 SelectorThread 的时候,能够看到workerPool 的schedule方法被执行,该方法创建了一个新的线程 ScheduledWorkRequest ,并启动了该线程。该线程doWork 方法,在该方法中会调用 doIO 执行IO数据处理
在服务端通过 SessionTrackerImpl 和 ExpiryQueue 来保存Session会话
信息。
创建会话调用 createSession(),
session刷新会经过 RequestThrottler的run方法中调用 zks.submitRequestNow() ,而zks.submitRequestNow(request) 中调用了 touch(si.cnxn);
session过期:调用sessionExpiryQueue.poll() ,该方法代码主要是获
取过期时间对应的客户端会话集合,setSessionClosing() 方法其实是把Session会话的 isClosing 状态设置为了true
启动
startLeaderElection() 开启Leader选举方法做了2件事,首先创建初始化选票选自己,接着创建选举投票方式,createElectionAlgorithm() 创建选举算法只有第3种创建了以下三个对象:
主要依赖于FastLeaderElection算法,是典型的Paxos算法,基于消息传递且具有高度容错特性的一致性算法,三个角色:
负责各台服务器之间的底层Leader选举过程中的网络通信对应的类就是 QuorumCnxManager 。QuorumPeer 主要包括四个组件:客户端请求接收器( ServerCnxnFactory )、数据引擎( ZKDatabase )、选举器( Election )、核心功能组件( Leader/Follower/Observer )。
所有节点初始状态都为LOOKING,会进入到选举流程,选举流程首先要获取算法,获取算法的方法是 makeLEStrategy() ,该方法返回的是FastLeaderElection 实例,核心选举流程是 FastLeaderElection 中的lookForLeader() 方法
过半数以上的方法 hasAllQuorums() 该方法用到了QuorumMaj 类
选票PK的方法 totalOrderPredicate() ,该方法其实就是Leader选举规则,
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。