摘要
本節(jié)大概的講解單機(jī)版服務(wù)端啟動(dòng)過(guò)程
服務(wù)端整體架構(gòu)如下圖
圖中的SessionTracker咏花,F(xiàn)ileTxnSnapLog密强,F(xiàn)ileTxnLog前酿,F(xiàn)ileSnap贼急,DataTreem,SessionTracker已經(jīng)在前面講解過(guò)
單機(jī)版server啟動(dòng)概述
單機(jī)版服務(wù)器的啟動(dòng)其流程圖如下
上圖的過(guò)程可以分為預(yù)啟動(dòng)和初始化過(guò)程喜喂。
單機(jī)版server啟動(dòng)過(guò)程詳解
預(yù)啟動(dòng)
源碼主要參照
org.apache.zookeeper.server.quorum.QuorumPeerMain#main
org.apache.zookeeper.server.quorum.QuorumPeerMain#initializeAndRun
1.統(tǒng)一由QuorumPeerMain作為啟動(dòng)類
無(wú)論單機(jī)或集群,在zkServer.cmd和zkServer.sh中都配置了QuorumPeerMain作為啟動(dòng)入口類竿裂。
2. 解析配置文件zoo.cfg
zoo.cfg配置運(yùn)行時(shí)的基本參數(shù),如tickTime照弥、dataDir腻异、clientPort等參數(shù)。
3.創(chuàng)建并啟動(dòng)歷史文件清理器DatadirCleanupManager
對(duì)事務(wù)日志和快照數(shù)據(jù)文件進(jìn)行定時(shí)清理这揣。
源碼見org.apache.zookeeper.server.PurgeTxnLog
比較簡(jiǎn)單悔常,這里就是有個(gè)問(wèn)題
如果日志清理了,server掛了怎么恢復(fù)
4.判斷當(dāng)前是集群模式還是單機(jī)模式啟動(dòng)给赞。
若是單機(jī)模式机打,則委托給ZooKeeperServerMain進(jìn)行啟動(dòng)。
5.再次進(jìn)行配置文件zoo.cfg的解析
6.創(chuàng)建服務(wù)器實(shí)例ZooKeeperServer片迅。
Zookeeper服務(wù)器首先會(huì)進(jìn)行服務(wù)器實(shí)例的創(chuàng)建残邀,然后對(duì)該服務(wù)器實(shí)例進(jìn)行初始化
初始化在下面初始化的章節(jié)講解
預(yù)啟動(dòng)源碼
上面1-4部分,源碼在org.apache.zookeeper.server.quorum.QuorumPeerMain#initializeAndRun中
5部分在org.apache.zookeeper.server.ZooKeeperServerMain#main中
public static void main(String[] args) {
ZooKeeperServerMain main = new ZooKeeperServerMain();
try {
main.initializeAndRun(args);//單機(jī)版啟動(dòng)
}
...
6部分在org.apache.zookeeper.server.ZooKeeperServerMain#initializeAndRun中
紅框以下的就是下面的初始化步驟
初始化
初始化源碼從
org.apache.zookeeper.server.ZooKeeperServerMain#runFromConfig開始
包含有
1. 創(chuàng)建服務(wù)器統(tǒng)計(jì)器ServerStats。
ServerStats是Zookeeper服務(wù)器運(yùn)行時(shí)的統(tǒng)計(jì)器芥挣。
源碼在org.apache.zookeeper.server.ZooKeeperServer#ZooKeeperServer()中
2.創(chuàng)建Zookeeper數(shù)據(jù)管理器FileTxnSnapLog
FileTxnSnapLog是Zookeeper上層服務(wù)器和底層數(shù)據(jù)存儲(chǔ)之間的對(duì)接層驱闷,提供了一系列操作數(shù)據(jù)文件的接口,如事務(wù)日志文件和快照數(shù)據(jù)文件空免。Zookeeper根據(jù)zoo.cfg文件中解析出的快照數(shù)據(jù)目錄dataDir和事務(wù)日志目錄dataLogDir來(lái)創(chuàng)建FileTxnSnapLog空另。
3.設(shè)置服務(wù)器tickTime和會(huì)話超時(shí)時(shí)間限制。
4.創(chuàng)建ServerCnxnFactory蹋砚。
通過(guò)配置系統(tǒng)屬性zookeper.serverCnxnFactory來(lái)指定使用Zookeeper自己實(shí)現(xiàn)的NIO還是使用Netty框架作為Zookeeper服務(wù)端網(wǎng)絡(luò)連接工廠扼菠。
上面四部分的源碼都在org.apache.zookeeper.server.ZooKeeperServerMain#runFromConfig中
5. 初始化ServerCnxnFactory。
Zookeeper會(huì)初始化Thread作為ServerCnxnFactory的主線程坝咐,然后再初始化NIO服務(wù)器循榆。
默認(rèn)實(shí)現(xiàn)在org.apache.zookeeper.server.NIOServerCnxnFactory#configure中
@Override
public void configure(InetSocketAddress addr, int maxcc) throws IOException {
configureSaslLogin();
thread = new ZooKeeperThread(this, "NIOServerCxn.Factory:" + addr);//初始化線程
thread.setDaemon(true);
maxClientCnxns = maxcc;
this.ss = ServerSocketChannel.open();
ss.socket().setReuseAddress(true);
LOG.info("binding to port " + addr);
ss.socket().bind(addr);
ss.configureBlocking(false);
ss.register(selector, SelectionKey.OP_ACCEPT);
}
6. 啟動(dòng)ServerCnxnFactory主線程
進(jìn)入Thread的run方法,此時(shí)服務(wù)端還不能處理客戶端請(qǐng)求畅厢。
7. 恢復(fù)本地?cái)?shù)據(jù)冯痢。
啟動(dòng)時(shí),需要從本地快照數(shù)據(jù)文件和事務(wù)日志文件進(jìn)行數(shù)據(jù)恢復(fù)框杜。
6和7部分的代碼在
org.apache.zookeeper.server.NIOServerCnxnFactory#startup
org.apache.zookeeper.server.ServerCnxnFactory#startup
中
8. 創(chuàng)建并啟動(dòng)會(huì)話管理器浦楣。
Zookeeper會(huì)創(chuàng)建會(huì)話管理器SessionTracker進(jìn)行會(huì)話管理。
9. 初始化Zookeeper的請(qǐng)求處理鏈咪辱。
Zookeeper請(qǐng)求處理方式為責(zé)任鏈模式的實(shí)現(xiàn)振劳。會(huì)有多個(gè)請(qǐng)求處理器依次處理一個(gè)客戶端請(qǐng)求,在服務(wù)器啟動(dòng)時(shí)油狂,會(huì)將這些請(qǐng)求處理器串聯(lián)成一個(gè)請(qǐng)求處理鏈历恐。
10.注冊(cè)JMX服務(wù)。
Zookeeper會(huì)將服務(wù)器運(yùn)行時(shí)的一些信息以JMX的方式暴露給外部专筷。
11.注冊(cè)Zookeeper服務(wù)器實(shí)例弱贼。
將Zookeeper服務(wù)器實(shí)例注冊(cè)給ServerCnxnFactory,之后Zookeeper就可以對(duì)外提供服務(wù)磷蛹。
8-11步驟在
org.apache.zookeeper.server.ZooKeeperServer#startup中
問(wèn)題
歷史文件清理器DatadirCleanupManager
如果把日志清除了吮旅,會(huì)不會(huì)出現(xiàn)server掛了然后恢復(fù)不了的情況
refer
http://www.cnblogs.com/leesf456/p/6105276.html
https://my.oschina.net/pingpangkuangmo/blog/491673
https://my.oschina.net/xianggao/blog/537902