1. 程式人生 > >zookeeper應用場景

zookeeper應用場景

cor 標記 熱備份 行數據 消息 目的 數據庫集群 mys img

典型應用場景

  1.1 Zookeeper是一個高可用的分布式數據管理和協調框架,並且能夠很好的保證分布式環境中數據的一致性。在越來越多的分布式系統(HadoopHBaseKafka)中,Zookeeper都作為核心組件使用。

  2.1 數據發布/訂閱

  數據發布/訂閱系統,即配置中心。需要發布者將數據發布到Zookeeper的節點上,供訂閱者進行數據訂閱,進而達到動態獲取數據的目的,實現配置信息的集中式管理和數據的動態更新。發布/訂閱一般有兩種設計模式:推模式和拉模式,服務端主動將數據更新發送給所有訂閱的客戶端稱為推模式;客戶端主動請求獲取最新數據稱為拉模式,Zookeeper采用了推拉相結合的模式,客戶端向服務端註冊自己需要關註的節點,一旦該節點數據發生變更,那麽服務端就會向相應的客戶端推送

Watcher事件通知,客戶端接收到此通知後,主動到服務端獲取最新的數據。

  若將配置信息存放到Zookeeper上進行集中管理,在通常情況下,應用在啟動時會主動到Zookeeper服務端上進行一次配置信息的獲取,同時,在指定節點上註冊一個Watcher監聽,這樣在配置信息發生變更,服務端都會實時通知所有訂閱的客戶端,從而達到實時獲取最新配置的目的。

  2.2 負載均衡

  負載均衡是一種相當常見的計算機網絡技術,用來對多個計算機、網絡連接、CPU、磁盤驅動或其他資源進行分配負載,以達到優化資源使用、最大化吞吐率、最小化響應時間和避免過載的目的。

  使用Zookeeper實現動態

DNS服務

  · 域名配置,首先在Zookeeper上創建一個節點來進行域名配置,如DDNS/app1/server.app1.company1.com

  · 域名解析,應用首先從域名節點中獲取IP地址和端口的配置,進行自行解析。同時,應用程序還會在域名節點上註冊一個數據變更Watcher監聽,以便及時收到域名變更的通知。

  · 域名變更,若發生IP或端口號變更,此時需要進行域名變更操作,此時,只需要對指定的域名節點進行更新操作,Zookeeper就會向訂閱的客戶端發送這個事件通知,客戶端之後就再次進行域名配置的獲取。

  2.3 命名服務

  命名服務是分步實現系統中較為常見的一類場景,分布式系統中,被命名的實體通常可以是集群中的機器、提供的服務地址或遠程對象等,通過命名服務,客戶端可以根據指定名字來獲取資源的實體、服務地址和提供者的信息。

Zookeeper也可幫助應用系統通過資源引用的方式來實現對資源的定位和使用,廣義上的命名服務的資源定位都不是真正意義上的實體資源,在分布式環境中,上層應用僅僅需要一個全局唯一的名字。Zookeeper可以實現一套分布式全局唯一ID的分配機制。

技術分享圖片

  通過調用Zookeeper節點創建的API接口就可以創建一個順序節點,並且在API返回值中會返回這個節點的完整名字,利用此特性,可以生成全局ID,其步驟如下

  1. 客戶端根據任務類型,在指定類型的任務下通過調用接口創建一個順序節點,如"job-"

  2. 創建完成後,會返回一個完整的節點名,如"job-00000001"

  3. 客戶端拼接type類型和返回值後,就可以作為全局唯一ID了,如"type2-job-00000001"

  2.4 分布式協調/通知

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

  MySQL數據復制總線是一個實時的數據復制框架,用於在不同的MySQL數據庫實例之間進行異步數據復制和數據變化通知,整個系統由MySQL數據庫集群、消息隊列系統、任務管理監控平臺、Zookeeper集群等組件共同構成的一個包含生產者、復制管道、數據消費等部分的數據總線系統。

技術分享圖片

  Zookeeper主要負責進行分布式協調工作,在具體的實現上,根據功能將數據復制組件劃分為三個模塊:Core(實現數據復制核心邏輯,將數據復制封裝成管道,並抽象出生產者和消費者概念)、Server(啟動和停止復制任務)、Monitor(監控任務的運行狀態,若數據復制期間發生異常或出現故障則進行告警)

技術分享圖片

  每個模塊作為獨立的進程運行在服務端,運行時的數據和配置信息均保存在Zookeeper上。

技術分享圖片  任務創建Core進程啟動時,首先向/mysql_replicator/tasks節點註冊任務,如創建一個子節點/mysql_replicator/tasks/copy_hot/item,若註冊過程中發現該子節點已經存在,說明已經有其他Task機器註冊了該任務,因此其自身不需要再創建該節點。

  任務熱備份,為了應對任務故障或者復制任務所在主機故障,復制組件采用"熱備份"的容災方式,即將同一個復制任務部署在不同的主機上,主備任務機通過Zookeeper互相檢測運行監控狀況。無論在第一步是否創建了任務節點,每臺機器都需要在/mysql_replicator/tasks/copy_hot_item/instrances節點上將自己的主機名註冊上去,節點類型為臨時順序節點,在完成子節點創建後,每天任務機器都可以獲取到自己創建的節點名及所有子節點列表,然後通過對比判斷自己是否是所有子節點中序號最小的,若是,則將自己運行狀態設置為RUNNING,其他機器設置為STANDBY,這種策略稱為小序號優先策略。

  熱備切換,完成運行狀態的標示後,其中標記為RUNNING的客戶端機器進行正常的數據復制,而標記為STANDBY的機器則進入待命狀態,一旦RUNNING機器出現故障,那麽所有標記為STANDBY的機器再次按照小序號優先策略來選出RUNNIG機器運行(STANDY機器需要在/mysql_replicator/tasks/copy_hot_item/instances節點上註冊一個子節點列表變更監聽,RUNNING機器宕機與Zookeeper斷開連接後,對應的節點也會消失,於是所有客戶端收到通知,進行新一輪選舉)。

  記錄執行狀態RUNNING機器需要將運行時的上下文狀態保留給STANDBY機器。

   控制臺協調Server的主要工作就是進行任務控制,通過Zookeeper來對不同任務進行控制和協調,Server會將每個復制任務對應生產者的元數據及消費者的相關信息以配置的形式寫入任務節點/mysql_replicator/tasks/copy_hot_item中去,以便該任務的所有任務機器都能夠共享復制任務的配置。

  在上述熱備份方案中,針對一個任務,都會至少分配兩臺任務機器來進行熱備份(RUNNINGSTANDBY、即主備機器),若需要MySQL實例需要進行數據復制,那麽需要消耗太多機器。此時,需要使用冷備份方案,其對所有任務進行分組。

zookeeper應用場景