zk源碼閱讀22:單機(jī)版服務(wù)器啟動(dòng)概述

摘要

本節(jié)大概的講解單機(jī)版服務(wù)端啟動(dòng)過(guò)程

服務(wù)端整體架構(gòu)如下圖


服務(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)其流程圖如下

單機(jī)版server啟動(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

預(yù)啟動(dòng)

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中

預(yù)啟動(dòng)1-4步驟

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中

預(yù)啟動(dòng)步驟6

紅框以下的就是下面的初始化步驟

初始化

初始化源碼從
org.apache.zookeeper.server.ZooKeeperServerMain#runFromConfig開始

包含有

zk server初始化

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中

初始化的1-4步

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

初始化6-7步

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中

初始化8-11步

問(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市味咳,隨后出現(xiàn)的幾起案子庇勃,更是在濱河造成了極大的恐慌,老刑警劉巖槽驶,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件责嚷,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡掂铐,警方通過(guò)查閱死者的電腦和手機(jī)罕拂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門揍异,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人聂受,你說(shuō)我怎么就攤上這事蒿秦。” “怎么了蛋济?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵棍鳖,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我碗旅,道長(zhǎng)渡处,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任祟辟,我火速辦了婚禮医瘫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘旧困。我一直安慰自己醇份,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布吼具。 她就那樣靜靜地躺著僚纷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拗盒。 梳的紋絲不亂的頭發(fā)上怖竭,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音陡蝇,去河邊找鬼痊臭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛登夫,可吹牛的內(nèi)容都是我干的广匙。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼恼策,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼艇潭!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起戏蔑,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鲁纠,沒(méi)想到半個(gè)月后总棵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡改含,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年情龄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡骤视,死狀恐怖鞍爱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情专酗,我是刑警寧澤睹逃,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站祷肯,受9級(jí)特大地震影響沉填,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜佑笋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一翼闹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蒋纬,春花似錦猎荠、人聲如沸疹尾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)凡伊。三九已至面睛,卻和暖如春脑溢,著一層夾襖步出監(jiān)牢的瞬間雀彼,已是汗流浹背县踢。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工瓷蛙, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留悼瓮,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓艰猬,卻偏偏與公主長(zhǎng)得像横堡,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子冠桃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容