原文:http://ningg.top/zookeeper-lesson-9-zookeeper-data-and-storage/
Keynote/PPT 下載:
- ZK 技術(shù)內(nèi)幕:數(shù)據(jù)與存儲(chǔ).pdf (pdf 版)
1. 數(shù)據(jù)分類(lèi)
整體分為 3 類(lèi):
- 內(nèi)存數(shù)據(jù)
- 磁盤(pán)數(shù)據(jù)
- 快照
- 事務(wù)日志
下面是 ZooKeeper 啟動(dòng)過(guò)程中蛀序,3 類(lèi)數(shù)據(jù)之間的關(guān)系:
1.1. 內(nèi)存數(shù)據(jù)
關(guān)鍵點(diǎn):
- ZK 的數(shù)據(jù)模型:
樹(shù)
- 樹(shù)中單個(gè)節(jié)點(diǎn)包含的內(nèi)容:
- 節(jié)點(diǎn)數(shù)據(jù)
- 節(jié)點(diǎn) ACL 信息
- 節(jié)點(diǎn)的路徑
- 樹(shù)中單個(gè)節(jié)點(diǎn)包含的內(nèi)容:
- 具體實(shí)現(xiàn):DataTree 和 DataNode欢瞪,見(jiàn)下圖
拋出 2 個(gè)問(wèn)題:
- DataTree 中 nodes 是 Map,表示所有的 ZK 節(jié)點(diǎn)哼拔,那其內(nèi)部 key 是什么引有?
- Re:ZNode 的唯一標(biāo)識(shí)
path
作為 key
- Re:ZNode 的唯一標(biāo)識(shí)
- ephemerals 是Map,用于存儲(chǔ)臨時(shí)節(jié)點(diǎn)倦逐,那其內(nèi)部 key 是什么?value 又是什么?
- Re:臨時(shí)節(jié)點(diǎn)是跟 Session 綁定的檬姥,sessionId 作為 key
懂的曾我,都是看過(guò)源碼的。
1.2. 快照數(shù)據(jù)
快照數(shù)據(jù)生成的基本過(guò)程:
關(guān)鍵點(diǎn):
- 異步:異步線程生成快照文件
- Fuzzy 快照:
- 快照文件生成過(guò)程中健民,仍然有新的事務(wù)提交抒巢,
- 因此,快照文件不是精確到某一時(shí)刻的快照文件秉犹,而是
模糊的
蛉谜, - 這就要求
事務(wù)操作
是冪等的
,否則產(chǎn)生不一致崇堵。
疑問(wèn):是否每次生成快照文件型诚,都會(huì)認(rèn)為「事務(wù)日志已經(jīng)寫(xiě)滿」,并切換一次事務(wù)日志文件鸳劳?所以狰贯,切換事務(wù)日志文件的時(shí)機(jī),實(shí)際是生成快照文件的時(shí)機(jī)赏廓。
1.3. 事務(wù)日志
關(guān)鍵點(diǎn):
- 事務(wù)日志頻繁 flush 到磁盤(pán)涵紊,消耗大量磁盤(pán) IO
- 磁盤(pán)空間
預(yù)分配
:事務(wù)日志剩余空間 < 4KB 時(shí),將文件大小增加 64 MB -
磁盤(pán)預(yù)分配
的目標(biāo):減少磁盤(pán) seek 次數(shù) - 建議:事務(wù)日志幔摸,采用
獨(dú)立磁盤(pán)
單獨(dú)存放
疑問(wèn):事務(wù)日志每次增長(zhǎng) 64MB摸柄,什么時(shí)候切換新的事務(wù)日志?
事務(wù)序列化:本質(zhì)是生成一個(gè)字節(jié)數(shù)組
- 包含:事務(wù)頭既忆、事務(wù)體的序列化
- 事務(wù)體:會(huì)話創(chuàng)建事務(wù)驱负、節(jié)點(diǎn)創(chuàng)建事務(wù)、節(jié)點(diǎn)刪除事務(wù)尿贫、節(jié)點(diǎn)數(shù)據(jù)更新事務(wù)
日志截?cái)啵?/p>
- 現(xiàn)象:Learner 的機(jī)器上記錄的 zxid 比 Leader 機(jī)器上的 zxid 大电媳,這是非法狀態(tài);
- 原則:只要集群中存在 Leader庆亡,所有機(jī)器都必須與 Leader 的數(shù)據(jù)保持同步
- 處理細(xì)節(jié):遇到非法狀態(tài)匾乓,Leader 發(fā)送 TRUNC 命令給特定機(jī)器,要求進(jìn)行日志截?cái)嘤帜保琇earner 機(jī)器收到命令拼缝,會(huì)刪除非法的事務(wù)日志
2. 數(shù)據(jù)相關(guān)過(guò)程
2.1. 初始化
ZK 服務(wù)器啟動(dòng)時(shí),首先會(huì)進(jìn)行數(shù)據(jù)初始化彰亥,將磁盤(pán)中數(shù)據(jù)咧七,加載到內(nèi)存中,恢復(fù)現(xiàn)場(chǎng)任斋。
疑問(wèn):初始化最后继阻,為什么要校驗(yàn) Epoch?如何判斷校驗(yàn)成功失敗瘟檩?如果失敗抹缕,如何處理?
2.2. 數(shù)據(jù)同步
ZK 集群服務(wù)器啟動(dòng)之后墨辛,會(huì)進(jìn)行 2 個(gè)動(dòng)作:
- 選舉 Leader:分配角色
- Learner 向 Leader 服務(wù)器注冊(cè):數(shù)據(jù)同步
數(shù)據(jù)同步卓研,本質(zhì):將沒(méi)有在 Learner 上執(zhí)行的事務(wù),同步給 Learner睹簇。
關(guān)鍵點(diǎn):
- 集群?jiǎn)?dòng)后奏赘,什么時(shí)候能夠?qū)ν馓峁┓?wù)?需要等所有 Learner 都完成數(shù)據(jù)同步嗎太惠?
- Re:
過(guò)半策略
:只需要半數(shù) Learner 完成數(shù)據(jù)同步磨淌,Learder 向所有已經(jīng)完成數(shù)據(jù)同步的 Learner 發(fā)送 UPTODATE 命令,表示集群具備了對(duì)外服務(wù)能力
- Re:
幾種同步:
- 增量同步
- 回滾
- 回滾垛叨,增量同步
- 全量同步
下面一張圖伦糯,能夠清晰描述發(fā)生上述同步的時(shí)機(jī):
關(guān)鍵點(diǎn):Learner 上的 zxid 與 Leader Proposals 中 min 和 max 的關(guān)系
3. 總結(jié)
ZK 的數(shù)據(jù)與存儲(chǔ)中,有幾個(gè)特別關(guān)注點(diǎn):
-
內(nèi)存數(shù)據(jù)
與磁盤(pán)數(shù)據(jù)
間的關(guān)系:- 內(nèi)存數(shù)據(jù)嗽元,是真正提供服務(wù)的數(shù)據(jù)
- 磁盤(pán)數(shù)據(jù)敛纲,作用:
- 恢復(fù)內(nèi)存數(shù)據(jù),恢復(fù)現(xiàn)場(chǎng)
- 數(shù)據(jù)同步:集群內(nèi)剂癌,不同節(jié)點(diǎn)間的數(shù)據(jù)同步(另淤翔,內(nèi)存中的提議緩存隊(duì)列 proposals)
- 磁盤(pán)數(shù)據(jù),為什么同時(shí)包含:快照佩谷、事務(wù)日志旁壮?出于數(shù)據(jù)粒度的考慮
- 如果只包含快照,那恢復(fù)現(xiàn)場(chǎng)的時(shí)候谐檀,會(huì)有數(shù)據(jù)丟失抡谐,因?yàn)樯煽煺盏臅r(shí)間間隔太大,即桐猬,快照的粒度太粗了
- 事務(wù)日志麦撵,針對(duì)每條提交的事務(wù)都會(huì) flush 到磁盤(pán),因此粒度很細(xì)溃肪,恢復(fù)現(xiàn)場(chǎng)時(shí)免胃,能夠恢復(fù)到事務(wù)粒度上
- 快照生成的時(shí)機(jī):基于閾值,引入隨機(jī)因素
- 解決的關(guān)鍵問(wèn)題:避免所有節(jié)點(diǎn)同時(shí) dump snapshot惫撰,因?yàn)?dump snapshot 耗費(fèi)大量的 磁盤(pán) IO羔沙、CPU,所有節(jié)點(diǎn)同時(shí) dump 會(huì)嚴(yán)重影響集群的對(duì)外服務(wù)能力
-
countLog > snapCount/2 + randRoll
厨钻,其中:- countLog 為累計(jì)執(zhí)行事務(wù)個(gè)數(shù)
- snapCount 為配置的閾值
- randRoll 為隨機(jī)因素(取值:0~snapCount/2)
- ZK 的 快照文件是 Fuzzy 快照扼雏,不是精確到某一時(shí)刻的快照坚嗜,而是某一時(shí)間段內(nèi)的快照
- ZK 使用「異步線程」生成快照:
- 線程之間共享內(nèi)存空間,導(dǎo)致 Fuzzy 快照
- 這就要求 ZK 的所有事務(wù)操作是冪等的呢蛤,否則產(chǎn)生數(shù)據(jù)不一致的問(wèn)題
- 實(shí)際上 ZK 的所有操作都是冪等的
- 類(lèi)比:Redis 中使用「異步進(jìn)程」生成快照 RDB(Redis Dump Binary)
- RDB 文件是精確的快照惶傻,原因:進(jìn)程之間內(nèi)存空間隔離
- 系統(tǒng)內(nèi)核使用「寫(xiě)時(shí)復(fù)制」(Copy-On-Write)技術(shù)乘瓤,節(jié)省大量?jī)?nèi)存空間
- ZK 使用「異步線程」生成快照:
參考資料
- 從Paxos到Zookeeper分布式一致性原理與實(shí)踐 第7章 7.9
- ZooKeeper-Distributed Process Coordination 第2章 2.1.3 & 第4章