1纽哥、zookeeper由來盖呼。
????????Zookeeper是hadoop的一個子項目瓣颅,雖然源自hadoop,但是zookeeper脫離hadoop的范疇開發(fā)分布式框架的運用越來越多唬涧。
Zookeeper是針對大型分布式系統(tǒng)的高可靠的協(xié)調(diào)系統(tǒng)疫赎。分布式需要協(xié)調(diào)系統(tǒng)的原因:
開發(fā)分布式系統(tǒng)是件很困難的事情,其中的困難主要體現(xiàn)在分布式系統(tǒng)的“部分失敗”碎节∨醺悖“部分失敗”是指信息在網(wǎng)絡(luò)的兩個節(jié)點之間傳送時候,如果網(wǎng)絡(luò)出了故障,發(fā)送者無法知道接收者是否收到了這個信息胎撇,而且這種故障的原因很復(fù)雜介粘,接收者可能在出現(xiàn)網(wǎng)絡(luò)錯誤之前已經(jīng)收到了信息,也可能沒有收到晚树,又或接收者的進(jìn)程死掉了姻采。發(fā)送者能夠獲得真實情況的唯一辦法就是重新連接到接收者,詢問接收者錯誤的原因题涨,這就是分布式系統(tǒng)開發(fā)里的“部分失敗”問題偎谁。(分布式系統(tǒng)會在另一篇文章中講解,這里故作玄虛體現(xiàn)zookeeper重要性纲堵。)
Zookeeper就是解決分布式系統(tǒng)“部分失敗”的框架巡雨。Zookeeper不是讓分布式系統(tǒng)避免“部分失敗”問題,而是讓分布式系統(tǒng)當(dāng)碰到部分失敗時候席函,可以正確的處理此類的問題铐望,讓分布式系統(tǒng)能正常的運行。
2茂附、zookeeper的實際運用場景:
配置管理
在我們的應(yīng)用中除了代碼外正蛙,還有一些就是各種配置。比如數(shù)據(jù)庫連接等营曼。一般我們都是使用配置文件的方式乒验,在代碼中引入這些配置文件。但是當(dāng)我們只有一種配置蒂阱,只有一臺服務(wù)器锻全,并且不經(jīng)常修改的時候,使用配置文件是一個很好的做法录煤,但是如果我們配置非常多鳄厌,有很多服務(wù)器都需要這個配置,而且還可能是動態(tài)的話使用配置文件就不是個好主意了妈踊。這個時候往往需要尋找一種集中管理配置的方法了嚎,我們在這個集中的地方修改了配置,所有對這個配置感興趣的都可以獲得變更廊营。比如我們可以把配置放在數(shù)據(jù)庫里歪泳,然后所有需要配置的服務(wù)都去這個數(shù)據(jù)庫讀取配置。但是赘风,因為很多服務(wù)的正常運行都非常依賴這個配置夹囚,所以需要這個集中提供配置服務(wù)的服務(wù)具備很高的可靠性。一般我們可以用一個集群來提供這個配置服務(wù)邀窃,但是用集群提升可靠性荸哟,那如何保證配置在集群中的一致性呢假哎? 這個時候就需要使用一種實現(xiàn)了一致性協(xié)議的服務(wù)了。Zookeeper就是這種服務(wù)鞍历,它使用Zab這種一致性協(xié)議來提供一致性《婺ǎ現(xiàn)在有很多開源項目使用Zookeeper來維護(hù)配置,比如在HBase中劣砍,客戶端就是連接一個Zookeeper惧蛹,獲得必要的HBase集群的配置信息,然后才可以進(jìn)一步操作刑枝。還有在開源的消息隊列Kafka中香嗓,也使用Zookeeper來維護(hù)broker的信息。在Alibaba開源的SOA框架Dubbo中也廣泛的使用Zookeeper管理一些配置來實現(xiàn)服務(wù)治理装畅。
名字服務(wù)
名字服務(wù)這個就很好理解了靠娱。比如為了通過網(wǎng)絡(luò)訪問一個系統(tǒng),我們得知道對方的IP地址掠兄,但是IP地址對人非常不友好像云,這個時候我們就需要使用域名來訪問。但是計算機(jī)是不能是別域名的蚂夕。怎么辦呢迅诬?如果我們每臺機(jī)器里都備有一份域名到IP地址的映射,這個倒是能解決一部分問題婿牍,但是如果域名對應(yīng)的IP發(fā)生變化了又該怎么辦呢侈贷?于是我們有了DNS這個東西。我們只需要訪問一個大家熟知的(known)的點等脂,它就會告訴你這個域名對應(yīng)的IP是什么铐维。在我們的應(yīng)用中也會存在很多這類問題,特別是在我們的服務(wù)特別多的時候慎菲,如果我們在本地保存服務(wù)的地址的時候?qū)⒎浅2环奖悖侨绻覀冎恍枰L問一個大家都熟知的訪問點锨并,這里提供統(tǒng)一的入口露该,那么維護(hù)起來將方便得多了。
分布式鎖
其實在第一篇文章中已經(jīng)介紹了Zookeeper是一個分布式協(xié)調(diào)服務(wù)第煮。這樣我們就可以利用Zookeeper來協(xié)調(diào)多個分布式進(jìn)程之間的活動解幼。比如在一個分布式環(huán)境中,為了提高可靠性包警,我們的集群的每臺服務(wù)器上都部署著同樣的服務(wù)撵摆。但是,一件事情如果集群中的每個服務(wù)器都進(jìn)行的話害晦,那相互之間就要協(xié)調(diào)特铝,編程起來將非常復(fù)雜暑中。而如果我們只讓一個服務(wù)進(jìn)行操作,那又存在單點鲫剿。通常還有一種做法就是使用分布式鎖鳄逾,在某個時刻只讓一個服務(wù)去干活,當(dāng)這臺服務(wù)出問題的時候鎖釋放灵莲,立即fail over到另外的服務(wù)雕凹。這在很多分布式系統(tǒng)中都是這么做,這種設(shè)計有一個更好聽的名字叫Leader Election(leader選舉)政冻。比如HBase的Master就是采用這種機(jī)制枚抵。但要注意的是分布式鎖跟同一個進(jìn)程的鎖還是有區(qū)別的,所以使用的時候要比同一個進(jìn)程里的鎖更謹(jǐn)慎的使用明场。
集群管理
在分布式的集群中汽摹,經(jīng)常會由于各種原因,比如硬件故障榕堰,軟件故障竖慧,網(wǎng)絡(luò)問題,有些節(jié)點會進(jìn)進(jìn)出出逆屡。有新的節(jié)點加入進(jìn)來圾旨,也有老的節(jié)點退出集群。這個時候魏蔗,集群中其他機(jī)器需要感知到這種變化砍的,然后根據(jù)這種變化做出對應(yīng)的決策。比如我們是一個分布式存儲系統(tǒng)莺治,有一個中央控制節(jié)點負(fù)責(zé)存儲的分配廓鞠,當(dāng)有新的存儲進(jìn)來的時候我們要根據(jù)現(xiàn)在集群目前的狀態(tài)來分配存儲節(jié)點。這個時候我們就需要動態(tài)感知到集群目前的狀態(tài)谣旁。還有涩嚣,比如一個分布式的SOA架構(gòu)中,服務(wù)是一個集群提供的峦耘,當(dāng)消費者訪問某個服務(wù)時贩虾,就需要采用某種機(jī)制發(fā)現(xiàn)現(xiàn)在有哪些節(jié)點可以提供該服務(wù)(這也稱之為服務(wù)發(fā)現(xiàn),比如Alibaba開源的SOA框架Dubbo就采用了Zookeeper作為服務(wù)發(fā)現(xiàn)的底層機(jī)制)搁进。還有開源的Kafka隊列就采用了Zookeeper作為Cosnumer的上下線管理浪感。
3、zookeeper的特點:
zookeeper是一個精簡的文件系統(tǒng)饼问。這點它和hadoop有點像影兽,但是zookeeper這個文件系統(tǒng)是管理小文件的,而hadoop是管理超大文件的莱革。
zookeeper提供了豐富的“構(gòu)件”峻堰,這些構(gòu)件可以實現(xiàn)很多協(xié)調(diào)數(shù)據(jù)結(jié)構(gòu)和協(xié)議的操作讹开。例如:分布式隊列、分布式鎖以及一組同級節(jié)點的“領(lǐng)導(dǎo)者選舉”算法茧妒。
zookeeper是高可用的萧吠,它本身的穩(wěn)定性是相當(dāng)之好,分布式集群完全可以依賴zookeeper集群的管理桐筏,利用zookeeper避免分布式系統(tǒng)的單點故障的問題纸型。
zookeeper采用了松耦合的交互模式。這點在zookeeper提供分布式鎖上表現(xiàn)最為明顯梅忌,zookeeper可以被用作一個約會機(jī)制狰腌,讓參入的進(jìn)程不在了解其他進(jìn)程的(或網(wǎng)絡(luò))的情況下能夠彼此發(fā)現(xiàn)并進(jìn)行交互牧氮,參入的各方甚至不必同時存在,只要在zookeeper留下一條消息踱葛,在該進(jìn)程結(jié)束后,另外一個進(jìn)程還可以讀取這條信息尸诽,從而解耦了各個節(jié)點之間的關(guān)系。
zookeeper為集群提供了一個共享存儲庫性含,集群可以從這里集中讀寫共享的信息,避免了每個節(jié)點的共享操作編程商蕴,減輕了分布式系統(tǒng)的開發(fā)難度。
zookeeper的設(shè)計采用的是觀察者的設(shè)計模式绪商,zookeeper主要是負(fù)責(zé)存儲和管理大家關(guān)心的數(shù)據(jù)苛谷,然后接受觀察者的注冊,一旦這些數(shù)據(jù)的狀態(tài)發(fā)生變化格郁,Zookeeper 就將負(fù)責(zé)通知已經(jīng)在 Zookeeper 上注冊的那些觀察者做出相應(yīng)的反應(yīng)抄腔,從而實現(xiàn)集群中類似 Master/Slave 管理模式。
zookeeper很利于分布式系統(tǒng)開發(fā)理张,它能讓分布式系統(tǒng)更加健壯和高效。
4绵患、ZooKeeper提供一個相當(dāng)于hadoop的文件系統(tǒng)雾叭,但是有別hadoop。文件可修改且只能存很少落蝙。還有提供通知機(jī)制织狐。
5暂幼、Zookeeper文件系統(tǒng)
每個子目錄項如 NameService 都被稱作為znode,和文件系統(tǒng)一樣移迫,我們能夠自由的增加旺嬉、刪除znode,在一個znode下增加厨埋、刪除子znode邪媳,唯一的不同在于znode是可以存儲數(shù)據(jù)的。?
6荡陷、有四種類型的znode:?
<1>PERSISTENT-持久化目錄節(jié)點?
客戶端與zookeeper斷開連接后雨效,該節(jié)點依舊存在?
<2>PERSISTENT_SEQUENTIAL-持久化順序編號目錄節(jié)點?
客戶端與zookeeper斷開連接后,該節(jié)點依舊存在废赞,只是Zookeeper給該節(jié)點名稱進(jìn)行順序編號?
<3>EPHEMERAL-臨時目錄節(jié)點?
客戶端與zookeeper斷開連接后徽龟,該節(jié)點被刪除?
<4>EPHEMERAL_SEQUENTIAL-臨時順序編號目錄節(jié)點?
客戶端與zookeeper斷開連接后,該節(jié)點被刪除唉地,只是Zookeeper給該節(jié)點名稱進(jìn)行順序編號?
7.Zookeeper通知機(jī)制
客戶端注冊監(jiān)聽它關(guān)心的目錄節(jié)點据悔,當(dāng)目錄節(jié)點發(fā)生變化(數(shù)據(jù)改變、被刪除耘沼、子目錄節(jié)點增加刪除)時极颓,zookeeper會通知客戶端。
8.Zookeeper命名服務(wù)
在zookeeper的文件系統(tǒng)里創(chuàng)建一個目錄耕拷,即有唯一的path讼昆。在我們使用tborg無法確定上游程序的部署機(jī)器時即可與下游程序約定好path,通過path即能互相探索發(fā)現(xiàn)骚烧。
9.Zookeeper的配置管理(可以了解一下中心化配置)
程序總是需要配置的浸赫,如果程序分散部署在多臺機(jī)器上,要逐個改變配置就變得困難≡甙恚現(xiàn)在把這些配置全部放到zookeeper上去既峡,保存在 Zookeeper 的某個目錄節(jié)點中,然后所有相關(guān)應(yīng)用程序?qū)@個目錄節(jié)點進(jìn)行監(jiān)聽运敢,一旦配置信息發(fā)生變化传惠,每個應(yīng)用程序就會收到 Zookeeper 的通知稻扬,然后從 Zookeeper 獲取新的配置信息應(yīng)用到系統(tǒng)中就好
10.Zookeeper集群管理(集中式管理泰佳,可以了解一下分布式管理和混合是管理)
所謂集群管理無在乎兩點:是否有機(jī)器退出和加入尘吗、選舉master睬捶。?
對于第一點擒贸,所有機(jī)器約定在父目錄GroupMembers下創(chuàng)建臨時目錄節(jié)點跌宛,然后監(jiān)聽父目錄節(jié)點的子節(jié)點變化消息。一旦有機(jī)器掛掉蜕猫,該機(jī)器與 zookeeper的連接斷開回右,其所創(chuàng)建的臨時目錄節(jié)點被刪除漱挚,所有其他機(jī)器都收到通知:某個兄弟目錄被刪除,于是蹬屹,所有人都知道:它上船了慨默。
新機(jī)器加入也是類似厦取,所有機(jī)器收到通知:新兄弟目錄加入,highcount又有了虾攻,對于第二點霎箍,我們稍微改變一下漂坏,所有機(jī)器創(chuàng)建臨時順序編號目錄節(jié)點,每次選取編號最小的機(jī)器作為master就好。
11.Zookeeper分布式鎖(自己編程盡量別用分布式鎖筋夏,低效条篷。了解一下akka對你會有幫助)
有了zookeeper的一致性文件系統(tǒng)蛤织,鎖的問題變得容易。鎖服務(wù)可以分為兩類乞巧,一個是保持獨占绽媒,另一個是控制時序免猾。?
對于第一類猎提,我們將zookeeper上的一個znode看作是一把鎖锨苏,通過createznode的方式來實現(xiàn)。所有客戶端都去創(chuàng)建 /distribute_lock 節(jié)點松逊,最終成功創(chuàng)建的那個客戶端也即擁有了這把鎖肯夏。用完刪除掉自己創(chuàng)建的distribute_lock 節(jié)點就釋放出鎖驯击。?
對于第二類徊都, /distribute_lock 已經(jīng)預(yù)先存在,所有客戶端在它下面創(chuàng)建臨時順序編號目錄節(jié)點主之,和選master一樣槽奕,編號最小的獲得鎖,用完刪除粤攒,依次方便夯接。
參考:
https://www.cnblogs.com/felixzh/p/5869212.html
https://blog.csdn.net/clz1314521/article/details/51176208
https://www.cnblogs.com/jianwei-dai/p/7797861.html