Zookeeepr設(shè)計(jì)原理

Zookeeepr設(shè)計(jì)原理

分布式系統(tǒng)

  1. 什么是分布式系統(tǒng)

《分布式系統(tǒng)概念與設(shè)計(jì)》一書定義分布式系統(tǒng)是一個(gè)硬件或軟件組件分布在不同的網(wǎng)絡(luò)計(jì)算機(jī)上,彼此之間通過消息傳遞進(jìn)行通信和協(xié)調(diào)的系統(tǒng)

  1. 分布式系統(tǒng)的特點(diǎn)
    ? 分布性
    ? 對(duì)等性
    ? 并發(fā)性
    ? 缺乏全局時(shí)鐘
    ? 故障總是會(huì)發(fā)生

  2. 分布式環(huán)境的各種問題
    ? 通信異常
    ? 網(wǎng)絡(luò)分區(qū)(俗稱“腦裂” )
    ? 三態(tài)(成功、失敗、超時(shí))
    ? 節(jié)點(diǎn)故障

  3. 分布式系統(tǒng)-CAP定理
    ? 分區(qū)容錯(cuò)性(Partition tolerance)
    ? 一致性(Consistency)
    ? 可用性(Available)
    ? 一致性和可用性平衡方案

Zookeeper簡(jiǎn)介

? 一個(gè)開源的針對(duì)大型分布式系統(tǒng)的可靠協(xié)調(diào)系統(tǒng)
? 設(shè)計(jì)目標(biāo)是:將復(fù)雜且容易出錯(cuò)的分布式式一致性服務(wù) 封裝起來,構(gòu)成一個(gè)高效可靠的原語集,并以簡(jiǎn)單易用的接口提供給用戶使用。
? 提供的功能包括:發(fā)布/訂閱,分布式協(xié)調(diào)/通知,配置管理,集群管理,主從協(xié)調(diào),分布式鎖等。

為什么選擇Zookeeper ?
? 開源、免費(fèi)
? 高效、可靠的解決數(shù)據(jù)一致性問題
? 工業(yè)界大型分布式系統(tǒng)廣泛應(yīng)用
? 簡(jiǎn)單易用

Zookeeper特性

? 最終一致性
? 保證最終數(shù)據(jù)能夠達(dá)到一致,這是Zookeeper最重要的功能。
? 順序性
? 從同一個(gè)客戶端發(fā)起的事務(wù)請(qǐng)求,最終會(huì)嚴(yán)格地按照其發(fā)送順序被應(yīng)用到Zookeeper中。
? 可靠性
? 一旦服務(wù)器成功的應(yīng)用一個(gè)事務(wù),并完成了客戶端的響應(yīng),那么該事 務(wù)所引起的服務(wù)端狀態(tài)變更將會(huì)被一直保留下去。
? 實(shí)時(shí)性
? Zookeeper不能保證兩個(gè)客戶端能同時(shí)得到剛更新的數(shù)據(jù),如果需要最新數(shù)據(jù),應(yīng)該在讀數(shù)據(jù)之前調(diào)用sync()接口。
? 原子性:
? 一次數(shù)據(jù)更新要么成功,要么失敗。
? 單一視圖:
? 無論客戶端連接到哪個(gè)服務(wù)器,看到的數(shù)據(jù)模型都是一致的。

Zookeeper架構(gòu)

zookeeper角色

角色 描述
Leader 更新系統(tǒng)狀態(tài),處理事務(wù)請(qǐng)求,負(fù)責(zé)進(jìn)行投票的發(fā)起和決議
Leaner Follower 處理客戶端非事務(wù)請(qǐng)求并向客戶端返回結(jié)果,將寫事務(wù)請(qǐng)求轉(zhuǎn)發(fā)給Leader,同步Leader的狀態(tài),選主過程中參與投票
Leaner Observer 接收客戶端讀請(qǐng)求,將客戶端寫請(qǐng)求轉(zhuǎn)發(fā)給Leader,不參與投票過程,只同步Leader的狀態(tài)。目的是為了擴(kuò)展系統(tǒng),提高讀取速度
Client 請(qǐng)求發(fā)起方

