定義
Zookeeper Atomic Broadcast
Zookeeper 是通過 Zab 協(xié)議來保證分布式事務(wù)的最終一致性。
原因
Multi-Paxos 雖然能就一系列值達(dá)成共識(shí),但不關(guān)心共識(shí)后的值是什么,同時(shí)它也不關(guān)心指令的順序性。
而 zab 協(xié)議借鑒了 paxos,但是它是特別為Zookeeper設(shè)計(jì)的支持崩潰恢復(fù)的原子廣播協(xié)議。
模型
zab 實(shí)現(xiàn)了一個(gè)主備的模型,只有一臺(tái) leader 負(fù)責(zé)處理外部的寫事務(wù)請(qǐng)求,然后同步給其他 follower。
Zookeeper 客戶端會(huì)隨機(jī)的鏈接到 zookeeper 集群中的一個(gè)節(jié)點(diǎn),如果是讀請(qǐng)求,就直接從當(dāng)前節(jié)點(diǎn)中讀取數(shù)據(jù);如果是寫請(qǐng)求,那么節(jié)點(diǎn)就會(huì)向 Leader 提交事務(wù),Leader 接收到事務(wù)提交,會(huì)廣播該事務(wù),只要超過半數(shù)節(jié)點(diǎn)寫入成功,該事務(wù)就會(huì)被提交。
要點(diǎn)
消息廣播
基本過程
- leader 收到消息
- leader 廣播消息
- leader 收到大多數(shù) follower 的確認(rèn)
- leader 向所有 follower 廣播 commit 消息,同時(shí)自身也會(huì)完成事務(wù)提交
- follower 收到 commit 并自己 commit
細(xì)節(jié)點(diǎn)
- 每個(gè)事務(wù)都有一個(gè)全局遞增的唯一 ID,ZXID,zab需要保證執(zhí)行順序,每個(gè)事務(wù)必須按 ZXID 排序后處理
- leader 和 每一個(gè) follower 之間都有一個(gè) FIFO queue,除了解耦之外,同時(shí)也一定程度的保證了事務(wù)的執(zhí)行順序
崩潰恢復(fù)
原則
- ZAB 協(xié)議確保那些已經(jīng)在 Leader 提交的事務(wù)最終會(huì)被所有服務(wù)器提交。
- ZAB 協(xié)議確保丟棄那些只在 Leader 提出/復(fù)制,但沒有提交的事務(wù)。
實(shí)現(xiàn)方式
- 崩潰后進(jìn)行選舉
- 根據(jù) ZXID 選舉 leader,ZXID 最大,同時(shí)新選舉出來的 Leader 不能包含未提交的 Proposal
- 選舉成功開始同步數(shù)據(jù)
- leader 確認(rèn)事務(wù)是否已經(jīng)被過半的 follower 提交,進(jìn)行數(shù)據(jù)同步,保證數(shù)據(jù)一致
- 等到 Follower 將所有尚未同步的事務(wù) Proposal 都從 Leader 服務(wù)器上同步過來并且應(yīng)用到內(nèi)存數(shù)據(jù)中以后,Leader 才會(huì)把該 Follower 加入到真正可用的 Follower 列表中
- 進(jìn)入消息廣播模式
ZXID
一共 64 位,高 32 位代表了每代 Leader 的唯一性,低 32 代表了每代 Leader 中事務(wù)的唯一性。
總結(jié)
為什么說 zab 有責(zé)任感呢?因?yàn)樗蛣e人不要的地方再,如果有消息被提交了,那么就不會(huì)忘記了。
為了實(shí)現(xiàn)這個(gè)目標(biāo),它做了什么保證措施呢?
- 選舉的時(shí)候保證,保證了 ZXID 最大(其實(shí)這個(gè)和 raft 類似,就是指向了日志最多的人)
- 利用隊(duì)列保證,消息來的時(shí)候都通過了隊(duì)列,所以一定程度也保證了先來先處理
- 消息廣播就是一個(gè) 2PC 只不過奔潰恢復(fù)解決了 2PC 的單點(diǎn)問題
- 本質(zhì)還是一個(gè)主備,壓力還是在主節(jié)點(diǎn)上哦