zk源碼閱讀26:集群版服務(wù)器啟動概述

摘要

本節(jié)結(jié)合源碼對集群版服務(wù)器啟動進行概述,流程圖如下


集群版服務(wù)器啟動

主要分為

  預(yù)啟動
  初始化
  Leader選舉(選舉算法在之后講)
  Leader和Follower啟動期交互過程
  Leader和Follower啟動

這里都是概述意荤,沒有詳細分析源碼,下面幾節(jié)展開分析

預(yù)啟動

1. 統(tǒng)一由QuorumPeerMain作為啟動類趴泌。
2. 解析配置文件zoo.cfg愉舔。
3. 創(chuàng)建并啟動歷史文件清理器DatadirCleanupFactory育勺。
4. 判斷當前是集群模式還是單機模式的啟動。
    在集群模式中怀浆,在zoo.cfg文件中配置了多個服務(wù)器地址扬蕊,可以選擇集群啟動肤粱。

上述代碼都在org.apache.zookeeper.server.quorum.QuorumPeerMain#initializeAndRun中,截圖如下

預(yù)啟動的4個步驟

初始化

1. 創(chuàng)建ServerCnxnFactory厨相。
2. 初始化ServerCnxnFactory。
3. 創(chuàng)建Zookeeper數(shù)據(jù)管理器FileTxnSnapLog鸥鹉。
4. 創(chuàng)建QuorumPeer實例蛮穿。
    Quorum是集群模式下特有的對象,是Zookeeper服務(wù)器實例(ZooKeeperServer)的托管者毁渗,QuorumPeer代表了集群中的一臺機器
    在運行期間践磅,QuorumPeer會不斷檢測當前服務(wù)器實例的運行狀態(tài),同時根據(jù)情況發(fā)起Leader選舉灸异。
5. 創(chuàng)建內(nèi)存數(shù)據(jù)庫ZKDatabase府适。
    ZKDatabase負責管理ZooKeeper的所有會話記錄以及DataTree和事務(wù)日志的存儲羔飞。
6. 初始化QuorumPeer。
    將核心組件如FileTxnSnapLog檐春、ServerCnxnFactory逻淌、ZKDatabase注冊到QuorumPeer中,同時配置QuorumPeer的參數(shù)疟暖,如服務(wù)器列表地址卡儒、Leader選舉算法和會話超時時間限制等。
7. 恢復(fù)本地數(shù)據(jù)俐巴。
8. 啟動ServerCnxnFactory主線程骨望。

其中1-6步在org.apache.zookeeper.server.quorum.QuorumPeerMain#runFromConfig中,順序不完全一樣

初始化1-6步

7-8步在org.apache.zookeeper.server.quorum.QuorumPeer#start中

    @Override
    public synchronized void start() {
        loadDataBase();//從事務(wù)日志目錄dataLogDir和數(shù)據(jù)快照目錄dataDir中恢復(fù)出DataTree數(shù)據(jù)
        cnxnFactory.start();//開啟對客戶端的連接端口,啟動ServerCnxnFactory主線程
        startLeaderElection();//創(chuàng)建出選舉算法
        super.start();//啟動QuorumPeer線程欣舵,在該線程中進行服務(wù)器狀態(tài)的檢查
    }

leader選舉

1. 初始化Leader選舉算法

集群模式特有擎鸠,Zookeeper首先會根據(jù)自身的服務(wù)器ID(SID)、最新的ZXID(lastLoggedZxid)和當前的服務(wù)器epoch(currentEpoch)來生成一個初始化投票
在初始化過程中缘圈,每個服務(wù)器都會給自己投票劣光。然后,根據(jù)zoo.cfg的配置准验,創(chuàng)建相應(yīng)Leader選舉算法實現(xiàn)
Zookeeper提供了三種默認算法(LeaderElection赎线、AuthFastLeaderElection、FastLeaderElection)糊饱,可通過zoo.cfg中的electionAlg屬性來指定垂寥,但現(xiàn)只支持FastLeaderElection選舉算法。
在初始化階段另锋,Zookeeper會創(chuàng)建Leader選舉所需的網(wǎng)絡(luò)I/O層QuorumCnxManager滞项,同時啟動對Leader選舉端口的監(jiān)聽,等待集群中其他服務(wù)器創(chuàng)建連接夭坪。

