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