Zookeeper寫入

  1. 數(shù)據(jù)寫入最終一致性核心算法ZAB算法
  2. Leader負(fù)責(zé)處理寫事務(wù)請(qǐng)求
  3. Follower負(fù)責(zé)向Leader轉(zhuǎn)發(fā)寫請(qǐng)求,響應(yīng)Leader發(fā)出的提議


Zookeeper選舉

? 服務(wù)器四種狀態(tài):
? LOOKING:尋找Leader狀態(tài),處于該狀態(tài)需要進(jìn)入選舉流程
? LEADING:領(lǐng)導(dǎo)者狀態(tài),表明當(dāng)前服務(wù)角色為L(zhǎng)eader
? FOLLOWING:跟隨者狀態(tài),Leader已經(jīng)選舉出來,表明當(dāng)前服務(wù)角色為Follower
? OBSERVER:觀察者狀態(tài),表明當(dāng)前服務(wù)角色Observer

事務(wù)ID:用ZXID表示,是一個(gè)64位的數(shù)字,由Leader統(tǒng) 一分配,全局唯一,不斷遞增。

數(shù)據(jù)模型Znode

? Zookeeper特有的數(shù)據(jù)節(jié)點(diǎn)Znode,視圖結(jié)構(gòu)類似 Linux文件系統(tǒng),沒有目錄和文件的概念
? Znode是Zookeeper中數(shù)據(jù)的最小單元
? Znode上可以保存數(shù)據(jù),通過掛載子節(jié)點(diǎn)構(gòu)成一個(gè)樹狀的層次化命名空間
? Znode樹的根由“/”斜杠開始

Znode - 節(jié)點(diǎn)類型

? 節(jié)點(diǎn)類型
? 持久節(jié)點(diǎn)(PERSISTENT)
? 臨時(shí)節(jié)點(diǎn)(EPHEMERAL)
? 順序節(jié)點(diǎn)(SEQUENTIAL)
? 組合節(jié)點(diǎn)類型
? 持久節(jié)點(diǎn)(PERSISTENT)
? 持久順序節(jié)點(diǎn)( PERSISTENT _ SEQUENTIAL )
? 臨時(shí)節(jié)點(diǎn)(EPHEMERAL)
? 臨時(shí)順序節(jié)點(diǎn)(EPHEMERAL_ SEQUENTIAL)

Znode - 版本

? 版本類型
? dataVersion:當(dāng)前數(shù)據(jù)節(jié)點(diǎn)數(shù)據(jù)內(nèi)容的版本號(hào)
? cVersion:當(dāng)前數(shù)據(jù)節(jié)點(diǎn)子節(jié)點(diǎn)的版本號(hào)?
? aVersion:當(dāng)前數(shù)據(jù)節(jié)點(diǎn)ACL權(quán)限變更版本號(hào)
? 如何保證分布式數(shù)據(jù)原子性操作
? 悲觀鎖
? 樂觀鎖
? 使用version實(shí)現(xiàn)樂觀鎖機(jī)制中的“寫入校驗(yàn)”

Znode - 狀態(tài)

狀態(tài)屬性 說明
cZxid Znode被創(chuàng)建時(shí)的事務(wù)ID
ctime Znode被創(chuàng)建的時(shí)間
mZxid Znode最后一次被更新的事務(wù)ID
mtime Znode最后一次被更新的時(shí)間
pZxid Znode子節(jié)點(diǎn)列表最后一次被修改時(shí)的事務(wù)ID
cversion 子節(jié)點(diǎn)的版本號(hào)
dataVersion 數(shù)據(jù)節(jié)點(diǎn)的版本號(hào)
aclVersion 節(jié)點(diǎn)的ACL版本號(hào)
ephemeralOwner 創(chuàng)建該Znode的會(huì)話的sessionID,持久節(jié)點(diǎn)該值為0
dataLength 數(shù)據(jù)內(nèi)容長(zhǎng)度
numChildren 當(dāng)前Znode的子節(jié)點(diǎn)個(gè)數(shù)

Znode - Watcher機(jī)制

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容