zookeeper服務的實現原理

1.ZooKeeper是什麼?
ZooKeeper是分佈式應用程序協調服務,是集羣的管理者,監視着集羣中各個節點的狀態根據節點提交的反饋進行下一步合理操作

2.ZooKeeper提供了什麼?
1)文件系統
2)通知機制

3.Zookeeper文件系統
每個子目錄項如 NameService 都被稱作爲znode(節點),和文件系統一樣,我們能夠自由的增加、刪除znode,在一個znode下增加、刪除子znode,唯一的不同在於znode是可以存儲數據的。

四種類型的znode:
1、持久化目錄節點
客戶端與zookeeper斷開連接後,該節點依舊存在

2、持久化順序編號目錄節點
客戶端與zookeeper斷開連接後,該節點依舊存在,只是Zookeeper給該節點名稱進行順序編號

3、臨時目錄節點
客戶端與zookeeper斷開連接後,該節點被刪除

4、臨時順序編號目錄節點
客戶端與zookeeper斷開連接後,該節點被刪除,只是Zookeeper給該節點名稱進行順序編號

一個節點存儲的是一個協議地址(用於調用服務)

zookeeper節點目錄結構:

在這裏插入圖片描述

zookeeper 的名詞覆盤
集羣角色
在這裏插入圖片描述

Zookeeper提供的服務的實現原理

(1)命名服務
在zookeeper的文件系統裏創建一個目錄,即有唯一的path。上游程序與下游程序約定好path,就通過path即能互相探索發現

(2)配置管理
程序總是需要配置的,如果程序分散部署在多臺機器上,要逐個改變配置就變得困難。現在把這些配置全部放到zookeeper上去,保存在 Zookeeper 的某個目錄節點中,然後所有相關應用程序都對這個目錄節點進行監聽,一旦配置信息發生變化,每個應用程序就會收到 Zookeeper 的通知,然後從 Zookeeper 獲取新的配置信息應用到系統中就好

(3)集羣管理
所謂集羣管理無在乎兩點:是否有機器退出和加入、選舉master

對於第一點,所有機器約定在父目錄GroupMembers下創建臨時目錄節點,然後監聽父目錄節點的子節點變化消息。一旦有機器掛掉,該機器與 zookeeper的連接斷開,其所創建的臨時目錄節點被刪除,所有其他機器都收到通知:某個兄弟目錄被刪除,於是,所有人都知道:它上船了

新機器加入也是類似,所有機器收到通知:新兄弟目錄加入,對於第二點,我們稍微改變一下,所有機器創建臨時順序編號目錄節點,每次選取編號最小的機器作爲master就好

(4)分佈式鎖
有了zookeeper的一致性文件系統,鎖的問題變得容易。鎖服務可以分爲兩類,一個是保持獨佔,另一個是控制時序

對於第一類,我們將zookeeper上的一個znode看作是一把鎖,通過createznode的方式來實現。所有客戶端都去創建 /distribute_lock 節點,最終成功創建的那個客戶端也即擁有了這把鎖。用完刪除掉自己創建的distribute_lock 節點就釋放出鎖。

對於第二類, /distribute_lock 已經預先存在,所有客戶端在它下面創建臨時順序編號目錄節點,和選master一樣,編號最小的獲得鎖,用完刪除即可

(5)隊列管理

兩種類型的隊列:
同步隊列,當一個隊列的成員都聚齊時,這個隊列纔可用,否則一直等待所有成員到達。
隊列按照 FIFO 方式進行入隊和出隊操作。

第一類,在約定目錄下創建臨時目錄節點,監聽節點數目是否是我們要求的數目。

第二類,和分佈式鎖服務中的控制時序場景基本原理一致,入列有編號,出列按編號。

6.分佈式與數據複製

Zookeeper作爲一個集羣提供一致的數據服務,自然,它要在所有機器間做數據複製。數據複製的好處:

容錯:一個節點出錯,不致於讓整個系統停止工作,別的節點可以接管它的工作;
提高系統的擴展能力 :把負載分佈到多個節點上,或者增加節點來提高系統的負載能力;
提高性能:讓客戶端本地訪問就近的節點,提高用戶訪問速度。

從客戶端讀寫訪問的透明度來看,數據複製集羣系統分下面兩種:

寫主(WriteMaster) :對數據的修改提交給指定的節點。讀無此限制,可以讀取任何一個節點。這種情況下客戶端需要對讀與寫進行區別,俗稱讀寫分離;

寫任意(Write Any):對數據的修改可提交給任意的節點,跟讀一樣。這種情況下,客戶端對集羣節點的角色與變化透明。

對zookeeper來說,它採用的方式是寫主。通過增加機器,它的讀吞吐能力和響應能力擴展性非常好,而寫,隨着機器的增多吞吐能力肯定下降(這也是它建立observer的原因),響應能力則取決於具體實現方式,是延遲複製保持最終一致性,還是立即複製快速響應

7.Zookeeper的工作原理

Zookeeper 的核心是原子廣播,這個機制保證了各個Server之間的同步。實現這個機制的協議叫做Zab協議。Zab協議有兩種模式,它們分別是恢復模式(選主)和廣播模式(同步)。當服務啓動或者在領導者崩潰後,Zab就進入了恢復模式,當領導者被選舉出來,且大多數Server完成了和 leader的狀態同步以後,恢復模式就結束了。狀態同步保證了leader和Server具有相同的系統狀態。

爲了保證事務的順序一致性,zookeeper採用了遞增的事務id號(zxid)來標識事務。所有的提議(proposal)都在被提出的時候加上了zxid。實現中zxid是一個64位的數字,它高32位是epoch用來標識leader關係是否改變,每次一個leader被選出來,它都會有一個新的epoch,標識當前屬於那個leader的統治時期。低32位用於遞增計數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章