Zookeeper 中間件解決方案
中間件ZooKeeper(分布式服務(wù)框架)
1、簡(jiǎn)介
Zookeeper是為分布式應(yīng)用提供一致性服務(wù)的軟件,是一個(gè)開(kāi)源的分布式協(xié)調(diào)服務(wù),是開(kāi)源的hadoop項(xiàng)目的一個(gè)子項(xiàng)目,可以提供配置信息管理、命名、分布式同步、集群管理、數(shù)據(jù)庫(kù)切換等服務(wù)。它不適合用來(lái)存儲(chǔ)大量信息,可以用來(lái)存儲(chǔ)一些配置、發(fā)布與訂閱等少量信息。Hadoop、Storm、消息中間件、RPC服務(wù)框架、分布式數(shù)據(jù)庫(kù)同步系統(tǒng),這些都是Zookeeper的應(yīng)用場(chǎng)景。
zookeeper可以充當(dāng)一個(gè)服務(wù)注冊(cè)表(Service Registry),讓多個(gè)服務(wù)提供者形成一個(gè)集群,讓服務(wù)消費(fèi)者通過(guò)服務(wù)注冊(cè)表獲取具體的服務(wù)訪問(wèn)地址(ip+端口)去訪問(wèn)具體的服務(wù)提供者。
官方:ZooKeeper是一個(gè)開(kāi)源的的分布式服務(wù)框架,它是Apache Hadoop項(xiàng)目的一個(gè)子項(xiàng)目,主要用來(lái)解決分布式應(yīng)用場(chǎng)景中存在的一些問(wèn)題,如:統(tǒng)一命名服務(wù)、狀態(tài)同步服務(wù)、集群管理、分布式應(yīng)用配置管理等,它支持Standalone模式和分布式模式,在分布式模式下,能夠?yàn)榉植际綉?yīng)用提供高性能和可靠地協(xié)調(diào)服務(wù),而且使用ZooKeeper可以大大簡(jiǎn)化分布式協(xié)調(diào)服務(wù)的實(shí)現(xiàn),為開(kāi)發(fā)分布式應(yīng)用極大地降低了成本。
Zookeeper 作為一個(gè)分布式的服務(wù)框架,主要用來(lái)解決分布式集群中應(yīng)用系統(tǒng)的一致性問(wèn)題,它能提供基于類似于文件系統(tǒng)的目錄節(jié)點(diǎn)樹(shù)方式的數(shù)據(jù)存儲(chǔ),但是 Zookeeper 并不是用來(lái)專門存儲(chǔ)數(shù)據(jù)的,它的作用主要是用來(lái)維護(hù)和監(jiān)控你存儲(chǔ)的數(shù)據(jù)的狀態(tài)變化。通過(guò)監(jiān)控這些數(shù)據(jù)狀態(tài)的變化,從而可以達(dá)到基于數(shù)據(jù)的集群管理。
ZooKeeper的目標(biāo)是封裝好易出錯(cuò)的關(guān)鍵服務(wù),將簡(jiǎn)單易用的接口和性能高效、功能穩(wěn)定的系統(tǒng)提供給用戶。
Zookeeper是一個(gè)基于觀察者模式設(shè)計(jì)的分布式服務(wù)管理框架,負(fù)責(zé)存儲(chǔ)和管理相關(guān)數(shù)據(jù),接收觀察者的注冊(cè)。一旦這些數(shù)據(jù)的狀態(tài)發(fā)生變化,zookeeper就負(fù)責(zé)通知那些已經(jīng)在zookeeper集群進(jìn)行注冊(cè)并關(guān)心這些狀態(tài)發(fā)生變化的觀察者,以便觀察者執(zhí)行相關(guān)操作。
2、Zookeeper的3種角色:
1)Leader 2)Follower 3)Observer
一個(gè) ZooKeeper 集群同一時(shí)刻只會(huì)有一個(gè) Leader,其他都是 Follower 或 Observer。
3、節(jié)點(diǎn)讀寫服務(wù)分工:
1)ZooKeeper 集群的所有機(jī)器通過(guò)一個(gè) Leader 選舉過(guò)程來(lái)選定一臺(tái)被稱為L(zhǎng)eader
的機(jī)器,Leader服務(wù)器為客戶端提供讀和寫服務(wù)。
2)Follower 和 Observer 都能提供讀服務(wù),不能提供寫服務(wù)。兩者唯一的區(qū)別在于,
Observer機(jī)器不參與 Leader 選舉過(guò)程,也不參與寫操作的『過(guò)半寫成功』策略,因此 Observer 可以在不影響寫性能的情況下提升集群的讀性能。
ZooKeeper 對(duì)外的服務(wù)端口默認(rèn)是2181。
4、zookeeper的結(jié)構(gòu)其實(shí)就是一個(gè)樹(shù)形結(jié)構(gòu),leader就相當(dāng)于其中的根結(jié)點(diǎn),其它節(jié)點(diǎn)就相當(dāng)于follow節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)都保留自己的內(nèi)容。
Zookeeper集群中節(jié)點(diǎn)個(gè)數(shù)一般為奇數(shù)個(gè)(>=3),若集群中Master掛掉,剩余節(jié)點(diǎn)個(gè)數(shù)在半數(shù)以上時(shí),就可以推舉新的主節(jié)點(diǎn),繼續(xù)對(duì)外提供服務(wù)。
客戶端發(fā)起事務(wù)請(qǐng)求,事務(wù)請(qǐng)求的結(jié)果在整個(gè)Zookeeper集群中所有機(jī)器上的應(yīng)用情況是一致的。不會(huì)出現(xiàn)集群中部分機(jī)器應(yīng)用了該事務(wù),而存在另外一部分集群中機(jī)器沒(méi)有應(yīng)用該事務(wù)的情況。在Zookeeper集群中的任何一臺(tái)機(jī)器,其看到的服務(wù)器的數(shù)據(jù)模型是一致的。Zookeeper能夠保證客戶端請(qǐng)求的順序,每個(gè)請(qǐng)求分配一個(gè)全局唯一的遞增編號(hào),用來(lái)反映事務(wù)操作的先后順序。Zookeeper將全量數(shù)據(jù)保存在內(nèi)存中,并直接服務(wù)于所有的非事務(wù)請(qǐng)求,在以讀操作為主的場(chǎng)景中性能非常突出。
Zookeeper使用的數(shù)據(jù)結(jié)構(gòu)為樹(shù)形結(jié)構(gòu),根節(jié)點(diǎn)為"/"。Zookeeper集群中的節(jié)點(diǎn),根據(jù)其身份特性分為leader、follower、observer。leader負(fù)責(zé)客戶端writer類型的請(qǐng)求;follower負(fù)責(zé)客戶端reader類型的請(qǐng)求,并參與leader選舉;observer是特殊的follower,可以接收客戶端reader請(qǐng)求,但是不會(huì)參與選舉,可以用來(lái)擴(kuò)容系統(tǒng)支撐能力,提高讀取速度。
5、Zookeeper使用的是ZAB原子消息廣播協(xié)議,節(jié)點(diǎn)之間的一致性算法為Paxos,能夠保障分布式環(huán)境中數(shù)據(jù)的一致性。分布式場(chǎng)景下高可用是Zookeeper的特性,可以采用第三方客戶端的實(shí)現(xiàn),即Curator框架。
6、Zookeeper集群管理
集群管理:是否有機(jī)器退出和加入、選舉master。
對(duì)于第一點(diǎn),所有機(jī)器約定在父目錄GroupMembers下創(chuàng)建臨時(shí)目錄節(jié)點(diǎn),然后監(jiān)聽(tīng)父目錄節(jié)點(diǎn)的子節(jié)點(diǎn)變化消息。一旦有機(jī)器掛掉,該機(jī)器與 zookeeper的連接斷開(kāi),其所創(chuàng)建的臨時(shí)目錄節(jié)點(diǎn)被刪除,所有其他機(jī)器都收到通知:某個(gè)兄弟目錄被刪除。
新機(jī)器加入也是類似,所有機(jī)器收到通知:新兄弟目錄加入,highcount又有了,對(duì)于第二點(diǎn),我們稍微改變一下,所有機(jī)器創(chuàng)建臨時(shí)順序編號(hào)目錄節(jié)點(diǎn),每次選取編號(hào)最小的機(jī)器作為master就好。
7、Zookeeper工作原理
Zookeeper 的核心是原子廣播,這個(gè)機(jī)制保證了各個(gè)Server之間的同步。實(shí)現(xiàn)這個(gè)機(jī)制的協(xié)議叫做Zab協(xié)議。Zab協(xié)議有兩種模式,它們分別是恢復(fù)模式(選主)和廣播模式(同步)。當(dāng)服務(wù)啟動(dòng)或者在領(lǐng)導(dǎo)者崩潰后,Zab就進(jìn)入了恢復(fù)模式,當(dāng)領(lǐng)導(dǎo)者被選舉出來(lái),且大多數(shù)Server完成了和 leader的狀態(tài)同步以后,恢復(fù)模式就結(jié)束了。狀態(tài)同步保證了leader和Server具有相同的系統(tǒng)狀態(tài)。
Zookeeper 從設(shè)計(jì)模式角度來(lái)看,是一個(gè)基于觀察者模式設(shè)計(jì)的分布式服務(wù)管理框架,它負(fù)責(zé)存儲(chǔ)和管理大家都關(guān)心的數(shù)據(jù),然后接受觀察者的注冊(cè),一旦這些數(shù)據(jù)的狀態(tài)發(fā)生變化,Zookeeper 就將負(fù)責(zé)通知已經(jīng)在 Zookeeper 上注冊(cè)的那些觀察者做出相應(yīng)的反應(yīng),從而實(shí)現(xiàn)集群中類似 Master/Slave 管理模式,
Zookeeper
數(shù)據(jù)模型
樹(shù)結(jié)構(gòu),根節(jié)點(diǎn)為/,每一層用/劃分,且訪問(wèn)時(shí)只能用絕對(duì)路徑訪問(wèn)。這是由于zookeeper的場(chǎng)景大多是定位數(shù)據(jù)模型上的節(jié)點(diǎn),即查找節(jié)點(diǎn),因此底層使用hash結(jié)構(gòu),使用節(jié)點(diǎn)完整路徑作為key,提高查找性能。
永久節(jié)點(diǎn):創(chuàng)建后永久存在,顯示調(diào)用delete刪除。
臨時(shí)節(jié)點(diǎn):創(chuàng)建臨時(shí)節(jié)點(diǎn)的客戶端關(guān)閉連接后(超時(shí)或者異常導(dǎo)致的也算)自動(dòng)刪除。
有序節(jié)點(diǎn):創(chuàng)建永久或臨時(shí)節(jié)點(diǎn)時(shí),zookeeper自動(dòng)在節(jié)點(diǎn)名稱后面追加單調(diào)遞增的序號(hào),來(lái)表示節(jié)點(diǎn)創(chuàng)建順序。
節(jié)點(diǎn)維護(hù)的數(shù)據(jù)包括:
節(jié)點(diǎn)數(shù)據(jù),使用二進(jìn)制數(shù)組byte[]存儲(chǔ)
ACL訪問(wèn)控制信息
子節(jié)點(diǎn)數(shù)據(jù),臨時(shí)絕點(diǎn)不允許有子節(jié)點(diǎn),所以其子節(jié)點(diǎn)字段為null
記錄自身狀態(tài)信息的字段stat,具體信息見(jiàn)下圖
悲觀鎖
約定/lock為鎖節(jié)點(diǎn),成功創(chuàng)建/lock節(jié)點(diǎn)的客戶端獲取鎖。
樂(lè)觀鎖
使用CAS,由節(jié)點(diǎn)中存儲(chǔ)的version信息來(lái)實(shí)現(xiàn)。
Watch機(jī)制
一種訂閱監(jiān)聽(tīng)機(jī)制,其使用可以通過(guò)向客戶端構(gòu)造方法、getData、exists 和 getChildren方法參數(shù)傳遞Watcher時(shí)間參數(shù)來(lái)實(shí)現(xiàn)。
new ZooKeeper(String connectString, int sessionTimeout, Watcher watcher);getData(String path, Watcher watcher, Stat stat);
在客戶端連接服務(wù)端的時(shí)候,可以對(duì)數(shù)據(jù)節(jié)點(diǎn)的創(chuàng)建、刪除、數(shù)據(jù)變更、子節(jié)點(diǎn)的更新等操作進(jìn)行監(jiān)控。
客戶端標(biāo)記消息為watch消息,發(fā)送到服務(wù)端,服務(wù)端收到后將watch記錄到watchManager中,并返回響應(yīng),客戶端拿到響應(yīng)后將watch記錄在自己的zkwatchManager中。
服務(wù)端出發(fā)watch時(shí)會(huì)根據(jù)watchmanage中記錄的來(lái)回調(diào)客戶端,客戶端根據(jù)zkWatchManager來(lái)回調(diào)響應(yīng)函數(shù)。
注意watch是一次性的,回調(diào)完就會(huì)刪除。要多次就要重復(fù)注冊(cè)。
watch可以用來(lái)實(shí)現(xiàn)發(fā)布訂閱如配置中心等功能。
上一篇:無(wú)
下一篇:RPC中間件解決方案