Apache Zookeeper - 分佈式服務框架

參考資料

1、官方網站:http://zookeeper.apache.org/

Zookeeper 介紹

Zookeeper 是一個典型的分佈式數據一致性的解決方案。設計目的是將那些複雜且容易出錯的分佈式一致性服務封裝起來,構成一個高效可靠的原語集,並以一系列簡單易用的接口提供給用戶使用。分佈式應用程序可以基於它實現諸如:數據發佈/訂閱、負載均衡、命名服務、分佈式協調/通知、集羣管理、master 選舉、分佈式鎖、分佈式隊列等功能。

Zookeeper 使用場景

維護配置信息

在分佈式服務中,不同的服務器提供不同的服務,但不同的服務中可能會有相同的配置文件,當配置文件中的某些內容需要修改的時候如果沒有 zookeeper 的存在那麼將需要手動登錄不同的服務器進行逐個的修改且修改完以後還需要重啓服務來使配置生效,這樣不僅麻煩而且容易出錯。如果使用 zookeeper 來維護配置信息,只需要把各個服務器相同的配置內容整理出來並且放在 zookeeper 的節點中然後讓服務器來監聽這個節點,當節點的內容發生改變時服務器自動更新自己所需要的配置信息。

命名服務

zookeeper的命名服務功能主要是根據指定名字來獲取資源或服務的地址,提供者等信息,利用其 znode 的特點和 watcher 機制,將其作爲動態註冊和獲取服務信息的配置中心,統一管理服務名稱和其對應的服務器列表信息,我們能夠近乎實時地感知到後端服務器的狀態(上線、下線、宕機)。

分佈式鎖

分佈式鎖在整個系統提供一個全局、唯一的鎖,在分佈式系統中每個系統在進行相關操作的時候需要獲取到該鎖,才能執行相應操作。利用 Zookeeper 可以創建臨時帶序號節點的特性來實現一個分佈式鎖。當有一個線程訪問服務器的時候會在 zookeeper 中創建一個具有順序的臨時節點,這時候線程會判斷自己的序號是不是最小的,如果是最小的那麼它就可以獲得鎖,從而對數據進行處理,當該線程與服務器結束會話時這個創建的臨時節點也會被刪除。如果不是最小的則會監聽它是上一個節點,當這個節點被刪除時再獲取鎖。注意這裏每個節點都是隻監聽它的上一個節點即可,而不是監聽序號最小的節點。因爲臨時節點都是帶序號的,而且序號不會回退,所以只需要 監聽比其小1的節點。只要比它小1的節點被清除,則它就可以拿到資源去操作。

集羣管理

在多臺服務器組成的集羣中,需要監控每臺服務器的狀態,一旦某臺服務器掛掉了或有新的機器加入集羣,集羣都要感知到,從而採取相應的措施。一個主動的集羣可以自動感知節點的死亡和新節點的加入,它纔對更高效的提供服務。通常的做法是有臺主機器定時的去獲取其他機器的心跳,或其他機器定時主動彙報自己的狀態,這種方式存在一定的延時,並且主機器成爲單點,一旦掛掉便影響整個集羣。使用 Zookeeper 可以方便的實現集羣管理的功能。思路如下,每個服務器啓動時都向 zk 服務器提出創建臨時節點的請求,並且使用 getChildren 設置父節點的觀察,當該服務器掛掉之後,它創建的臨時節點也被 Zookeeper 服務器刪除,然後會觸發監視器,其他服務器便得到通知。創建新節點也是同理。

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