Zookeeper 概念
Zookeeper 是一個分布式協(xié)調(diào)服務(wù)尺栖,可用于服務(wù)發(fā)現(xiàn)延赌,分布式鎖,分布式領(lǐng)導(dǎo)選舉痴颊,配置管理等屡贺。
Zookeeper 提供了一個類似于 Linux 文件系統(tǒng)的樹形結(jié)構(gòu)(可認(rèn)為是輕量級的內(nèi)存文件系統(tǒng)甩栈,但
只適合存少量信息,完全不適合存儲大量文件或者大文件)玉转,同時提供了對于每個節(jié)點(diǎn)的監(jiān)控與
通知機(jī)制殴蹄。
Zookeeper 角色
Zookeeper 集群是一個基于主從復(fù)制的高可用集群袭灯,每個服務(wù)器承擔(dān)如下三種角色中的一種
Leader
- 一個 Zookeeper 集群同一時間只會有一個實(shí)際工作的 Leader稽荧,它會發(fā)起并維護(hù)與各 Follwer
及 Observer 間的心跳。 - 所有的寫操作必須要通過 Leader 完成再由 Leader 將寫操作廣播給其它服務(wù)器畅卓。只要有超過
半數(shù)節(jié)點(diǎn)(不包括 observeer 節(jié)點(diǎn))寫入成功翁潘,該寫請求就會被提交(類 2PC 協(xié)議)唐础。
Follower
- 一個 Zookeeper 集群可能同時存在多個 Follower一膨,它會響應(yīng) Leader 的心跳,
- Follower 可直接處理并返回客戶端的讀請求豹绪,同時會將寫請求轉(zhuǎn)發(fā)給 Leader 處理瞒津,
- 并且負(fù)責(zé)在 Leader 處理寫請求時對請求進(jìn)行投票。
Observer
角色與 Follower 類似病毡,但是無投票權(quán)啦膜。Zookeeper 需保證高可用和強(qiáng)一致性淌喻,為了支持更多的客
戶端,需要增加更多 Server八拱;Server 增多肌稻,投票階段延遲增大匕荸,影響性能每聪;引入 Observer药薯,
Observer 不參與投票救斑; Observers 接受客戶端的連接脸候,并將寫請求轉(zhuǎn)發(fā)給 leader 節(jié)點(diǎn)运沦; 加入更
多 Observer 節(jié)點(diǎn),提高伸縮性嫁盲,同時不影響吞吐率羞秤。
ZAB 協(xié)議
事務(wù)編號 Zxid(事務(wù)請求計數(shù)器+ epoch)
在 ZAB ( ZooKeeper Atomic Broadcast , ZooKeeper 原子消息廣播協(xié)議) 協(xié)議的事務(wù)編號 Zxid
設(shè)計中瘾蛋,Zxid 是一個 64 位的數(shù)字哺哼,其中低 32 位是一個簡單的單調(diào)遞增的計數(shù)器幸斥,針對客戶端每
一個事務(wù)請求甲葬,計數(shù)器加 1;而高 32 位則代表 Leader 周期 epoch 的編號坡垫,每個當(dāng)選產(chǎn)生一個新
的 Leader 服務(wù)器画侣,就會從這個 Leader 服務(wù)器上取出其本地日志中最大事務(wù)的 ZXID溉卓,并從中讀取
epoch 值搬泥,然后加 1,以此作為新的 epoch尉尾,并將低 32 位從 0 開始計數(shù)沙咏。
Zxid(Transaction id)類似于 RDBMS 中的事務(wù) ID肢藐,用于標(biāo)識一次更新操作的 Proposal(提議)
ID窖壕。為了保證順序性瞻讽,該 zkid 必須單調(diào)遞增。
epoch
epoch:可以理解為當(dāng)前集群所處的年代或者周期晌砾,每個 leader 就像皇帝养匈,都有自己的年號呕乎,所
以每次改朝換代猬仁,leader 變更之后先誉,都會在前一個年代的基礎(chǔ)上加 1。這樣就算舊的 leader 崩潰
恢復(fù)之后诈闺,也沒有人聽他的了,因為 follower 只聽從當(dāng)前年代的 leader 的命令刃滓。
Zab 協(xié)議有兩種模式-恢復(fù)模式(選主)、廣播模式(同步)
Zab 協(xié)議有兩種模式注盈,它們分別是恢復(fù)模式(選主)和廣播模式(同步)。當(dāng)服務(wù)啟動或者在領(lǐng)導(dǎo)
者崩潰后叙赚,Zab 就進(jìn)入了恢復(fù)模式老客,當(dāng)領(lǐng)導(dǎo)者被選舉出來,且大多數(shù) Server 完成了和 leader 的狀
態(tài)同步以后震叮,恢復(fù)模式就結(jié)束了胧砰。狀態(tài)同步保證了 leader 和 Server 具有相同的系統(tǒng)狀態(tài)。
ZAB 協(xié)議 4 階段
-
** Leader election(選舉階段-選出準(zhǔn) Leader)**
Leader election(選舉階段):節(jié)點(diǎn)在一開始都處于選舉階段苇瓣,只要有一個節(jié)點(diǎn)得到超半數(shù)
節(jié)點(diǎn)的票數(shù)尉间,它就可以當(dāng)選準(zhǔn) leader。只有到達(dá) 廣播階段(broadcast) 準(zhǔn) leader 才會成
為真正的 leader。這一階段的目的是就是為了選出一個準(zhǔn) leader哲嘲,然后進(jìn)入下一個階段贪薪。 ** Discovery(發(fā)現(xiàn)階段-接受提議、生成 epoch霍弹、接受 epoch)**
Discovery(發(fā)現(xiàn)階段):在這個階段台丛,followers 跟準(zhǔn) leader 進(jìn)行通信,同步 followers
最近接收的事務(wù)提議。這個一階段的主要目的是發(fā)現(xiàn)當(dāng)前大多數(shù)節(jié)點(diǎn)接收的最新提議荣德,并且
準(zhǔn) leader 生成新的 epoch署咽,讓 followers 接受,更新它們的 accepted Epoch。
一個 follower 只會連接一個 leader蓉媳,如果有一個節(jié)點(diǎn) f 認(rèn)為另一個 follower p 是 leader狠角,f
在嘗試連接 p 時會被拒絕,f 被拒絕之后晓勇,就會進(jìn)入重新選舉階段。
- ** Synchronization(同步階段-同步 follower 副本)**
Synchronization(同步階段):同步階段主要是利用 leader 前一階段獲得的最新提議歷史铝噩,
同步集群中所有的副本年叮。只有當(dāng) 大多數(shù)節(jié)點(diǎn)都同步完成,準(zhǔn) leader 才會成為真正的 leader。
follower 只會接收 zxid 比自己的 lastZxid 大的提議裹粤。
- ** Broadcast(廣播階段-leader 消息廣播)**
Broadcast(廣播階段):到了這個階段,Zookeeper 集群才能正式對外提供事務(wù)服務(wù),
并且 leader 可以進(jìn)行消息廣播序芦。同時如果有新的節(jié)點(diǎn)加入,還需要對新節(jié)點(diǎn)進(jìn)行同步。
ZAB 提交事務(wù)并不像 2PC 一樣需要全部 follower 都 ACK,只需要得到超過半數(shù)的節(jié)點(diǎn)的 ACK 就
可以了。
- ** ZAB 協(xié)議 JAVA 實(shí)現(xiàn)(FLE-發(fā)現(xiàn)階段和同步合并為 Recovery Phase(恢復(fù)階段)**
協(xié)議的 Java 版本實(shí)現(xiàn)跟上面的定義有些不同,選舉階段使用的是 Fast Leader Election(FLE)柑司,
它包含了 選舉的發(fā)現(xiàn)職責(zé)隅津。因為 FLE 會選舉擁有最新提議歷史的節(jié)點(diǎn)作為 leader,這樣就省去了
發(fā)現(xiàn)最新提議的步驟。實(shí)際的實(shí)現(xiàn)將 發(fā)現(xiàn)階段 和 同步合并為 Recovery Phase(恢復(fù)階段)确买。所
以搀缠,ZAB 的實(shí)現(xiàn)只有三個階段:Fast Leader Election;Recovery Phase;Broadcast Phase璧眠。
投票機(jī)制
每個 sever 首先給自己投票,然后用自己的選票和其他 sever 選票對比灾螃,權(quán)重大的勝出靴拱,使用權(quán)
重較大的更新自身選票箱初家。具體選舉過程如下:
每個 Server 啟動以后都詢問其它的 Server 它要投票給誰掖肋。對于其他 server 的詢問紊浩,
server 每次根據(jù)自己的狀態(tài)都回復(fù)自己推薦的 leader 的 id 和上一次處理事務(wù)的 zxid(系
統(tǒng)啟動時每個 server 都會推薦自己)收到所有 Server 回復(fù)以后,就計算出 zxid 最大的哪個 Server聋庵,并將這個 Server 相關(guān)信
息設(shè)置成下一次要投票的 Server膘融。
計算這過程中獲得票數(shù)最多的的 sever 為獲勝者,如果獲勝者的票數(shù)超過半數(shù)祭玉,則改
server 被選為 leader氧映。否則,繼續(xù)這個過程脱货,直到 leader 被選舉出來leader 就會開始等待 server 連接
Follower 連接 leader岛都,將最大的 zxid 發(fā)送給 leader
Leader 根據(jù) follower 的 zxid 確定同步點(diǎn)律姨,至此選舉階段完成。
選舉階段完成 Leader 同步后通知 follower 已經(jīng)成為 uptodate 狀態(tài)
Follower 收到 uptodate 消息后臼疫,又可以重新接受 client 的請求進(jìn)行服務(wù)了
投票過程舉例:目前有 5 臺服務(wù)器择份,每臺服務(wù)器均沒有數(shù)據(jù),它們的編號分別是 1,2,3,4,5,按編號依次啟動烫堤,它們
的選擇舉過程如下荣赶。
服務(wù)器 1 啟動,給自己投票鸽斟,然后發(fā)投票信息拔创,由于其它機(jī)器還沒有啟動所以它收不到反
饋信息,服務(wù)器 1 的狀態(tài)一直屬于 Looking富蓄。服務(wù)器 2 啟動剩燥,給自己投票,同時與之前啟動的服務(wù)器 1 交換結(jié)果立倍,由于服務(wù)器 2 的編號
大所以服務(wù)器 2 勝出灭红,但此時投票數(shù)沒有大于半數(shù),所以兩個服務(wù)器的狀態(tài)依然是
LOOKING口注。服務(wù)器 3 啟動比伏,給自己投票,同時與之前啟動的服務(wù)器 1,2 交換信息疆导,由于服務(wù)器 3 的編
號最大所以服務(wù)器 3 勝出赁项,此時投票數(shù)正好大于半數(shù),所以服務(wù)器 3 成為領(lǐng)導(dǎo)者澈段,服務(wù)器
1,2 成為小弟悠菜。服務(wù)器 4 啟動,給自己投票败富,同時與之前啟動的服務(wù)器 1,2,3 交換信息悔醋,盡管服務(wù)器 4 的
編號大,但之前服務(wù)器 3 已經(jīng)勝出兽叮,所以服務(wù)器 4 只能成為小弟芬骄。服務(wù)器 5 啟動,后面的邏輯同服務(wù)器 4 成為小弟鹦聪。
小結(jié)
本篇幅账阻,我們一起熟悉了zookeeper的基本概念,以及它的一些基本角色泽本,以及ZAB協(xié)議和投票機(jī)制淘太,后續(xù)我們再來討論一下Zookeeper相關(guān)的工作原理和Znode。
本文由博客一文多發(fā)平臺 OpenWrite 發(fā)布!