知識要點(diǎn):
ZAB協(xié)議
ZooKeeper Session會話
StaticHostProvider
Chroot命名空間
關(guān)于ZXID
ZXID是一個(gè)64位的數(shù)據(jù)結(jié)構(gòu)绍在。分為高32位,低32位勺届。(由Leader產(chǎn)生, 而且它是自增唯-有順序性)
高32位用來存儲epoch (年號)歹垫。
低32位用來存儲事務(wù)編號。
有2種情況導(dǎo)致高32位會變化:
■事務(wù)編號滿了梧疲,觸發(fā)Leader選舉允睹。
■Leader重新選舉运准。
所有的事物性操作都是由Leader來進(jìn)行的,即便這個(gè)請求是Follower接收到缭受,F(xiàn)ollower也會把這個(gè)事務(wù)性請求轉(zhuǎn)發(fā)給Leader胁澳。
ZAB協(xié)議
什么是ZAB協(xié)議
ZooKeeper并沒有完全采用Paxos算法,而是使用了一種稱之為ZooKeeper Atomic Broadcat (ZAB,ZooKeeper原子消息廣播協(xié)議)的協(xié)議作為其數(shù)據(jù)一致性的核心算法米者。
ZAB協(xié)議并不像Paxos算法那樣韭畸,是一種通用的分布式一致性算法,它是一種特別為ZooKeeper設(shè)計(jì)的崩潰恢復(fù)的原子消息廣播算法蔓搞。ZooKeeper采用一 一個(gè)單-的主進(jìn)程接受并處理客戶端的所有事務(wù)請求胰丁,并將服務(wù)器數(shù)據(jù)的狀態(tài)變更以事務(wù)Proposal的形式廣播到所有的副本進(jìn)程上去。
ZAB協(xié)議包含兩種基本的模式:
■崩潰恢復(fù)
■消息廣播
ZAB協(xié)議包含三個(gè)階段:
階段1:發(fā)現(xiàn)(Leader選舉過程)
階段2:同步(數(shù)據(jù)同步過程)
階段3:廣播(正式接受請求過程)
崩潰恢復(fù)
當(dāng)整個(gè)服務(wù)器在啟動(dòng)過程中喂分,或者當(dāng)Leader服務(wù)器出現(xiàn)網(wǎng)絡(luò)中斷锦庸、崩潰退出與重啟等異常情況時(shí),ZAB協(xié)議就會進(jìn)入恢復(fù)模式并通過選舉產(chǎn)生新的Leader服務(wù)器蒲祈。
當(dāng)選舉產(chǎn)生了新的Leader服務(wù)器甘萧,同時(shí)集群中已經(jīng)有過半機(jī)器與該Leader服務(wù)器完成狀態(tài)同步之后,ZAB協(xié)議就會退出恢復(fù)模式。這里的狀態(tài)同步指的就是數(shù)據(jù)同步梆掸,用來保證集群中存在過半的機(jī)器能夠和L eader服務(wù)器的數(shù)據(jù)保持一致似扔。
■當(dāng)集群中有過半的Follower服務(wù)器完成和Leader服務(wù)器的同步已脓,那么整個(gè)服務(wù)器集群就可以進(jìn)入消息廣播模式身隐。
■當(dāng)新的機(jī)器加入集群其徙,由于集群已經(jīng)存在一個(gè)Leader, 那么新加入的機(jī)器會進(jìn)入數(shù)據(jù)同步模式,即找到Leader服務(wù)器钝鸽,并與其進(jìn)行數(shù)據(jù)同步汇恤。
■當(dāng)Leader崩潰退出或者重啟,或者及集群中不存在過半的服務(wù)器可以和Leader保持正常通信拔恰,那么在開始新一輪事務(wù)操作前所有機(jī)器會使用崩潰恢復(fù)協(xié)議來達(dá)到一個(gè)一致性的狀態(tài)因谎。
消息廣播
消息廣播類似于-個(gè)2PC提交過程。根據(jù)客戶端的事務(wù)請求颜懊,Leader服務(wù)器會為其生成對應(yīng)的事務(wù)投票(即Proposal)并將其發(fā)送給集群中其他服務(wù)器财岔,然后在分表搜集各自的選票,最后進(jìn)行事務(wù)提交河爹。
與2PC不同的是匠璧,ZAB協(xié)議沒有中斷邏輯(所有Follower要么對Leader提成的事務(wù)Ack,要么就不回應(yīng)),而且當(dāng)過半的Follower服務(wù)器反饋Ack之后就開始提交事務(wù)咸这,不用等待所有Follower都反饋夷恍。
整個(gè)消息廣播協(xié)議是基于FIFO特性的TCP協(xié)議來進(jìn)行網(wǎng)絡(luò)通信,因此能夠很容易地保證消息廣播過程中消息接受與發(fā)送的順序性媳维。
ZAB和Paxos
ZAB和Paxos的本質(zhì)區(qū)別在于設(shè)計(jì)目標(biāo)不同酿雪,ZAB用于構(gòu)建一個(gè)高可 用的分布式數(shù)據(jù)系統(tǒng)遏暴,而Paxos則用于構(gòu)建一個(gè)分布式一致性狀態(tài)機(jī)系統(tǒng)。
數(shù)據(jù)同步
數(shù)據(jù)同步過程就是將Leader服務(wù)器上面的數(shù)據(jù)同步到其他給其他服務(wù)器的過程指黎。
直接差異化同步
舉例朋凉,某個(gè)時(shí)刻Leader服務(wù) 器的事務(wù)隊(duì)列對應(yīng)的ZXID依次是:
0x200000001, 0x200000002, 0x200000003,0x200000004醋安,0x200000005
而需要數(shù)據(jù)同步的服務(wù)器最后處理的ZXID為:
0x200000003
這種場景就執(zhí)行“直接差異化同步”,Leader會依次將02x00000004, 0x200000005同步給服務(wù)器杂彭,同步
過程中順序如下:
StaticHostProvider
己實(shí)現(xiàn)了一種輪詢機(jī)制
ZooKeeper Session會話
■CONNECTING (正在連接)
■CONNECTED (已經(jīng)連接)
■RECONNECTING (重新連接)
■RECONNECTED (重新連接上)
■CLOSE (關(guān)閉)