zookeeper入門及原理

一.zookeeper是幹什麼的?

zookeeper是一個分佈式協調框架,其內部主要提供了兩個功能

  1. 文件系統
  2. 通知機制

通過以上兩個功能,zookeeper可以爲我們的分佈式服務提供一下幾個功能

  1. 命名服務
  2. 配置管理
  3. 隊列管理
  4. 分佈式鎖
  5. 集羣管理
    換句話說就是說zookeeper通過文件系統與通知機制爲我們的分佈式系統實現了以上五個功能

二.zookeeper的文件系統

zookeeper的文件系統我們可以理解爲在自己電腦上創建文件夾,與電腦上創建的文件夾不同的是,zookeeper的文件夾是可以存儲數據的(最多可以存儲1M大小的數據) 每個文件夾我們稱之爲znode 這種節點是不可以重複的;

znode 也就是zookeeper的節點一共有四種類型的節點

  1. 臨時有序
  2. 臨時無序
  3. 持久有序
  4. 持久無序
    解釋1:臨時與持久
    首先我們要知道zookeeper總體上分爲兩個部分,服務端與客戶端,建立節點的命令是客戶端與服務端連接,然後在服務端中建立節點,我們上面所說的功能都是服務端的功能,客戶端的作用可以理解爲向服務端發送命令的作用。

理解了上面的話,我們應該知道 客戶端需要與服務端建立連接,所謂臨時節點 就是說我們客戶端與服務端創建連接的時候 調用創建臨時節點的方法 當客戶端與服務端的連接斷開的時候,這個客戶端創建的臨時節點就會消失,反之持久節點就是當客戶端與服務端斷開連接後,節點還存在。

解釋2:有序與無序
假設現在zookeeper現存的目錄的結構如下

		root
			->p1
			->p2
			->p3
			->p4
				->pa1
				->pa2

如果我們現在先建立一個無序節點(有序無序均可),路徑是root/p1/t
那麼現在zookeeper的節點的結構就是

		root
			->p1
				->t
			->p2
			->p3
			->p4
				->pa1
				->pa2

因爲我們是創建的無序節點,這時候如果在創建路徑是root/p1/t的節點,就會創建失敗,反之如果創建的有序節點,那麼即使路徑是root/p1/t 我們仍然可以創建成功,這時候zookeeper會自動爲我們創建的節點後面追加編號 先創建的節點的名字就是root/p1/t00001 後創建的是root/p1/t00002(00001與00002是爲了便於理解而我自己加的 實際上不一定是這個數字 但是理論是一樣的)

客戶端創建節點額構造函數的參數:路徑,數據,權限,節點類型(上面的四個)

至此zookeeper的文件系統的基本原理就基本完畢了

三.通知機制

客戶端註冊監聽自己關心的目錄節點,當註冊的節點發生變化的時候(數據變動,子目錄節點增加 刪除等)客戶端就會收到通知,客戶端可以獲取變動的詳細信息,所以就可以進行相應的處理了

四.zookeeper在分佈式系統中的應用

4.1 命名服務

因爲zookeeper的目錄的路徑是唯一的,所以就可以保證命名是不會衝突的,即可以做服務發現

4.2 配置管理

因爲zookeeper的節點可以存儲數據,所以我們可以把配置相關的數據存儲在zookeeper的節點中,然後客戶端利用zookeeper的通知機制首次啓動時獲取節點中的數據,其次如果節點中的配置信息變動,就會通知監聽這個節點的客戶端,客戶端就會獲取最新的配置

4.3 集羣管理

集羣管理主要有兩點,一是否有機器加入或者退出,而master選舉

對於1 我們可以讓機器連接後就創建臨時節點,當機器斷開連接的時候,臨時節點就會被刪除,這樣其他的機器監聽這個臨時節點的父節點,有變化的時候就會通知。

4.4 隊列管理

隊列管理主要有兩點:一個是同步隊列怎麼實現,另一個是如何實現先進先出(FIFO)
同步隊列:只有當全部成員都到齊是,隊列纔可以用

