一、前言
在上一篇博客已經(jīng)介紹了Zookeeper開源客戶端的簡單實用,本篇講解Zookeeper的應(yīng)用場景。
二、典型應(yīng)用場景
Zookeeper是一個高可用的分布式數(shù)據(jù)管理和協(xié)調(diào)框架,并且能夠很好的保證分布式環(huán)境中數(shù)據(jù)的一致性。在越來越多的分布式系統(tǒng)(Hadoop、HBase、Kafka)中,Zookeeper都作為核心組件使用。
2.1 數(shù)據(jù)發(fā)布/訂閱
數(shù)據(jù)發(fā)布/訂閱系統(tǒng),即配置中心。需要發(fā)布者將數(shù)據(jù)發(fā)布到Zookeeper的節(jié)點上,供訂閱者進行數(shù)據(jù)訂閱,進而達到動態(tài)獲取數(shù)據(jù)的目的,實現(xiàn)配置信息的集中式管理和數(shù)據(jù)的動態(tài)更新。發(fā)布/訂閱一般有兩種設(shè)計模式:推模式和拉模式,服務(wù)端主動將數(shù)據(jù)更新發(fā)送給所有訂閱的客戶端稱為推模式;客戶端主動請求獲取最新數(shù)據(jù)稱為拉模式,Zookeeper采用了推拉相結(jié)合的模式,客戶端向服務(wù)端注冊自己需要關(guān)注的節(jié)點,一旦該節(jié)點數(shù)據(jù)發(fā)生變更,那么服務(wù)端就會向相應(yīng)的客戶端推送Watcher事件通知,客戶端接收到此通知后,主動到服務(wù)端獲取最新的數(shù)據(jù)。
若將配置信息存放到Zookeeper上進行集中管理,在通常情況下,應(yīng)用在啟動時會主動到Zookeeper服務(wù)端上進行一次配置信息的獲取,同時,在指定節(jié)點上注冊一個Watcher監(jiān)聽,這樣在配置信息發(fā)生變更,服務(wù)端都會實時通知所有訂閱的客戶端,從而達到實時獲取最新配置的目的。
2.2 負(fù)載均衡
負(fù)載均衡是一種相當(dāng)常見的計算機網(wǎng)絡(luò)技術(shù),用來對多個計算機、網(wǎng)絡(luò)連接、CPU、磁盤驅(qū)動或其他資源進行分配負(fù)載,以達到優(yōu)化資源使用、最大化吞吐率、最小化響應(yīng)時間和避免過載的目的。
使用Zookeeper實現(xiàn)動態(tài)DNS服務(wù)
· 域名配置,首先在Zookeeper上創(chuàng)建一個節(jié)點來進行域名配置,如DDNS/app1/server.app1.company1.com。
· 域名解析,應(yīng)用首先從域名節(jié)點中獲取IP地址和端口的配置,進行自行解析。同時,應(yīng)用程序還會在域名節(jié)點上注冊一個數(shù)據(jù)變更Watcher監(jiān)聽,以便及時收到域名變更的通知。
· 域名變更,若發(fā)生IP或端口號變更,此時需要進行域名變更操作,此時,只需要對指定的域名節(jié)點進行更新操作,Zookeeper就會向訂閱的客戶端發(fā)送這個事件通知,客戶端之后就再次進行域名配置的獲取。
2.3 命名服務(wù)
命名服務(wù)是分步實現(xiàn)系統(tǒng)中較為常見的一類場景,分布式系統(tǒng)中,被命名的實體通??梢允羌褐械臋C器、提供的服務(wù)地址或遠程對象等,通過命名服務(wù),客戶端可以根據(jù)指定名字來獲取資源的實體、服務(wù)地址和提供者的信息。Zookeeper也可幫助應(yīng)用系統(tǒng)通過資源引用的方式來實現(xiàn)對資源的定位和使用,廣義上的命名服務(wù)的資源定位都不是真正意義上的實體資源,在分布式環(huán)境中,上層應(yīng)用僅僅需要一個全局唯一的名字。Zookeeper可以實現(xiàn)一套分布式全局唯一ID的分配機制。
通過調(diào)用Zookeeper節(jié)點創(chuàng)建的API接口就可以創(chuàng)建一個順序節(jié)點,并且在API返回值中會返回這個節(jié)點的完整名字,利用此特性,可以生成全局ID,其步驟如下
1. 客戶端根據(jù)任務(wù)類型,在指定類型的任務(wù)下通過調(diào)用接口創(chuàng)建一個順序節(jié)點,如"job-"。
2. 創(chuàng)建完成后,會返回一個完整的節(jié)點名,如"job-00000001"。
3. 客戶端拼接type類型和返回值后,就可以作為全局唯一ID了,如"type2-job-00000001"。
2.4 分布式協(xié)調(diào)/通知
Zookeeper中特有的Watcher注冊于異步通知機制,能夠很好地實現(xiàn)分布式環(huán)境下不同機器,甚至不同系統(tǒng)之間的協(xié)調(diào)與通知,從而實現(xiàn)對數(shù)據(jù)變更的實時處理。通常的做法是不同的客戶端都對Zookeeper上的同一個數(shù)據(jù)節(jié)點進行Watcher注冊,監(jiān)聽數(shù)據(jù)節(jié)點的變化(包括節(jié)點本身和子節(jié)點),若數(shù)據(jù)節(jié)點發(fā)生變化,那么所有訂閱的客戶端都能夠接收到相應(yīng)的Watcher通知,并作出相應(yīng)處理。
MySQL數(shù)據(jù)復(fù)制總線是一個實時的數(shù)據(jù)復(fù)制框架,用于在不同的MySQL數(shù)據(jù)庫實例之間進行異步數(shù)據(jù)復(fù)制和數(shù)據(jù)變化通知,整個系統(tǒng)由MySQL數(shù)據(jù)庫集群、消息隊列系統(tǒng)、任務(wù)管理監(jiān)控平臺、Zookeeper集群等組件