Zookeeper入門看這裏!

Zookeeper是什麼

它主要是用來解決分佈式應用中經常遇到的一些數據管理問題,
如:統一命名服務、狀態同步服務、集羣管理、分佈式應用配置項的管理等。

  • 配置管理
    在我們的應用中除了代碼外,還有一些就是各種配置。比如數據庫連接等。一般我們都是使用配置文件的方式,在代碼中引入這些配置文件。但是當我們只有一種配置,只有一臺服務器,並且不經常修改的時候,使用配置文件是一個很好的做法。
    但是如果我們配置非常多,有很多服務器都需要這個配置,而且還可能是動態的話使用配置文件就不是個好主意了。
    這個時候需要尋找一種集中管理配置的方法,我們在這個集中的地方修改維護配置。而且很多服務的正常運行都非常依賴這個配置,所以也需要這個集中提供配置的服務具備很高的可靠性。
    過程大概是這樣的,所有相關應用程序對某個目錄節點進行監聽,一旦配置信息發生變化,每個應用程序就會收到 zookeeper 的通知,然後從 zookeeper 獲取新的配置信息應用到系統中。
    一般我們可以用一個集羣來提供這個配置服務,但是用集羣提升可靠性,那如何保證配置在集羣中的一致性呢? 這個時候就需要使用一種實現了一致性協議的服務了。
    Zookeeper就是這種服務,它使用Zab這種一致性協議來提供一致性。
    現在有很多開源項目使用Zookeeper來維護配置:
    1)比如在HBase中,客戶端就是連接一個Zookeeper,獲得必要的HBase集羣的配置信息,然後纔可以進一步操作。
    2)還有在開源的消息隊列Kafka中,也使用Zookeeper來維護broker的信息。
    3)在Alibaba開源的SOA框架Dubbo中也廣泛的使用Zookeeper管理一些配置來實現服務治理。

如圖
在這裏插入圖片描述

  • 名字服務
    比如我們的系統要通過網絡訪問很多個系統,我們要知道很多個系統的ip地址和端口號等,如果我們在本地保存服務的地址也是非常不方便。
    但是如果我們只需要訪問一個大家都熟知的訪問點,這裏提供統一的入口,我們只需要範圍我們那麼維護起來將方便得多了。
    zookeeper就是保存了名稱和服務地址的映射關係,我們只需要訪問名稱就可以獲得對應服務的地址。
    提供者會把名稱和服務地址寫到zookeeper上,
    客戶端會通過zookeeper獲取服務列表。

如圖
在這裏插入圖片描述

  • 分佈式鎖
    我們就可以利用Zookeeper來協調多個分佈式進程之間的活動。
    比如在一個分佈式環境中,爲了提高可靠性,我們的集羣的每臺服務器上都部署着同樣的服務。
    但是,一件事情如果集羣中的每個服務器都進行的話,那相互之間就要協調,編程起來將非常複雜。而如果我們只讓一個服務進行操作,那又存在單點。
    通常還有一種做法就是使用分佈式鎖,在某個時刻只讓一個服務去幹活,當這臺服務出問題的時候鎖釋放,立即轉移到另外的服務運行。

在這裏插入圖片描述

  • 集羣管理
    在分佈式的集羣中,經常會由於各種原因,比如硬件故障,軟件故障,網絡問題,有些節點會進進出出。有新的節點加入進來,也有老的節點退出集羣。
    這個時候,集羣中其他機器需要感知到這種變化,然後根據這種變化做出對應的決策。
    1)比如我們是一個分佈式存儲系統,有一箇中央控制節點負責存儲的分配,當有新的存儲進來的時候我們要根據現在集羣目前的狀態來分配存儲節點。這個時候我們就需要動態感知到集羣目前的狀態。
    2)還有,比如一個分佈式的SOA架構中,服務是一個集羣提供的,當消費者訪問某個服務時,就需要採用某種機制發現現在有哪些節點可以提供該服務(這也稱之爲服務發現,比如Alibaba開源的SOA框架Dubbo就採用了Zookeeper作爲服務發現的底層機制)。
    3)還有開源的Kafka隊列就採用了Zookeeper作爲Cosnumer的上下線管理。

在這裏插入圖片描述

zookeeper的數據結構

1、層次化的目錄結構,命名符合常規文件系統規範(類似文件系統)
在這裏插入圖片描述

2、每個節點在zookeeper中叫做znode,並且其有一個唯一的路徑標識

3、節點Znode可以包含數據和子節點(但是EPHEMERAL類型的節點不能有子節點)

節點類型 :
a、Znode有兩種類型:

短暫(ephemeral)
(create -e /app1/test1 “test1” 客戶端斷開連接zk刪除ephemeral類型節點)

持久(persistent)
(create -s /app1/test2 “test2” 客戶端斷開連接zk不刪除persistent類型節點)

b、Znode有四種形式的目錄節點(默認是persistent )
PERSISTENT
PERSISTENT_SEQUENTIAL(持久序列/test0000000019 )
EPHEMERAL
EPHEMERAL_SEQUENTIAL

c、創建znode時設置順序標識,znode名稱後會附加一個值,順序號是一個單調遞增的計數器,由父節點維護
在這裏插入圖片描述
d、在分佈式系統中,順序號可以被用於爲所有的事件進行全局排序,這樣客戶端可以通過順序號推斷事件的順序

感謝您的閱讀~,如果有幫助到您,可以關注一下

感謝以下博客

https://www.cnblogs.com/ultranms/p/9585191.html
https://segmentfault.com/a/1190000018876282

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