ZooKeeper 技術(shù)內(nèi)幕:數(shù)據(jù)的存儲(chǔ)

原文: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)系:

image

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í)現(xiàn):DataTree 和 DataNode欢瞪,見(jiàn)下圖
image

拋出 2 個(gè)問(wèn)題:

  1. DataTree 中 nodes 是 Map,表示所有的 ZK 節(jié)點(diǎn)哼拔,那其內(nèi)部 key 是什么引有?
    • Re:ZNode 的唯一標(biāo)識(shí) path 作為 key
  2. 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):

  1. 異步:異步線程生成快照文件
  2. 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):

  1. 事務(wù)日志頻繁 flush 到磁盤(pán)涵紊,消耗大量磁盤(pán) IO
  2. 磁盤(pán)空間預(yù)分配:事務(wù)日志剩余空間 < 4KB 時(shí),將文件大小增加 64 MB
  3. 磁盤(pán)預(yù)分配的目標(biāo):減少磁盤(pán) seek 次數(shù)
  4. 建議:事務(wù)日志幔摸,采用獨(dú)立磁盤(pán)單獨(dú)存放

疑問(wèn):事務(wù)日志每次增長(zhǎng) 64MB摸柄,什么時(shí)候切換新的事務(wù)日志?

image

事務(wù)序列化:本質(zhì)是生成一個(gè)字節(jié)數(shù)組

  1. 包含:事務(wù)頭既忆、事務(wù)體的序列化
  2. 事務(wù)體:會(huì)話創(chuàng)建事務(wù)驱负、節(jié)點(diǎn)創(chuàng)建事務(wù)、節(jié)點(diǎn)刪除事務(wù)尿贫、節(jié)點(diǎn)數(shù)據(jù)更新事務(wù)

日志截?cái)啵?/p>

  1. 現(xiàn)象:Learner 的機(jī)器上記錄的 zxid 比 Leader 機(jī)器上的 zxid 大电媳,這是非法狀態(tài);
  2. 原則:只要集群中存在 Leader庆亡,所有機(jī)器都必須與 Leader 的數(shù)據(jù)保持同步
  3. 處理細(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)任斋。

image

疑問(wèn):初始化最后继阻,為什么要校驗(yàn) Epoch?如何判斷校驗(yàn)成功失敗瘟檩?如果失敗抹缕,如何處理?

2.2. 數(shù)據(jù)同步

ZK 集群服務(wù)器啟動(dòng)之后墨辛,會(huì)進(jìn)行 2 個(gè)動(dòng)作:

  1. 選舉 Leader:分配角色
  2. Learner 向 Leader 服務(wù)器注冊(cè):數(shù)據(jù)同步

數(shù)據(jù)同步卓研,本質(zhì):將沒(méi)有在 Learner 上執(zhí)行的事務(wù),同步給 Learner睹簇。

image

關(guān)鍵點(diǎn):

  1. 集群?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ù)能力

幾種同步:

  1. 增量同步
  2. 回滾
  3. 回滾垛叨,增量同步
  4. 全量同步

下面一張圖伦糯,能夠清晰描述發(fā)生上述同步的時(shí)機(jī):

image

關(guān)鍵點(diǎn):Learner 上的 zxid 與 Leader Proposals 中 min 和 max 的關(guān)系

3. 總結(jié)

ZK 的數(shù)據(jù)與存儲(chǔ)中,有幾個(gè)特別關(guān)注點(diǎn):

  1. 內(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ù)粒度上
  2. 快照生成的時(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)
  3. 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)存空間

參考資料

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末谆扎,一起剝皮案震驚了整個(gè)濱河市掐暮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌励翼,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辜荠,死亡現(xiàn)場(chǎng)離奇詭異汽抚,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)伯病,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)造烁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人午笛,你說(shuō)我怎么就攤上這事惭蟋。” “怎么了药磺?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵告组,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我癌佩,道長(zhǎng)木缝,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任围辙,我火速辦了婚禮我碟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘姚建。我一直安慰自己矫俺,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布桥胞。 她就那樣靜靜地躺著恳守,像睡著了一般。 火紅的嫁衣襯著肌膚如雪贩虾。 梳的紋絲不亂的頭發(fā)上催烘,一...
    開(kāi)封第一講書(shū)人閱讀 49,829評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音缎罢,去河邊找鬼伊群。 笑死考杉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的舰始。 我是一名探鬼主播崇棠,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼丸卷!你這毒婦竟也來(lái)了枕稀?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤谜嫉,失蹤者是張志新(化名)和其女友劉穎萎坷,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體沐兰,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡哆档,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了住闯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瓜浸。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖比原,靈堂內(nèi)的尸體忽然破棺而出插佛,到底是詐尸還是另有隱情,我是刑警寧澤春寿,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布朗涩,位于F島的核電站,受9級(jí)特大地震影響绑改,放射性物質(zhì)發(fā)生泄漏谢床。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一厘线、第九天 我趴在偏房一處隱蔽的房頂上張望识腿。 院中可真熱鬧,春花似錦造壮、人聲如沸渡讼。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)成箫。三九已至,卻和暖如春旨枯,著一層夾襖步出監(jiān)牢的瞬間蹬昌,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工攀隔, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留皂贩,地道東北人栖榨。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像明刷,于是被迫代替她去往敵國(guó)和親婴栽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

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