源碼在QuorumPeer#startLeaderElection中
完成自己的投票以及投票算法的獲取

2.注冊JMX服務(wù)文判。

代碼在org.apache.zookeeper.server.quorum.QuorumPeer#run中

3.檢測當前服務(wù)器狀態(tài)

運行期間,QuorumPeer會不斷檢測當前服務(wù)器狀態(tài)室梅。在正常情況下戏仓,Zookeeper服務(wù)器的狀態(tài)在LOOKING、LEADING亡鼠、FOLLOWING/OBSERVING之間進行切換赏殃。在啟動階段,QuorumPeer的初始狀態(tài)是LOOKING间涵,因此開始進行Leader選舉仁热。

4. Leader選舉。

通過投票確定Leader勾哩,其余機器稱為Follower和Observer抗蠢。具體算法在后面會給出举哟。
源碼體現(xiàn)在org.apache.zookeeper.server.quorum.Election#lookForLeader
默認實現(xiàn)org.apache.zookeeper.server.quorum.FastLeaderElection#lookForLeader

上述步驟在

leader選舉步驟源碼.png

2-4的源碼步驟太長了,這里不貼出來了迅矛,就在QuorumPeer#run中

Leader和Follower啟動期交互過程

leader和follower服務(wù)器啟動交互過程

創(chuàng)建Leader服務(wù)器和Follower服務(wù)器妨猩。完成Leader選舉后扳埂,每個服務(wù)器會根據(jù)自己服務(wù)器的角色創(chuàng)建相應(yīng)的服務(wù)器實例趋急,并進入各自角色的主流程同欠。
源碼體現(xiàn)在org.apache.zookeeper.server.quorum.QuorumPeer#run
中switch不同的case

1.Leader服務(wù)器啟動Follower接收器LearnerCnxAcceptor(leader端)

運行期間漠嵌,Leader服務(wù)器需要和所有其余的服務(wù)器(統(tǒng)稱為Learner)保持連接以確集群的機器存活情況湾揽,LearnerCnxAcceptor負責接收所有非Leader服務(wù)器的連接請求珍策。

2.Learner服務(wù)器開始和Leader建立連接劝萤。(learner端)

所有Learner會找到Leader服務(wù)器吵血,并與其建立連接票堵。

3.Leader服務(wù)器創(chuàng)建LearnerHandler(leader端)

Leader接收到來自其他機器連接創(chuàng)建請求后扼睬,會創(chuàng)建一個LearnerHandler實例,每個LearnerHandler實例都對應(yīng)一個Leader與Learner服務(wù)器之間的連接悴势,其負責Leader和Learner服務(wù)器之間幾乎所有的消息通信和數(shù)據(jù)同步窗宇。

4.向Leader注冊(learner端)

Learner完成和Leader的連接后,會向Leader進行注冊特纤,即將Learner服務(wù)器的基本信息(LearnerInfo)军俊,包括SID和ZXID,發(fā)送給Leader服務(wù)器捧存。

5.Leader解析Learner信息粪躬,計算新的epoch(leader端)

Leader接收到Learner服務(wù)器基本信息后,會解析出該Learner的SID和ZXID昔穴,然后根據(jù)ZXID解析出對應(yīng)的epoch_of_learner镰官,并和當前Leader服務(wù)器的epoch_of_leader進行比較,如果該Learner的epoch_of_learner更大吗货,則更新Leader的epoch_of_leader = epoch_of_learner + 1泳唠。然后LearnHandler進行等待,直到過半Learner已經(jīng)向Leader進行了注冊宙搬,同時更新了epoch_of_leader后笨腥,Leader就可以確定當前集群的epoch了。

6.發(fā)送Leader狀態(tài)勇垛。(leader端)

計算出新的epoch后扇雕,Leader會將該信息以一個LEADERINFO消息的形式發(fā)送給Learner,并等待Learner的響應(yīng)窥摄。

7.Learner發(fā)送ACK消息。(learner端)

Learner接收到LEADERINFO后础淤,會解析出epoch和ZXID崭放,然后向Leader反饋一個ACKEPOCH響應(yīng)哨苛。

