1. 程式人生 > >寫給自己的Zookeeper學習筆記

寫給自己的Zookeeper學習筆記

這時大資料技術棧的開端

Zookeeper

Zookeeper是幹什麼的?

Zookeeper是一個分散式協調框架,他可以

①實現叢集管理(由於它自身的叢集通訊機制比如說為每一個叢集節點建立一個臨時節點在這個節點down機之後臨時節點會銷燬),

②叢集的統一配置管理(由於它的資料一致性)

③統一命名服務(由於它內部維護的znode樹)的節點是不能夠重複的。

④實現分散式屏障(這個就像柵欄一樣,實時監測就緒的資料節點以便下一步的操作)

⑤實現分散式鎖(這個就是在多個客戶端發起資源的請求時我們只服務事務id最小的那個,以免造成資源的爭搶)

⑥實現資料的訂閱和釋出(這個就是讓客戶端監聽znode節點當資料更新時就可以自動獲取訊息)

 

Zookeeper的資料結構

Zookeeper內部維護的一些節點,他們構成了樹的結構。我們可以把它想成是資料結構中的樹。如下圖所示

根節點是/,每一個節點都可以儲存資料,並且每個節點都是唯一的。這也就可以令每個節點對應一臺主機這樣的話也就能夠提供統一命名服務了。

我們可以根據不同的引數去建立不同的節點一般有如下歸類:

Zookeeper的其它組成關鍵詞

事務日誌

每當客戶端訪問zk叢集的時候zk內部就會產生一條新的日誌,而且這些日誌的編號(也就是日誌id號)就會增加1。這樣事務日誌也就能夠記錄下客戶端訪問zk叢集的整個流程也就形成了日誌檔案。需要注意的是這裡的事務日誌id是全域性遞增的。

 

快照檔案

快照檔案就是對zk叢集的一次狀態的記錄。拍攝快照的時間點在更換了新的領導時,或者預設情況下是每增加10萬條的事務id就會拍攝一次快照。

 

EpochId

Zk的事務id是一個64位的二進位制數,高32位是EpichId低32位是遞增的事務id。EpochId可以防止腦裂(也就是在同一時刻出現兩個leader的情況)。採用的策略是讓Follower只選擇接受EpochId高的leader。需要注意的是EpochId跟換之後所有的事務ID又會從0開始來計數。

 

Zookeeper的選舉機制

當一個節點啟動時它會經歷下面的步驟:

1.資料恢復階段

這一節點當前的zk會檢查選擇自己最大的事務id也就是最新的事務,然後進行比較。

2.選舉階段

每個zk都會提交自己的一個數據包

資料包中包括:

①自己所擁有的最大事務id是Zxid。

②自己的選舉ID(也就是自己在myid檔案中寫的數字)

③邏輯時鐘值確保多臺的zk伺服器在同一時間內進行選取。

⑤自己當前的狀態包括looking(正在選舉的狀態)、leader(領導者)、follower(跟隨者)、observer(觀察者)。

具體的比較規則就是首先比較自己的事務id,因為事務id越大意味著自己有越新的資料。它當選為leader就可以將自己的資料同步到其它的follower上面。

如果事務ID相同的話那麼就比較自己的選舉ID。需要注意的是如果過半的伺服器達成一致的話那麼就選舉有效。這也就引出了過半存活的策略,必須要有過半的機子存活如果沒有的話那麼就無法滿足過半選舉的條件。Zk叢集也就無法啟動。

 

Zookeeper的資料一致性

Zk叢集必須保證資料的一致性,也就是zk叢集中每臺機子上的資料都必須一樣。

關鍵詞:原子廣播實現資料一致性的策略

客戶端在訪問zk叢集時zk叢集會直接或者間接的將請求轉發給zk叢集中的leader(也就是說其它非leader接收到請求就會轉發該請求)。Leader收到這個請求之後開始將他執行。然後再將這個請求以事務的形式(如果是多次請求的話就是事務佇列的形式,而且他們是按照事務id排好序的)傳送給其它的節點,進而實現資料的同步。其中為了保證資料一致性的可靠性,我們使用了ZAB(zookeeper atomic boardcast)zk原子廣播演算法來解決這個問題。

它是2pc演算法的升級版下圖先介紹2pc演算法:

這裡我們可以看出事務的執行和事務的提交是兩個不同的階段。在2pc當中當所有的事務執行成功並且返回的yes時候leader會將這次的事務commit。但是這種策略過於保守效率低下,在ZAB中採用了過半的策略也就是當有過半的伺服器返回yes時leader就會讓這個事務提交而不是回滾。這裡總結一下ZAB的過半選舉的應用:

①選舉leader

②事務的提交

③存活機制

 

Zookeeper的奔潰恢復

當leader down機了會怎麼辦呢?

在2pc中並沒有解決方案。但是在ZAB中任然使用了過半的策略來選舉新的leader,比較規則與前面的類似。所以只要有過半的機器存活並且達成了一致性那麼就會有新的leader誕生。這時Epochid就會改變與之對應的事務id也會從頭來計數。

 

 

Zookeeper中的觀察者

我門可以想象大量的follower會導致選舉變得非常的困難,需要大量的通訊與大量的計算。這樣就大大降低的原子廣播或者是選舉的效率。但實務上我們有需要很多臺機子來工作,這樣也就誕生了zookeeper中的觀察者Observer。Observer與follower最大的不同就是Observer不參與投票,而其他的類似。這就是說Observer能夠提供服務而其他的投票工作可以交給leader與follower來處理。大大減少了網路通訊與計算的次數與頻寬。

 

Zookeeper配置相關

叢集配置

在datadir下面建立myid裡面是一個數字是自己的選舉id。

 

觀察者配置

到此zookeeper的核心概念也就介紹完畢了。