ZooKeeper典型應(yīng)用場景 |
數(shù)據(jù)發(fā)布與訂閱(配置中心) |
發(fā)布與訂閱模型,即所謂的配置中心,顧名思義就是發(fā)布者將數(shù)據(jù)發(fā)布到ZK節(jié)點(diǎn)上,供訂閱者動(dòng)態(tài)獲取數(shù)據(jù),實(shí)現(xiàn)配置信息的集中式管理和動(dòng)態(tài)更新。例如全局的配置信息,服務(wù)式服務(wù)框架的服務(wù)地址列表等就非常適合使用。 |
注意:在上面提到的應(yīng)用場景中,有個(gè)默認(rèn)前提是:數(shù)據(jù)量很小,但是數(shù)據(jù)更新可能會(huì)比較快的場景。 |
負(fù)載均衡 |
這里說的負(fù)載均衡是指軟負(fù)載均衡。在分布式環(huán)境中,為了保證高可用性,通常同一個(gè)應(yīng)用或同一個(gè)服務(wù)的提供方都會(huì)部署多份,達(dá)到對(duì)等服務(wù)。而消費(fèi)者就須要在這些對(duì)等的服務(wù)器中選擇一個(gè)來執(zhí)行相關(guān)的業(yè)務(wù)邏輯,其中比較典型的是消息中間件中的生產(chǎn)者,消費(fèi)者負(fù)載均衡。 |
消息中間件中發(fā)布者和訂閱者的負(fù)載均衡,linkedin開源的KafkaMQ和阿里開源的metaq都是通過zookeeper來做到生產(chǎn)者、消費(fèi)者的負(fù)載均衡。這里以metaq為例如講下: 生產(chǎn)者負(fù)載均衡:metaq發(fā)送消息的時(shí)候,生產(chǎn)者在發(fā)送消息的時(shí)候必須選擇一臺(tái)broker上的一個(gè)分區(qū)來發(fā)送消息,因此metaq在運(yùn)行過程中,會(huì)把所有broker和對(duì)應(yīng)的分區(qū)信息全部注冊(cè)到ZK指定節(jié)點(diǎn)上,默認(rèn)的策略是一個(gè)依次輪詢的過程,生產(chǎn)者在通過ZK獲取分區(qū)列表之后,會(huì)按照brokerId和partition的順序排列組織成一個(gè)有序的分區(qū)列表,發(fā)送的時(shí)候按照從頭到尾循環(huán)往復(fù)的方式選擇一個(gè)分區(qū)來發(fā)送消息。 消費(fèi)負(fù)載均衡: 在消費(fèi)過程中,一個(gè)消費(fèi)者會(huì)消費(fèi)一個(gè)或多個(gè)分區(qū)中的消息,但是一個(gè)分區(qū)只會(huì)由一個(gè)消費(fèi)者來消費(fèi)。MetaQ的消費(fèi)策略是:
在某個(gè)消費(fèi)者故障或者重啟等情況下,其他消費(fèi)者會(huì)感知到這一變化(通過 zookeeper watch消費(fèi)者列表),然后重新進(jìn)行負(fù)載均衡,保證所有的分區(qū)都有消費(fèi)者進(jìn)行消費(fèi)。 |
命名服務(wù)(Naming Service) |
命名服務(wù)也是分布式系統(tǒng)中比較常見的一類場景。在分布式系統(tǒng)中,通過使用命名服務(wù),客戶端應(yīng)用能夠根據(jù)指定名字來獲取資源或服務(wù)的地址,提供者等信息。被命名的實(shí)體通??梢允羌褐械臋C(jī)器,提供的服務(wù)地址,遠(yuǎn)程對(duì)象等等——這些我們都可以統(tǒng)稱他們?yōu)槊郑∟ame)。其中較為常見的就是一些分布式服務(wù)框架中的服務(wù)地址列表。通過調(diào)用ZK提供的創(chuàng)建節(jié)點(diǎn)的API,能夠很容易創(chuàng)建一個(gè)全局唯一的path,這個(gè)path就可以作為一個(gè)名稱。 |
阿里巴巴集團(tuán)開源的分布式服務(wù)框架Dubbo中使用ZooKeeper來作為其命名服務(wù),維護(hù)全局的服務(wù)地址列表,點(diǎn)擊這里查看Dubbo開源項(xiàng)目。在Dubbo實(shí)現(xiàn)中: 服務(wù)提供者在啟動(dòng)的時(shí)候,向ZK上的指定節(jié)點(diǎn)/dubbo/${serviceName}/providers目錄下寫入自己的URL地址,這個(gè)操作就完成了服務(wù)的發(fā)布。 服務(wù)消費(fèi)者啟動(dòng)的時(shí)候,訂閱/dubbo/${serviceName}/providers目錄下的提供者URL地址, 并向/dubbo/${serviceName} /consumers目錄下寫入自己的URL地址。 注意,所有向ZK上注冊(cè)的地址都是臨時(shí)節(jié)點(diǎn),這樣就能夠保證服務(wù)提供者和消費(fèi)者能夠自動(dòng)感應(yīng)資源的變化。 另外,Dubbo還有針對(duì)服務(wù)粒度的監(jiān)控,方法是訂閱/dubbo/${serviceName}目錄下所有提供者和消費(fèi)者的信息。 |
分布式通知/協(xié)調(diào) |
ZooKeeper中特有watcher注冊(cè)與異步通知機(jī)制,能夠很好的實(shí)現(xiàn)分布式環(huán)境下不同系統(tǒng)之間的通知與協(xié)調(diào),實(shí)現(xiàn)對(duì)數(shù)據(jù)變更的實(shí)時(shí)處理。使用方法通常是不同系統(tǒng)都對(duì)ZK上同一個(gè)znode進(jìn)行注冊(cè),監(jiān)聽znode的變化(包括znode本身內(nèi)容及子節(jié)點(diǎn)的),其中一個(gè)系統(tǒng)update了znode,那么另一個(gè)系統(tǒng)能夠收到通知,并作出相應(yīng)處理 |
總之,使用zookeeper來進(jìn)行分布式通知和協(xié)調(diào)能夠大大降低系統(tǒng)之間的耦合 |
集群管理與Master選舉 |
利用ZooKeeper有兩個(gè)特性,就可以實(shí)時(shí)另一種集群機(jī)器存活性監(jiān)控系統(tǒng):
例如,監(jiān)控系統(tǒng)在 /clusterServers 節(jié)點(diǎn)上注冊(cè)一個(gè)Watcher,以后每動(dòng)態(tài)加機(jī)器,那么就往 /clusterServers 下創(chuàng)建一個(gè) EPHEMERAL類型的節(jié)點(diǎn):/clusterServers/{hostname}. 這樣,監(jiān)控系統(tǒng)就能夠?qū)崟r(shí)知道機(jī)器的增減情況,至于后續(xù)處理就是監(jiān)控系統(tǒng)的業(yè)務(wù)了。
在分布式環(huán)境中,相同的業(yè)務(wù)應(yīng)用分布在不同的機(jī)器上,有些業(yè)務(wù)邏輯(例如一些耗時(shí)的計(jì)算,網(wǎng)絡(luò)I/O處理),往往只需要讓整個(gè)集群中的某一臺(tái)機(jī)器進(jìn)行執(zhí)行,其余機(jī)器可以共享這個(gè)結(jié)果,這樣可以大大減少重復(fù)勞動(dòng),提高性能,于是這個(gè)master選舉便是這種場景下的碰到的主要問題。 利用ZooKeeper的強(qiáng)一致性,能夠保證在分布式高并發(fā)情況下節(jié)點(diǎn)創(chuàng)建的全局唯一性,即:同時(shí)有多個(gè)客戶端請(qǐng)求創(chuàng)建 /currentMaster 節(jié)點(diǎn),最終一定只有一個(gè)客戶端請(qǐng)求能夠創(chuàng)建成功。利用這個(gè)特性,就能很輕易的在分布式環(huán)境中進(jìn)行集群選取了。 另外,這種場景演化一下,就是動(dòng)態(tài)Master選舉。這就要用到?EPHEMERAL_SEQUENTIAL類型節(jié)點(diǎn)的特性了。 上文中提到,所有客戶端創(chuàng)建請(qǐng)求,最終只有一個(gè)能夠創(chuàng)建成功。在這里稍微變化下,就是允許所有請(qǐng)求都能夠創(chuàng)建成功,但是得有個(gè)創(chuàng)建順序,于是所有的請(qǐng)求最終在ZK上創(chuàng)建結(jié)果的一種可能情況是這樣: /currentMaster/{sessionId}-1 ,?/currentMaster/{sessionId}-2 ,?/currentMaster/{sessionId}-3 ….. 每次選取序列號(hào)最小的那個(gè)機(jī)器作為Master,如果這個(gè)機(jī)器掛了,由于他創(chuàng)建的節(jié)點(diǎn)會(huì)馬上小時(shí),那么之后最小的那個(gè)機(jī)器就是Master了。 |
|
分布式鎖 |
分布式鎖,這個(gè)主要得益于ZooKeeper為我們保證了數(shù)據(jù)的強(qiáng)一致性。鎖服務(wù)可以分為兩類,一個(gè)是保持獨(dú)占,另一個(gè)是控制時(shí)序。
|
分布式隊(duì)列 |
隊(duì)列方面,簡單地講有兩種,一種是常規(guī)的先進(jìn)先出隊(duì)列,另一種是要等到隊(duì)列成員聚齊之后的才統(tǒng)一按序執(zhí)行。對(duì)于第一種先進(jìn)先出隊(duì)列,和分布式鎖服務(wù)中的控制時(shí)序場景基本原理一致,這里不再贅述。 第二種隊(duì)列其實(shí)是在FIFO隊(duì)列的基礎(chǔ)上作了一個(gè)增強(qiáng)。通??梢栽?/queue 這個(gè)znode下預(yù)先建立一個(gè)/queue/num 節(jié)點(diǎn),并且賦值為n(或者直接給/queue賦值n),表示隊(duì)列大小,之后每次有隊(duì)列成員加入后,就判斷下是否已經(jīng)到達(dá)隊(duì)列大小,決定是否可以開始執(zhí)行了。這種用法的典型場景是,分布式環(huán)境中,一個(gè)大任務(wù)Task A,需要在很多子任務(wù)完成(或條件就緒)情況下才能進(jìn)行。這個(gè)時(shí)候,凡是其中一個(gè)子任務(wù)完成(就緒),那么就去 /taskList 下建立自己的臨時(shí)時(shí)序節(jié)點(diǎn)(CreateMode.EPHEMERAL_SEQUENTIAL),當(dāng) /taskList 發(fā)現(xiàn)自己下面的子節(jié)點(diǎn)滿足指定個(gè)數(shù),就可以進(jìn)行下一步按序進(jìn)行處理了。 |
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
文章名稱:ZooKeeper典型應(yīng)用場景-創(chuàng)新互聯(lián)
分享地址:http://chinadenli.net/article38/ddiepp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)、ChatGPT、服務(wù)器托管、網(wǎng)站排名、用戶體驗(yàn)、網(wǎng)站改版
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容