100 通過zookeeper面試

2021-09-11 10:37:08 字數 3051 閱讀 5382

1、zookeeper 的資料模型

zookeeper 的資料模型是什麼樣子呢?它很像資料結構當中的樹,也很像檔案系統的目錄。

樹是由節點所組成,zookeeper 的資料儲存也同樣是基於節點,這種節點叫做 znode。

但是,不同於樹的節點,znode 的引用方式是路徑引用,類似於檔案路徑:

/ 動物 / 倉鼠

/ 植物 / 荷花

這樣的層級結構,讓每乙個 znode 節點擁有唯一的路徑,就像命名空間一樣對不同資訊作出清晰的隔離。

znode內部資料結構:

data:znode 儲存的資料資訊。

acl:記錄 znode 的訪問許可權,即哪些人或哪些 ip 可以訪問本節點。

stat:包含 znode 的各種元資料,比如事務 id、版本號、時間戳、大小等等。

child:當前節點的子節點引用,類似於二叉樹的左孩子右孩子。

這裡需要注意一點,zookeeper 是為讀多寫少的場景所設計。znode 並不是用來儲存大規模業務資料,而是用於儲存少量的狀態和配置資訊,每個節點的資料最大不能超過 1mb。

2、zookeeper 的基本操作和事件通知

zookeeper 包含了哪些基本操作呢?這裡列舉出比較常用的 api:

create:建立節點

delete:刪除節點

exists:判斷節點是否存在

getdata:獲得乙個節點的資料

setdata:設定乙個節點的資料

getchildren:獲取節點下的所有子節點

這其中,exists、getdata、getchildren 屬於讀操作。zookeeper 客戶端在請求讀操作的時候,可以選擇是否設定 watch。

watch 是什麼意思呢?

我們可以理解成是註冊在特定 znode 上的觸發器。當這個 znode 發生改變,也就是呼叫了 create、delete、setdata 方法的時候,將會觸發 znode 上註冊的對應事件,請求 watch 的客戶端會接收到非同步通知。

具體互動過程如下:

客戶端呼叫 getdata 方法,watch 引數是 true。服務端接到請求,返回節點資料,並且在對應的雜湊表裡插入被 watch 的 znode 路徑,以及 watcher 列表。

當被 watch 的 znode 已刪除,服務端會查詢雜湊表,找到該 znode 對應的所有 watcher,非同步通知客戶端,並且刪除雜湊表中對應的 key-value。

3、zookeeper 的一致性

zookeeper 的集群

zookeeper service 集群是一主多從結構。

更新資料時,首先更新到主節點(這裡的節點是指伺服器,不是 znode),再同步到從節點。

在讀取資料時,直接讀取任意從節點。

為了保證主從節點的資料一致性,zookeeper 採用了 zab 協議,這種協議非常類似於一致性演算法 paxos 和 raft。

我們需要首先了解 zab 協議所定義的三種節點狀態:

looking:選舉狀態。

following:follower 節點(從節點)所處的狀態。

leading:leader 節點(主節點)所處狀態。

我們還需要知道最大 zxid 的概念:

最大 zxid 也就是節點本地的最新事務編號,包含 epoch 和計數兩部分。epoch 是紀元的意思,相當於 raft 演算法選主時候的 term。

假如 zookeeper 當前的主節點掛掉了,集群會進行崩潰恢復,同時停止對外服務。zab 的崩潰恢復分成三個階段:

leader election

選舉階段,此時集群中的節點處於 looking 狀態。它們會各自向其他節點發起投票,投票當中包含自己的伺服器 id 和最新事務 id(zxid)。

接下來,節點會用自身的 zxid 和從其他節點接收到的 zxid 做比較,如果發現別人家的 zxid 比自己大,也就是資料比自己新,那麼就重新發起投票,投票給目前已知最大的 zxid 所屬節點。

每次投票後,伺服器都會統計投票數量,判斷是否有某個節點得到半數以上的投票。如果存在這樣的節點,該節點將會成為準 leader,狀態變為 leading。其他節點的狀態變為 following。

這就相當於,一群武林高手經過激烈的競爭,選出了武林盟主。

2. discovery

發現階段,用於在從節點中發現最新的 zxid 和事務日誌。或許有人會問:既然 leader 被選為主節點,已經是集群裡資料最新的了,為什麼還要從節點中尋找最新事務呢?

這是為了防止某些意外情況,比如因網路原因在上一階段產生多個 leader 的情況。

所以這一階段,leader 集思廣益,接收所有 follower 發來各自的最新 epoch 值。leader 從中選出最大的 epoch,基於此值加 1,生成新的 epoch 分發給各個 follower。

各個 follower 收到全新的 epoch 後,返回 ack 給 leader,帶上各自最大的 zxid 和歷史事務日誌。leader 選出最大的 zxid,並更新自身歷史日誌。

synchronization

同步階段,把 leader 剛才收集得到的最新歷史事務日誌,同步給集群中所有的 follower。只有當半數 follower 同步成功,這個準 leader 才能成為正式的 leader。

自此,故障恢復正式完成。

OCA 052 通過總結

2011 4 27 成功通過oca 052。成績 98 pass。今天去考的oca 052,去考場路上不知為何臨時來了場雷雨,把我澆的渾身都溼了,竟然這麼不走運。吸取上一門考試的教訓,總共通讀教材兩遍,並結合題庫,最後順利通過考試。現特將備考過程分享出來,希望能夠幫助同我一樣有考證需求的人。這一門的...

05 通過docker安裝tomcat

tomcat是一款最流行的伺服器。本文將闡述在docker當中安裝tomcat,並部署我們自己的專案。docker pull tomcat 建立宿主機子的路徑,用以對映docker安裝的tomcat所在的作業系統路徑 mkdir p root tomcat logs 啟動tomcat 檢視tomca...

03 通過docker安裝nginx

nginx是一款高效能的伺服器,常用作反向 正向 動靜分離以及負載均衡。本文將闡述使用docker安裝nginx伺服器,並通過nginx訪問之前fastdfs上傳的檔案。docker pull nginxmkdir p root nginx conf touch root nginx conf ng...