架構師必備:Zookeeper的應用場景

ZooKeeper是一個高可用的分佈式數據管理與系統協調框架。基於對Paxos算法的實現,使該框架保證了分佈式環境中數據的強一致性,也正是基 於這樣的特性,使得zookeeper能夠應用於很多場景。

架構師必備:Zookeeper的應用場景

1.1 數據發佈/訂閱

數據發佈/訂閱(Publish/Subscribe)系統,即所謂的配置中心,顧名思義就是發佈者將數據發佈到ZooKeeper的一個或一系列節點上,供訂閱者進行數據訂閱,進而達到動態獲取數據的目的,實現配置信息的集中式管理和數據的動態更新。

發佈/訂閱系統一般有兩種設計模式,分別是推模式和拉模式。

推模式:服務端主動將數據更新發送給所有訂閱的客戶端。

拉模式:客戶端通過採用定時輪詢拉取。

1.2 負載均衡

架構師必備:Zookeeper的應用場景

負載均衡(Load Balance)是一種相當常見的計算機網絡技術,用來對多個計算機(計算機集群)、網絡連接、CPU、硬盤驅動器或其他資源進行分配負載,以達到優化資源使用、最大化吞吐率、最小化響應時間和避免過載的目的。通常,負載均衡可以分為硬件和軟件負載均衡兩類。

1.3 命名服務

命名服務(Name Service)也是分佈式系統中比較常見的一類場景。在《Java網絡高級編程》一書中提到,命名服務是分佈式系統最基本的公共服務之一。在分佈式系統中,被命名的實體通常是集群中的機器、提供的服務地址或遠程對象等--這些我們都可以統稱他們為名字,其中比較常見的就是一些分佈式服務框架(RPC、RMI)中的服務地址列表,通過使用命名服務,客戶端應用能夠根據指定名字來獲取資源的實體、服務地址和提供者信息等。

Java語言中的JNDI便是一種典型的命名服務。JNDI是Java命名和目錄接口(Java Naming and Directory Interface)的縮寫,是J2EE體系中重要的規範之一,標準的J2EE容器都提供了對JNDI規範的實現。因此,在實際開發中,開發人員常常使用應用服務器自帶的JNDI實現來完成數據源的配置與管理--使用JNDI方式後,開發人員可以完全不需要關心與數據庫相關的任何信息,包括數據庫類型、JDBC驅動類型以及數據庫賬戶等。

ZooKeeper提供的命名服務功能與JNDI技術有類似的地方,都能夠幫助應用系統通過一個資源引用的方式來實現對資源的定位與使用。另外,廣義上命名服務的資源定位都不是真正意義的實體資源--在分佈式環境中,上層應用僅僅需要一個全局唯一的名字,類似於數據庫的唯一主鍵。下面我們看看如何使用ZooKeeper來實現一套分佈式全局唯一ID的分配機制。

所謂ID,就是一個能唯一標識某個對象的標識符。一說起全局唯一ID,相信讀者都會聯想到UUID。UUID是通用唯一標識碼(Universally Unique Identifier)的簡稱,是一種在分佈式系統中廣泛使用的用於唯一標識元素的標準,最典型的實現是GUID(Globally Unique Identifier,全局唯一標識符),主流ORM框架Hibernate有對UUID的直接支持。

1.4 分佈式協調/通知

分佈式協調/通知是將不同的分佈式組件有機結合起來的關鍵所在。對於一個在多臺機器上部署運行的應用而言,通常需要一個協調者(Coordinator)來控制整個系統的運行流程,例如分佈式事務的處理、機器間的相互協調等。同時,引入這樣一個協調者,便於將分佈式協調的職責從應用中分離出來,從而大大減少系統之家的耦合性,而且能夠顯著提高系統的可擴展性。

ZooKeeper中特有的Watcher註冊於異步通知機制,能夠很好地實現分佈式環境下不同機器,甚至是不同系統之間的協調與通知,從而實現對數據變更的實時處理。基於ZooKeeper實現分佈式協調與通知功能,通常的做法是不同的客戶端都對ZooKeeper上同一數據節點進行Watcher註冊,監聽數據節點的變化(包括數據節點本身及其子節點),如果數據節點發生變化,那麼所有訂閱的客戶端都能接收到相應的Watcher通知,並作出相應的處理。

1.5 Master選舉則是zookeeper中最為經典的使用場景了

在分佈式環境中,相同的業務應用分佈在不同的機器上,有些業務邏輯(例如一些耗時的計算,網絡I/O處理),往往只需要讓整個集群中的某一臺機器進行執行, 其餘機器可以共享這個結果,這樣可以大大減少重複勞動,提高性能,於是這個master選舉便是這種場景下的碰到的主要問題。

利用ZooKeeper的強一致性,能夠保證在分佈式高併發情況下節點創建的全局唯一性,即:同時有多個客戶端請求創建 /currentMaster 節點,最終一定只有一個客戶端請求能夠創建成功。

1.7 分佈式鎖

這是雅虎研究員設計Zookeeper的初衷。利用Zookeeper的臨時順序節點,可以輕鬆實現分佈式鎖。

二、ZooKeeper在大型分佈式系統中的應用

2.1 Hadoop

架構師必備:Zookeeper的應用場景

在Hadoop中,ZooKeeper主要用於實現HA(High Availability),這部分邏輯主要集中在Hadoop Common的HA模塊中,HDFS的NameNode與YARN的ResouceManager都是基於此HA模塊來實現自己的HA功能的。同時,在YARN中又特別提供了ZooKeeper來存儲應用的運行狀態。

2.2 HBase

HBase,全程Hadoop Database,是Google Bigtable的開源實現,是一個基於Hadoop文件系統設計的面向海量數據的高可靠性、高性能、面向列、可伸縮的分佈式存儲系統,利用HBase技術可以在廉價的PC服務器上搭建起大規模結構化的存儲集群。

HBase在實現上嚴格遵守了Google BigTable論文的設計思想。BigTable使用Chubby來負責分佈式狀態的協調,這是Google實現的一種基於Paxos算法的分佈式鎖服務,而HBase則採用了開源的ZooKeeper服務來完成對整個系統的分佈式協調工作。

2.3 Kafka

架構師必備:Zookeeper的應用場景

Kafka是一個吞吐量極高的分佈式消息系統,其整體設計師典型的發佈與訂閱模式系統。在Kafka集群中,沒有“中心主節點”的概念,集群中所有的服務器都是對等的,因此可以在不做任何配置更改的情況下實現服務器的添加和刪除,同樣,消息的生產者和消費者也能做到隨意重啟和機器的上下線。在Kafka的設計中,選擇使用ZooKeeper來進行所有Broker的管理。

Kafka使用ZooKeeper作為其分佈式協調框架,很好地將消息生成、消息存儲和消息消費有機結合起來,同時藉助ZooKeeper,Kafka能在保持包括生產者、消費者和Broker在內的所有組件無狀態的情況下,建立起生產者和消費者之間的訂閱關係,並實現了生產者和消費者的負載均衡。


分享到:


相關文章: