zookeeper 學(xué)習(xí)筆記

基本概念

  1. 角色
    zookeeper 集群中的節(jié)點(diǎn)共有三種角色,每個(gè)節(jié)點(diǎn)同時(shí)只能是一種角色。集群中的所有機(jī)器通過一個(gè) Leader 選舉過程來選定一臺被稱為 Leader 的機(jī)器。
    Leader:接受所有 Follower 的提案請求并統(tǒng)一協(xié)調(diào)發(fā)起提案的投票,負(fù)責(zé)與所有的 Follower 進(jìn)行內(nèi)部的數(shù)據(jù)交換
    Follower:直接為客戶端服務(wù)并參與提案的投票,同時(shí)與 Leader 進(jìn)行數(shù)據(jù)交換
    Observer:直接為客戶端服務(wù)但不參與提案的投票,同時(shí)也與 Leader 進(jìn)行數(shù)據(jù)交換

  2. 會話
    zookeeper 中客戶端啟動(dòng)時(shí)會與服務(wù)器建立一個(gè) TCP 連接,從第一次連接建立開始,客戶端會話的生命周期就開始了,通過這個(gè)連接,客戶端能夠通過心跳檢測與服務(wù)器保持有效的會話,也能夠向服務(wù)器發(fā)送請求并接受響應(yīng),還能夠接收來自服務(wù)器的 watch 事件通知。

  3. 節(jié)點(diǎn)
    一般在分布式語境下的節(jié)點(diǎn)是指組成集群的每一臺服務(wù)器,在 zookeeper 中還有另外一層意思,稱之為數(shù)據(jù)節(jié)點(diǎn)(ZNode)。
    zookeeper 的整個(gè)名字空間的結(jié)構(gòu)是層次化的,和 Linux 文件系統(tǒng)結(jié)構(gòu)相似,是一顆樹。名字空間的層次由斜杠(/)來進(jìn)行分割,在名稱空間里面的每一個(gè)節(jié)點(diǎn)的名字空間由這個(gè)結(jié)點(diǎn)的路徑來確定。
    每個(gè) ZNode 上都會保存自己的數(shù)據(jù)內(nèi)容,同時(shí)還會保存一系列屬性信息。

  4. 版本
    對于每個(gè) ZNode ,zookeeper 都會為它維護(hù)一個(gè)叫 Stat 的數(shù)據(jù)結(jié)構(gòu),Stat 中記錄了 ZNode 的三個(gè)數(shù)據(jù)版本,version(當(dāng)前ZNode數(shù)據(jù)內(nèi)容的版本號)、cversion(當(dāng)前ZNode子節(jié)點(diǎn)的版本號)、aversion(當(dāng)前ZNode的ACL變更版本號)

  5. watcher
    zookeeper 允許用戶在指定節(jié)點(diǎn)上注冊一些 watcher,并且在特定事件觸發(fā)的時(shí)候,zookeeper 服務(wù)端會將事件通知到感興趣的客戶端,該機(jī)制是 zookeeper 實(shí)現(xiàn)分布式協(xié)調(diào)服務(wù)的重要特性。

客戶端命令

這里列出常用的客戶端命令,所謂客戶端命令指使用 zkCli 連接到 zookeeper 服務(wù)器之后使用的命令,zkCli 連接的語法如下:
zkCli -server host:port cmd args
zkCli 是客戶端可執(zhí)行文件名,根據(jù)具體操作系統(tǒng)環(huán)境可能是 zkCli.sh 或 zkCli.cmd
host 是服務(wù)器IP或域名,port 是服務(wù)器端口號,如果有多個(gè)服務(wù)器地址則用逗號分隔
cmd 是具體命令、args 是命令的參數(shù),也可以連接上服務(wù)器之后再執(zhí)行命令。

  1. 查看節(jié)點(diǎn)
    ls /path
    查看名為 /path 的子節(jié)點(diǎn),但只能查看指定節(jié)點(diǎn)下的第一級的所有子節(jié)點(diǎn)。
    ls2 /path
    查看名為 /path 的子節(jié)點(diǎn),并且能看到更新次數(shù)等屬性信息。

  2. 創(chuàng)建節(jié)點(diǎn)
    create [-s] [-e] /path data
    創(chuàng)建一個(gè)名叫 /path 的節(jié)點(diǎn),并包含數(shù)據(jù) data。加上 -s 表示創(chuàng)建的是順序節(jié)點(diǎn),加上 -e 表示創(chuàng)建的是臨時(shí)節(jié)點(diǎn),如果都不加則默認(rèn)為創(chuàng)建持久節(jié)點(diǎn)。

  3. 刪除節(jié)點(diǎn)
    delete /path
    刪除名為 /path 的節(jié)點(diǎn)

  4. 設(shè)置節(jié)點(diǎn)數(shù)據(jù)
    set /path data
    設(shè)置名為 /path 的節(jié)點(diǎn)的數(shù)據(jù)為 data

  5. 返回節(jié)點(diǎn)數(shù)據(jù)
    get /path
    返回名為 /path 的節(jié)點(diǎn)的數(shù)據(jù)和屬性信息

  6. 強(qiáng)制同步數(shù)據(jù)
    sync /path
    將名為 /path 的節(jié)點(diǎn)強(qiáng)制同步為最新的數(shù)據(jù)

  7. 幫助信息
    help
    幫助命令,顯示客戶端支持的命令及語法格式

  8. 退出
    quit
    退出當(dāng)前客戶端,會話結(jié)束。