zookeeper 對於同步隊列的實現就是在目錄下創建臨時節點,然後監聽節點數目是否滿足要求,當滿足要求的時候纔可以用

對於第二點我們只需要給節點編號,然後取節點編號最小的數據

總上所述:在目錄下創建臨時有序節點然後客戶端監聽這個目錄中節點的數目,節點編號最小的開始出隊即可實現隊列管理

4.5 分佈式鎖

分佈式鎖主要有兩種,排他鎖與共享鎖

對於排他鎖:所有客戶端都去創建臨時無序節點a,創建成功的獲取共享鎖;
對於共享鎖:所有客戶端都去創建臨時有序節點a,編號最小的獲取鎖;其他的節點監聽前一個編號的節點是否存在,不存在的時候本節點即獲取鎖

五.zookeeper集羣的角色

上面所說的都是單服務器的例子,加入我們的服務器很多,就不可能僅僅使用一臺zookeeper服務器,這時候就需要搭建zookeeper服務器集羣
zookeeper的角色一共有三種

  1. leader:負責投票的發起和決議 更新
  2. follower:接受客戶端的請求並返回結果,參與leader選舉過程
  3. observer:不參與leader選舉過程,不參與過半寫成功策略,爲了提高讀取效率(話句話說只可以讀數據)

大概瞭解以上信息接下來我們講講分佈式與數據複製(上面一些術語會在下面解釋)

六.分佈式與數據複製

6.1 數據複製的好處

  1. 容錯:一個zookeeper服務器掛掉,其他的服務器還可以用
  2. 可擴展:可以動態的增加節點,提高整體的負載能力
  3. 提高性能:可以直接訪問距離客戶端租最近的節點

6.2 數據複製的方式

一般來說數據複製有兩種方式:

  1. 寫主:寫特定的節點
  2. 寫任意:數據的修改可以任意的節點
    zookeeper採用寫任意的策略:原因 可擴展性和吞吐率特別高,機器增加的時候吞吐量不會下降;

6.3 zookeeper的同步流程

  1. leader選舉成功後開始進行同步流程
  2. leader與follwer連接,各個follower向leader發送自己最大的事務id zxid
  3. leader根據zxid確定同步點
  4. 完成同步後,會通知follower,狀態變爲uptodata了
  5. follower收到uptodata這個狀態後就知道已經同步完成了,就又可以爲客戶端提供服務了

七.zookeeper的工作原理

原理就是原子廣播:
保證各個server之間的同步,同步時候使用zab協議
zab協議主要又兩個模式:同步模式(數據複製)與恢復模式(重新選舉leader)
爲了保證事務的一致性,zookeeper使用遞增的失事務id 共64位,前32位是標識這個事務是在哪個leader下的事務,後32爲用來遞增
所謂事務 就是每一次會影響服務端狀態改變的操作:節點的創建與刪除,數據更新session失敗

八.zookeeper的三種狀態

客戶端獲取連接後:服務端返回給客戶端的狀態:

  1. looking 當前服務器不知道誰是leader
  2. leading 當前的服務器就是leader
  3. following 當前服務器集羣又leader 但是本服務器不是leader 是follower

九.zookeeper的leader選舉流程

幾個概念:

  1. 服務器id 越大權重越大
  2. 事務id zxid 數值越大 權重越大
  3. 邏輯始終 投票次數
  4. 選舉狀態 looking leading following
    選舉流程:
    每次都選投自己,然後廣播給其他server zookeeper集羣的個數需要時單數,便於leader選舉
    假設現在又五個zookeeper服務器 ABCDE
    A啓動----->投票給自己----->廣播----->接受BC的廣播—>c的機器id大投給C
    B啓動----->投票給自己---->廣播------>接受AC的廣播—>c的機器id大投給C
    C啓動----->投票給自己----->廣播----->接受AB的廣播—>c的機器id大投給C

因爲已經投給C的已經超過半數了,所以DE的就無所謂了,C就是leader了

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