jinfeng_wang

          G-G-S,D-D-U!

          BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
            400 Posts :: 0 Stories :: 296 Comments :: 0 Trackbacks
          http://www.cnblogs.com/leesf456/p/6105276.html

          一、前言

            前面已經(jīng)了解了Zookeeper會(huì)話相關(guān)知識(shí)點(diǎn),接著來(lái)學(xué)習(xí)Zookeeper服務(wù)端相關(guān)細(xì)節(jié)。

          二、服務(wù)端

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

            Zookeeper服務(wù)器的啟動(dòng),大致可以分為以下五個(gè)步驟

            1. 配置文件解析。

            2. 初始化數(shù)據(jù)管理器。

            3. 初始化網(wǎng)絡(luò)I/O管理器。

            4. 數(shù)據(jù)恢復(fù)。

            5. 對(duì)外服務(wù)。

            2.1 單機(jī)版服務(wù)器啟動(dòng)

            單機(jī)版服務(wù)器的啟動(dòng)其流程圖如下

            上圖的過(guò)程可以分為預(yù)啟動(dòng)初始化過(guò)程。

            1. 預(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í)清理。

              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)行初始化,包括連接器、內(nèi)存數(shù)據(jù)庫(kù)、請(qǐng)求處理器等組件的初始化。

            2. 初始化

              1. 創(chuàng)建服務(wù)器統(tǒng)計(jì)器ServerStats。ServerStats是Zookeeper服務(wù)器運(yùn)行時(shí)的統(tǒng)計(jì)器。

              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ò)連接工廠。

              5. 初始化ServerCnxnFactory。Zookeeper會(huì)初始化Thread作為ServerCnxnFactory的主線程,然后再初始化NIO服務(wù)器。

              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ù)。

              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ù)。

            至此,單機(jī)版的Zookeeper服務(wù)器啟動(dòng)完畢。

            2.2 集群服務(wù)器啟動(dòng)

            單機(jī)和集群服務(wù)器的啟動(dòng)在很多地方是一致的,其流程圖如下

            上圖的過(guò)程可以分為預(yù)啟動(dòng)、初始化、Leader選舉、Leader與Follower啟動(dòng)期交互過(guò)程、Leader與Follower啟動(dòng)等過(guò)程。

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

              1. 統(tǒng)一由QuorumPeerMain作為啟動(dòng)類。

              2. 解析配置文件zoo.cfg。

              3. 創(chuàng)建并啟動(dòng)歷史文件清理器DatadirCleanupFactory。

              4. 判斷當(dāng)前是集群模式還是單機(jī)模式的啟動(dòng)。在集群模式中,在zoo.cfg文件中配置了多個(gè)服務(wù)器地址,可以選擇集群?jiǎn)?dòng)。

            2. 初始化

              1. 創(chuàng)建ServerCnxnFactory。

              2. 初始化ServerCnxnFactory。

              3. 創(chuàng)建Zookeeper數(shù)據(jù)管理器FileTxnSnapLog。

              4. 創(chuàng)建QuorumPeer實(shí)例。Quorum是集群模式下特有的對(duì)象,是Zookeeper服務(wù)器實(shí)例(ZooKeeperServer)的托管者,QuorumPeer代表了集群中的一臺(tái)機(jī)器,在運(yùn)行期間,QuorumPeer會(huì)不斷檢測(cè)當(dāng)前服務(wù)器實(shí)例的運(yùn)行狀態(tài),同時(shí)根據(jù)情況發(fā)起Leader選舉。

              5. 創(chuàng)建內(nèi)存數(shù)據(jù)庫(kù)ZKDatabase。ZKDatabase負(fù)責(zé)管理ZooKeeper的所有會(huì)話記錄以及DataTree和事務(wù)日志的存儲(chǔ)。

              6. 初始化QuorumPeer。將核心組件如FileTxnSnapLog、ServerCnxnFactory、ZKDatabase注冊(cè)到QuorumPeer中,同時(shí)配置QuorumPeer的參數(shù),如服務(wù)器列表地址、Leader選舉算法和會(huì)話超時(shí)時(shí)間限制等。

              7. 恢復(fù)本地?cái)?shù)據(jù)。

              8. 啟動(dòng)ServerCnxnFactory主線程。

            3. Leader選舉

              1. 初始化Leader選舉。集群模式特有,Zookeeper首先會(huì)根據(jù)自身的服務(wù)器ID(SID)、最新的ZXID(lastLoggedZxid)和當(dāng)前的服務(wù)器epoch(currentEpoch)來(lái)生成一個(gè)初始化投票,在初始化過(guò)程中,每個(gè)服務(wù)器都會(huì)給自己投票。然后,根據(jù)zoo.cfg的配置,創(chuàng)建相應(yīng)Leader選舉算法實(shí)現(xiàn),Zookeeper提供了三種默認(rèn)算法(LeaderElection、AuthFastLeaderElection、FastLeaderElection),可通過(guò)zoo.cfg中的electionAlg屬性來(lái)指定,但現(xiàn)只支持FastLeaderElection選舉算法。在初始化階段,Zookeeper會(huì)創(chuàng)建Leader選舉所需的網(wǎng)絡(luò)I/O層QuorumCnxManager,同時(shí)啟動(dòng)對(duì)Leader選舉端口的監(jiān)聽,等待集群中其他服務(wù)器創(chuàng)建連接。

              2. 注冊(cè)JMX服務(wù)。

              3. 檢測(cè)當(dāng)前服務(wù)器狀態(tài)。運(yùn)行期間,QuorumPeer會(huì)不斷檢測(cè)當(dāng)前服務(wù)器狀態(tài)。在正常情況下,Zookeeper服務(wù)器的狀態(tài)在LOOKING、LEADING、FOLLOWING/OBSERVING之間進(jìn)行切換。在啟動(dòng)階段,QuorumPeer的初始狀態(tài)是LOOKING,因此開始進(jìn)行Leader選舉。

              4. Leader選舉。通過(guò)投票確定Leader,其余機(jī)器稱為Follower和Observer。具體算法在后面會(huì)給出。

            4. Leader和Follower啟動(dòng)期交互過(guò)程

              1. 創(chuàng)建Leader服務(wù)器和Follower服務(wù)器。完成Leader選舉后,每個(gè)服務(wù)器會(huì)根據(jù)自己服務(wù)器的角色創(chuàng)建相應(yīng)的服務(wù)器實(shí)例,并進(jìn)入各自角色的主流程。

              2. Leader服務(wù)器啟動(dòng)Follower接收器LearnerCnxAcceptor。運(yùn)行期間,Leader服務(wù)器需要和所有其余的服務(wù)器(統(tǒng)稱為L(zhǎng)earner)保持連接以確集群的機(jī)器存活情況,LearnerCnxAcceptor負(fù)責(zé)接收所有非Leader服務(wù)器的連接請(qǐng)求。

              3. Leader服務(wù)器開始和Leader建立連接。所有Learner會(huì)找到Leader服務(wù)器,并與其建立連接。

              4. Leader服務(wù)器創(chuàng)建LearnerHandler。Leader接收到來(lái)自其他機(jī)器連接創(chuàng)建請(qǐng)求后,會(huì)創(chuàng)建一個(gè)LearnerHandler實(shí)例,每個(gè)LearnerHandler實(shí)例都對(duì)應(yīng)一個(gè)Leader與Learner服務(wù)器之間的連接,其負(fù)責(zé)Leader和Learner服務(wù)器之間幾乎所有的消息通信和數(shù)據(jù)同步。

              5. 向Leader注冊(cè)。Learner完成和Leader的連接后,會(huì)向Leader進(jìn)行注冊(cè),即將Learner服務(wù)器的基本信息(LearnerInfo),包括SID和ZXID,發(fā)送給Leader服務(wù)器。

              6. Leader解析Learner信息,計(jì)算新的epoch。Leader接收到Learner服務(wù)器基本信息后,會(huì)解析出該Learner的SID和ZXID,然后根據(jù)ZXID解析出對(duì)應(yīng)的epoch_of_learner,并和當(dāng)前Leader服務(wù)器的epoch_of_leader進(jìn)行比較,如果該Learner的epoch_of_learner更大,則更新Leader的epoch_of_leader = epoch_of_learner + 1。然后LearnHandler進(jìn)行等待,直到過(guò)半Learner已經(jīng)向Leader進(jìn)行了注冊(cè),同時(shí)更新了epoch_of_leader后,Leader就可以確定當(dāng)前集群的epoch了。

              7. 發(fā)送Leader狀態(tài)。計(jì)算出新的epoch后,Leader會(huì)將該信息以一個(gè)LEADERINFO消息的形式發(fā)送給Learner,并等待Learner的響應(yīng)。

              8. Learner發(fā)送ACK消息。Learner接收到LEADERINFO后,會(huì)解析出epoch和ZXID,然后向Leader反饋一個(gè)ACKEPOCH響應(yīng)。

              9. 數(shù)據(jù)同步。Leader收到Learner的ACKEPOCH后,即可進(jìn)行數(shù)據(jù)同步。

              10. 啟動(dòng)Leader和Learner服務(wù)器。當(dāng)有過(guò)半Learner已經(jīng)完成了數(shù)據(jù)同步,那么Leader和Learner服務(wù)器實(shí)例就可以啟動(dòng)了。

            5. Leader和Follower啟動(dòng)

              1. 創(chuàng)建啟動(dòng)會(huì)話管理器。

              2. 初始化Zookeeper請(qǐng)求處理鏈,集群模式的每個(gè)處理器也會(huì)在啟動(dòng)階段串聯(lián)請(qǐng)求處理鏈。

              3. 注冊(cè)JMX服務(wù)。

            至此,集群版的Zookeeper服務(wù)器啟動(dòng)完畢。

          三、總結(jié)

            本篇博文分析了Zookeeper服務(wù)端的啟動(dòng)的詳細(xì)細(xì)節(jié),之后會(huì)給出具體的代碼分析。也謝謝各位園友的觀看~

          posted on 2016-12-28 15:04 jinfeng_wang 閱讀(243) 評(píng)論(0)  編輯  收藏 所屬分類: 2016-zookeeper
          主站蜘蛛池模板: 平山县| 仁化县| 洱源县| 敖汉旗| 邛崃市| 广昌县| 马尔康县| 太原市| 上虞市| 盘锦市| 林甸县| 东阿县| 乐清市| 定南县| 饶阳县| 合作市| 孝感市| 鄂托克旗| 和龙市| 东丰县| 聂拉木县| 德安县| 留坝县| 新乡市| 吉木乃县| 雅安市| 宁晋县| 英德市| 高阳县| 胶南市| 紫阳县| 呼伦贝尔市| 松潘县| 玛纳斯县| 开鲁县| 长子县| 调兵山市| 青冈县| 建德市| 铁岭市| 西乌珠穆沁旗|