8.數(shù)據(jù)同步(leader端)

Leader收到Learner的ACKEPOCH后,即可進行數(shù)據(jù)同步币砂。

9.啟動Leader和Learner服務(wù)器建峭。(learner和leader)

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

源碼部分

leader部分在 org.apache.zookeeper.server.quorum.Leader#lead
follower部分在 org.apache.zookeeper.server.quorum.Follower#followLeader

Leader和Follower啟動

1. 創(chuàng)建啟動會話管理器亿蒸。
2. 初始化Zookeeper請求處理鏈,集群模式的每個處理器也會在啟動階段串聯(lián)請求處理鏈掌桩。
3. 注冊JMX服務(wù)边锁。

對應(yīng)的代碼在
Learner#syncWithLeader 調(diào)用 ZooKeeperServer#startup
Leader#startZkServer 調(diào)用 ZooKeeperServer#startup

思考

何時進行l(wèi)eader選舉的

QuorumPeer#run中,初始狀態(tài)是LOOKING
因此調(diào)用了

setCurrentVote(makeLEStrategy().lookForLeader());

的邏輯波岛,lookForLeader就根據(jù)選舉算法產(chǎn)生了leader茅坛,具體算法過程之后再講

選舉算法中,目前只支持FastLeaderElection,體現(xiàn)在哪

org.apache.zookeeper.server.quorum.QuorumPeerConfig#electionAlg
值固定為3

然后解析config的時候
org.apache.zookeeper.server.quorum.QuorumPeerMain#runFromConfig
執(zhí)行

quorumPeer.setElectionType(config.getElectionAlg());

也就是quorumPeer的ElectionAlg是3

然后創(chuàng)建選舉算法時
org.apache.zookeeper.server.quorum.QuorumPeer#startLeaderElection
org.apache.zookeeper.server.quorum.QuorumPeer#createElectionAlgorithm
帶入的參數(shù)也就是3
進入


case 3:FastLeaderElection

問題

leader創(chuàng)立之后怎么知道learner的地址是什么则拷,否則LearnerCnxAcceptor怎么接收所有非Leader服務(wù)器的連接請求

沒看出來哪里體現(xiàn)贡蓖,也就是說我可以外部搞一個端口來完成和leader的交互?煌茬?斥铺?

refer

http://www.cnblogs.com/leesf456/p/6105276.html
https://my.oschina.net/xianggao/blog/538746
《paxos到zk》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市坛善,隨后出現(xiàn)的幾起案子晾蜘,更是在濱河造成了極大的恐慌,老刑警劉巖浑吟,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件笙纤,死亡現(xiàn)場離奇詭異,居然都是意外死亡组力,警方通過查閱死者的電腦和手機省容,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來燎字,“玉大人腥椒,你說我怎么就攤上這事『蜓埽” “怎么了笼蛛?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蛉鹿。 經(jīng)常有香客問我滨砍,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任惋戏,我火速辦了婚禮领追,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘响逢。我一直安慰自己绒窑,他們只是感情好,可當我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布舔亭。 她就那樣靜靜地躺著些膨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪钦铺。 梳的紋絲不亂的頭發(fā)上订雾,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天,我揣著相機與錄音职抡,去河邊找鬼葬燎。 笑死,一個胖子當著我的面吹牛缚甩,可吹牛的內(nèi)容都是我干的谱净。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼擅威,長吁一口氣:“原來是場噩夢啊……” “哼壕探!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起郊丛,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤李请,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后厉熟,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體导盅,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年揍瑟,在試婚紗的時候發(fā)現(xiàn)自己被綠了白翻。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡绢片,死狀恐怖滤馍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情底循,我是刑警寧澤巢株,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站熙涤,受9級特大地震影響阁苞,放射性物質(zhì)發(fā)生泄漏困檩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一那槽、第九天 我趴在偏房一處隱蔽的房頂上張望窗看。 院中可真熱鬧,春花似錦倦炒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至涤浇,卻和暖如春鳖藕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背只锭。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工著恩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蜻展。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓喉誊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親纵顾。 傳聞我的和親對象是個殘疾皇子伍茄,可洞房花燭夜當晚...
    茶點故事閱讀 44,689評論 2 354

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