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...