ZooKeeperzookeeper源码9-ZooKeeper读写流程源码分析
Posted Aponson
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ZooKeeperzookeeper源码9-ZooKeeper读写流程源码分析相关的知识,希望对你有一定的参考价值。
源码项目zookeeper-3.6.3:核心工作流程
ZooKeeper选举和状态同步结束之后的服务启动
在Leader的lead()方法的最后,即Leader完成了和集群过半Follower的同步之后,就会调用startZkServer()来启动必要的服务,主要包括:
SessionTracker
RequestProcessor
更新Leader ZooKeeperServer的状态
Leader.lead()
startZkServer()
zk.startup()
//ZooKeeperServer启动
super.startup()
startupWithServerState(State.RUNNING);
//ZK Container ZNode定时清除任务
if(containerManager != null)
containerManager.start();
同理,Follower也是一样的,在完成了和Leader的状态同步之后,也就是接收到Leader发送过来的NEWLEADER消息的时候,先拍摄快照,然后调用zk.startupWithoutServing()来启动Follower必要的一些基础服务,包括:
SessionTracker
RequestProcessor
更新Leader ZooKeeperServer的状态
Leader.syncWithLeader(long newLeaderZxid)
//创建SessionTacker
zk.createSessionTracker();
//启动一些服务
zk.startupWithoutServing()
startupWithoutServerState(State.INITIAL);
不管Leader还是Follower,最后都执行startupWithServerState(State state),具体实现:
ZooKeeperServer.startupWithServerState(State state)
//创建和启动SessionTracker 重要
if(sessionTracker == null)
createSessionTracker();
startSessionTracker();
//初始化RequestProcessors 重要
setupRequestProcessors();
//其他各项基础服务
startRequestThrottler();
registerJMX();
startJvmPauseMonitor();
registerMetrics();
//更新状态为RUNNING
setState(state);
//解除其他线程的阻塞
notifyAll();
ZooKeeper SessionTracker启动和工作机制
需求背景:现在每个客户端链接到ZK服务器的时候,在服务器内部,都会创建一个Session来管理这个链接
如果链接断开,删除这个session
如果链接超时,删除这个session(在规定的超时时间前,没有任何动作)
会遇到什么问题?大量的session管理,ZK提供的方案:桶管理机制(Session管理,Connection管理)
在Leader启动的时候,Leader会创建LeaderSessionTracker,在Follower启动的时候,内部会创建一个LearnerSessionTracker。SessionTracker的内部都有
以上是关于ZooKeeperzookeeper源码9-ZooKeeper读写流程源码分析的主要内容,如果未能解决你的问题,请参考以下文章
ZooKeeperzookeeper源码9-ZooKeeper读写流程源码分析