運(yùn)維命令

zookeeper 提供了一些四字命令用于獲取 zookeeper 服務(wù)端的當(dāng)前狀態(tài)及相關(guān)信息,這些命令在系統(tǒng)運(yùn)維時(shí)很有用。用戶在客戶端可以通過 telnet 或 nc 向zookeeper 提交相應(yīng)的命令,比如 nc 方式:
echo cmd|nc host port
cmd 是具體的命令(因?yàn)橐话闶撬膫€(gè)字母所以又叫做四字命令),host 是zookeeper 服務(wù)器 IP 地址或域名,port 是 zookeeper 端口號

  1. conf
    顯示服務(wù)配置的詳細(xì)信息,比如數(shù)據(jù)文件目錄、日志文件目錄、間隔單位時(shí)間、選舉算法、選舉端口等。

  2. cons
    列出所有連接到服務(wù)器的客戶端的完全的連接/會話的詳細(xì)信息。包括”接受 / 發(fā)送”的包數(shù)量、會話 id 、操作延遲、最后的操作執(zhí)行等。

  3. crst
    重置所有連接。

  4. dump
    列出未經(jīng)處理的會話和臨時(shí)節(jié)點(diǎn)。

  5. envi
    顯示關(guān)于服務(wù)器環(huán)境的詳細(xì)信息,比如 zookeeper 版本、操作系統(tǒng)版本、jdk 地址等。

  6. reqs
    列出未經(jīng)處理的請求。

  7. ruok
    測試服務(wù)是否處于正確狀態(tài)。如果確實(shí)如此,那么服務(wù)返回“imok ”,否則不做任何相應(yīng)。

  8. stat
    輸出關(guān)于性能和連接的客戶端的列表。

  9. wchs
    列出服務(wù)器 watch 的詳細(xì)信息。

  10. wchc
    通過 session 列出服務(wù)器 watch 的詳細(xì)信息,它的輸出是一個(gè)與 watch 相關(guān)的會話的列表。

  11. wchp
    通過路徑列出服務(wù)器 watch 的詳細(xì)信息,它的輸出是一個(gè)與 session 相關(guān)的路徑。

上面列出的是一些常用的四字命令,更詳細(xì)信息可以參考zookeeper的官方文檔,里面的【ZooKeeper Commands】一節(jié)有具體介紹。

特性

  1. 一致性
    zookeeper 很好地保證在分布式高并發(fā)情況下節(jié)點(diǎn)的創(chuàng)建一定是全局唯一性,即保證客戶端無法重復(fù)創(chuàng)建一個(gè)已經(jīng)存在的數(shù)據(jù)節(jié)點(diǎn)。
    根據(jù) CAP 理論,分布式系統(tǒng)只能滿足一致性(Consistence)、可用性(Availability)、分區(qū)容錯(cuò)性(partitioning)三項(xiàng)中的兩項(xiàng)而不可能滿足全部三項(xiàng)。對于 zookeeper 來說,其實(shí)現(xiàn)了 A 可用性、P 分區(qū)容錯(cuò)性、C 中的寫入強(qiáng)一致性,喪失的是 C 中的讀取一致性。
    更進(jìn)一步解釋,zookeeper 的一致性保證包括以下幾點(diǎn):
  • 順序一致性
    一個(gè)客戶端的更新將按照發(fā)送的順序被寫入到服務(wù)端。
  • 原子性
    更新要么成功,要么失敗,沒有部分結(jié)果。
  • 單一系統(tǒng)鏡像
    客戶端只會連接 host 列表中狀態(tài)最新的那些實(shí)例。如果正在連接到的實(shí)例掛了,客戶端會嘗試重新連接到集群中的其他實(shí)例,那么此時(shí)滯后于故障實(shí)例的其它實(shí)例都不會接收該連接請求,只有和故障實(shí)例版本相同或更新的實(shí)例才接收該連接請求。
  • 持久性
    寫操作完成之后將會被持久化存儲,不受服務(wù)器故障影響。
  • 并發(fā)一致性
    zookeeper 并不保證在某個(gè)時(shí)刻兩個(gè)不同客戶端具有一致的數(shù)據(jù)視圖,因?yàn)榫W(wǎng)絡(luò)的延遲一個(gè)客戶端可能在另一個(gè)客戶端得到修改通知之前進(jìn)行更新。如果不同客戶端讀取到相同的值很重要,那么客戶端應(yīng)該在執(zhí)行讀取操作之前調(diào)用 sync() 方法,使得讀操作的連接所連的 zookeeper 實(shí)例能與 leader 進(jìn)行同步,從而能讀到最新的類容。
  1. watcher 監(jiān)聽
    客戶端如果對一個(gè)節(jié)點(diǎn)注冊 watcher 監(jiān)聽,那么當(dāng)該節(jié)點(diǎn)的內(nèi)容或其子節(jié)點(diǎn)發(fā)生變更時(shí),zookeeper 服務(wù)器會向訂閱的客戶端發(fā)送變更通知。

  2. 臨時(shí)節(jié)點(diǎn)
    對在 zookeeper 上創(chuàng)建的臨時(shí)節(jié)點(diǎn),一旦客戶端與服務(wù)器之間的會話失效,那么該臨時(shí)節(jié)點(diǎn)就被自動(dòng)清除。

  3. 順序節(jié)點(diǎn)
    客戶端申請創(chuàng)建該節(jié)點(diǎn)時(shí) zookeeper 會自動(dòng)在節(jié)點(diǎn)路徑末尾添加遞增序號

