zookeeper 作為一個(gè)分布式的服務(wù)框架,主要用來解決分布式集群中應(yīng)用系統(tǒng)的一致性問題,解決分布式環(huán)境下多個(gè)進(jìn)程或者多個(gè)中間件之間的同步控制,使有序訪問某類資源抽活。它能提供基于類似于文件系統(tǒng)的目錄節(jié)點(diǎn)樹方式的數(shù)據(jù)存儲(chǔ)。zookeeper創(chuàng)建znode節(jié)點(diǎn)時(shí)锰什,根據(jù)指定的類型mode不同下硕,可以創(chuàng)建三種不同節(jié)點(diǎn):臨時(shí)節(jié)點(diǎn)、持久化節(jié)點(diǎn)和有序節(jié)點(diǎn)汁胆。
持久節(jié)點(diǎn)是一種非常有用的節(jié)點(diǎn)梭姓,持久節(jié)點(diǎn)的刪除只能通過調(diào)用delete來進(jìn)行刪除,一般用來保存系統(tǒng)級(jí)的配置信息嫩码,一般項(xiàng)目中會(huì)有單獨(dú)的系統(tǒng)來維護(hù)配置信息糊昙。
臨時(shí)節(jié)點(diǎn)傳達(dá)了應(yīng)用某些方面的信息,當(dāng)前會(huì)話session有效時(shí)znode節(jié)點(diǎn)信息存在谢谦,如果會(huì)話session過期或者主動(dòng)關(guān)閉會(huì)話臨時(shí)節(jié)點(diǎn)將會(huì)被刪除释牺。也就是一個(gè)臨時(shí)的節(jié)點(diǎn)在以下兩種情況下將被刪除:當(dāng)創(chuàng)建者的客戶端的會(huì)話因?yàn)槌瑫r(shí)或者主動(dòng)關(guān)閉而終止;當(dāng)某個(gè)客戶端主動(dòng)刪除該節(jié)點(diǎn)回挽。
一個(gè)znode還可以設(shè)置為有序節(jié)點(diǎn)没咙,一個(gè)有序的znode節(jié)點(diǎn)被分配唯一一個(gè)單調(diào)遞增的整數(shù)。當(dāng)創(chuàng)建有序節(jié)點(diǎn)時(shí)千劈,一個(gè)序號(hào)會(huì)被追加到路徑之后祭刚。例如,如果一個(gè)客戶端創(chuàng)建了一個(gè)有序znode節(jié)點(diǎn),其路徑為/tasks/task-涡驮,那么zookeeper將會(huì)分配一個(gè)序號(hào)暗甥,如1,并將這個(gè)數(shù)字追加到路徑之后捉捅,最后該節(jié)點(diǎn)的名稱/tasks/task-1撤防。
基于不同的znode節(jié)點(diǎn)特性,zookeeper可以解決多種場(chǎng)景問題棒口,dubbo+zookeeper(服務(wù)注冊(cè)和發(fā)現(xiàn))寄月、配置中心和分布式鎖。
一无牵、注冊(cè)中心
可以借助zookeeper實(shí)現(xiàn)服務(wù)注冊(cè)和發(fā)現(xiàn)功能漾肮,最常見的組合是dubbo+zookeeper。在一個(gè)分布式系統(tǒng)中茎毁,服務(wù)提供者向zookeeper注冊(cè)中心注冊(cè)服務(wù)克懊,而服務(wù)消費(fèi)者從注冊(cè)中心訂閱服務(wù)。zookeeper作為服務(wù)注冊(cè)中心七蜘,對(duì)服務(wù)進(jìn)行統(tǒng)一管理保檐,提供地址服務(wù)。
二崔梗、配置中心
應(yīng)用程序中配置信息包括application.properties、數(shù)據(jù)庫(kù)配置垒在、應(yīng)用邏輯相關(guān)的常量配置蒜魄、開關(guān)配置等,常用的配置方式是把這些配置信息放到各個(gè)應(yīng)用程序中场躯,這樣當(dāng)應(yīng)用程序的配置信息發(fā)生變化時(shí)每次都需要重啟應(yīng)用程序谈为。為了解決這類問題,可以把配置信息統(tǒng)一放至動(dòng)態(tài)配置中心踢关,由專門應(yīng)用進(jìn)行管理伞鲫,zookeeper可以充當(dāng)動(dòng)態(tài)配置中心角色,專門存放項(xiàng)目中配置信息签舞。應(yīng)用啟動(dòng)時(shí)從配置中心讀取配置信息并存放至應(yīng)用程序緩存中秕脓,應(yīng)用程序使用配置信息時(shí)直接從本地緩存獲取,有效避免了多次遠(yuǎn)程配置信息獲取儒搭。為使各應(yīng)用程序中配置信息與配置中心保持一致吠架,可以采用啟動(dòng)時(shí)全量同步、定時(shí)增量同步搂鲫、設(shè)置監(jiān)聽傍药、應(yīng)急同步等多種手段。同時(shí)當(dāng)配置中心配置發(fā)生變化時(shí)會(huì)push推送到各個(gè)應(yīng)用。
三拐辽、分布式鎖
利用zookeeper節(jié)點(diǎn)的唯一性特點(diǎn)可以實(shí)現(xiàn)分布式鎖拣挪,znode節(jié)點(diǎn)在同一級(jí)別或路徑下具有唯一性,如果節(jié)點(diǎn)已經(jīng)存在俱诸,再次創(chuàng)建相同節(jié)點(diǎn)(set /lock 1)時(shí)就會(huì)報(bào)異常菠劝。假如都往zookeeper上注冊(cè)lock節(jié)點(diǎn)(set /lock 1),根據(jù)節(jié)點(diǎn)唯一性,只有一個(gè)應(yīng)用創(chuàng)建節(jié)點(diǎn)成功乙埃,如果該節(jié)點(diǎn)已經(jīng)存在闸英,說明其它應(yīng)用已經(jīng)成功注冊(cè)一個(gè)節(jié)點(diǎn)(已經(jīng)獲取了鎖)。所以分布式應(yīng)用程序可以根據(jù)zookeeper的znode節(jié)點(diǎn)的唯一性特性實(shí)現(xiàn)分布式鎖功能介袜。
四甫何、集群管理
常見組合是zookeeper+kafka,由zookeeper實(shí)現(xiàn)kafka集群管理遇伞。zookeeper實(shí)現(xiàn)高可用集群方式是中心式集群辙喂,一個(gè)中心節(jié)點(diǎn)leader,多個(gè)從節(jié)點(diǎn)follower鸠珠。當(dāng)leader節(jié)點(diǎn)出現(xiàn)異常時(shí)巍耗,可以從follower節(jié)點(diǎn)選舉出一個(gè)新的leader節(jié)點(diǎn)。zookeeper集群為保障高可用的特性渐排,所有事務(wù)請(qǐng)求(add/set/delete)統(tǒng)一由leader節(jié)點(diǎn)處理炬太,如果事務(wù)請(qǐng)求到達(dá)follower節(jié)點(diǎn),則follower節(jié)點(diǎn)會(huì)將事務(wù)請(qǐng)求轉(zhuǎn)發(fā)給leader節(jié)點(diǎn)進(jìn)行處理驯耻,leader處理完事務(wù)請(qǐng)求后再進(jìn)行分發(fā)亲族,以確保數(shù)據(jù)同步和一致性。非事務(wù)請(qǐng)求(查詢請(qǐng)求)任何節(jié)點(diǎn)都可以處理可缚。