400全國(guó)服務(wù)熱線代理順德手機(jī)網(wǎng)站建設(shè)sem推廣計(jì)劃
源碼項(xiàng)目zookeeper-3.6.3:核心工作流程
- ZooKeeper選舉和狀態(tài)同步結(jié)束之后的服務(wù)啟動(dòng)
- ZooKeeper SessionTracker啟動(dòng)和工作機(jī)制
ZooKeeper選舉和狀態(tài)同步結(jié)束之后的服務(wù)啟動(dòng)
在Leader的lead()方法的最后,即Leader完成了和集群過半Follower的同步之后,就會(huì)調(diào)用startZkServer()來啟動(dòng)必要的服務(wù),主要包括:
SessionTracker
RequestProcessor
更新Leader ZooKeeperServer的狀態(tài)
Leader.lead(){startZkServer(){zk.startup(){//ZooKeeperServer啟動(dòng)super.startup(){startupWithServerState(State.RUNNING);}//ZK Container ZNode定時(shí)清除任務(wù)if(containerManager != null){containerManager.start();}}}
}
同理,Follower也是一樣的,在完成了和Leader的狀態(tài)同步之后,也就是接收到Leader發(fā)送過來的NEWLEADER消息的時(shí)候,先拍攝快照,然后調(diào)用zk.startupWithoutServing()來啟動(dòng)Follower必要的一些基礎(chǔ)服務(wù),包括:
SessionTracker
RequestProcessor
更新Leader ZooKeeperServer的狀態(tài)
Leader.syncWithLeader(long newLeaderZxid){//創(chuàng)建SessionTackerzk.createSessionTracker();//啟動(dòng)一些服務(wù)zk.startupWithoutServing(){startupWithoutServerState(State.INITIAL);}
}
不管Leader還是Follower,最后都執(zhí)行startupWithServerState(State state),具體實(shí)現(xiàn):
ZooKeeperServer.startupWithServerState(State state){//創(chuàng)建和啟動(dòng)SessionTracker 重要if(sessionTracker == null){createSessionTracker();}startSessionTracker();//初始化RequestProcessors 重要setupRequestProcessors();//其他各項(xiàng)基礎(chǔ)服務(wù)startRequestThrottler();registerJMX();startJvmPauseMonitor();registerMetrics();//更新狀態(tài)為RUNNINGsetState(state);//解除其他線程的阻塞notifyAll();
}
ZooKeeper SessionTracker啟動(dòng)和工作機(jī)制
需求背景:現(xiàn)在每個(gè)客戶端鏈接到ZK服務(wù)器的時(shí)候,在服務(wù)器內(nèi)部,都會(huì)創(chuàng)建一個(gè)Session來管理這個(gè)鏈接
如果鏈接斷開,刪除這個(gè)session
如果鏈接超時(shí),刪除這個(gè)session(在規(guī)定的超時(shí)時(shí)間前,沒有任何動(dòng)作)
會(huì)遇到什么問題?大量的session管理,ZK提供的方案:桶管理機(jī)制(Session管理,Connection管理)
在Leader啟動(dòng)的時(shí)候,Leader會(huì)創(chuàng)建LeaderSessionTracker,在Follower啟動(dòng)的時(shí)候,內(nèi)部會(huì)創(chuàng)建一個(gè)LearnerSessionTracker。SessionTracker的內(nèi)部都有