應(yīng)用場景

  1. 數(shù)據(jù)訂閱發(fā)布
    將應(yīng)用中的配置信息放在 zookeeper 中集中管理。應(yīng)用在啟動(dòng)時(shí)主動(dòng)到zk服務(wù)端進(jìn)行一次配置信息的獲取,同時(shí)在指定節(jié)點(diǎn)注冊一個(gè) watcher 監(jiān)聽。這樣只要配置信息發(fā)生變更,服務(wù)端都會實(shí)時(shí)通知到所有訂閱的客戶端。

  2. 域名服務(wù)
    將域名配置信息放在 zookeeper 上,對外提供一套域名注冊、域名解析、域名可用性檢測的服務(wù)?;诖颂峁┮惶讋?dòng)態(tài)的 DNS 服務(wù)。

  3. 全局唯一 ID
    可以利用順序節(jié)點(diǎn)的特性生成全局唯一的 ID。

  4. 分布式協(xié)調(diào)通知
    利用 watcher 監(jiān)聽實(shí)現(xiàn)系統(tǒng)間的協(xié)調(diào)和通知,從而實(shí)現(xiàn)數(shù)據(jù)變更的處理。不同客戶端都對 zookeeper 上同一個(gè)數(shù)據(jù)節(jié)點(diǎn)進(jìn)行 watcher 注冊,如果數(shù)據(jù)節(jié)點(diǎn)發(fā)生變化,那么所有訂閱的客戶端都能受到通知。

  5. Master 選舉
    利用 zookeeper 創(chuàng)建節(jié)點(diǎn)時(shí)的強(qiáng)一致性,由客戶端集群定時(shí)往 zookeeper 上創(chuàng)建同一個(gè)名字的臨時(shí)節(jié)點(diǎn)。在這個(gè)過程中只有一個(gè)客戶端能夠創(chuàng)建成功,那么該客戶端就成了 Master,同時(shí)其他沒有創(chuàng)建成功的客戶端都在該節(jié)點(diǎn)注冊一個(gè)節(jié)點(diǎn)變更的 watcher,用于監(jiān)控當(dāng)前 Master 機(jī)器是否存活,一旦發(fā)現(xiàn) Master 掛掉其余客戶端重新進(jìn)行 Master 選舉。

  6. 分布式鎖

  • 排他鎖
    利用強(qiáng)一致性,將 zookeeper 上的一個(gè)臨時(shí)節(jié)點(diǎn)表示為一個(gè)排他鎖,所有客戶端同時(shí)創(chuàng)建該節(jié)點(diǎn),最終只有一個(gè)客戶端能創(chuàng)建成功,那么就認(rèn)為該客戶端獲得了鎖,同時(shí)注冊該節(jié)點(diǎn)的 watcher 監(jiān)聽。當(dāng)移除該節(jié)點(diǎn)就認(rèn)為釋放了鎖。

  • 共享鎖
    利用強(qiáng)一致性,將 zookeeper 上的一個(gè)臨時(shí)順序節(jié)點(diǎn)表示為一個(gè)共享鎖,并注冊同級子節(jié)點(diǎn)的 watcher 監(jiān)聽。判斷讀寫順序時(shí)根據(jù)不同需求關(guān)注比自己序號小的同級子節(jié)點(diǎn)類型。

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

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

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