ZooKeeper官方文檔
博客地址:http://blog.csdn.net/java_yes/article/details/78668460
ZooKeeper:分布式應(yīng)用程序的分布式協(xié)調(diào)服務(wù)
ZooKeeper是面向分布式應(yīng)用程序的分布式開源協(xié)調(diào)服務(wù)慎恒。它公開了一組簡單的原語死嗦,分布式應(yīng)用程序可以利用這些原語來實(shí)現(xiàn)更高級(jí)別的服務(wù),以實(shí)現(xiàn)同步廊敌,配置維護(hù)以及組合命名骡澈。它被設(shè)計(jì)為易于編程肋殴,并且使用在文件系統(tǒng)熟悉的目錄樹結(jié)構(gòu)之后的樣式的數(shù)據(jù)模型护锤。它運(yùn)行在Java中,并具有Java和C的綁定酿傍。
協(xié)調(diào)服務(wù)是非常難以正確的。他們特別容易出現(xiàn)諸如(由于兩個(gè)或者多個(gè)進(jìn)程競爭使用不能被同時(shí)訪問的資源氯析,使得這些進(jìn)程有可能因?yàn)闀r(shí)間上推進(jìn)的先后原因而出現(xiàn)問題亏较,這叫做競爭條件)Race Condition和(死鎖)deadlock等錯(cuò)誤掩缓。ZooKeeper背后的動(dòng)機(jī)是為分散的應(yīng)用程序減輕從零開始實(shí)施協(xié)調(diào)服務(wù)的責(zé)任巡通。
設(shè)計(jì)目標(biāo)
ZooKeeper是簡單的。ZooKeeper允許分布式進(jìn)程通過與標(biāo)準(zhǔn)文件系統(tǒng)類似組織的共享分層名稱空間相互協(xié)調(diào)签孔。名稱空間由數(shù)據(jù)寄存器(稱為znode)組成罐盔,以ZooKeeper的說法 - 它們類似于文件和目錄纬黎。與典型的用于存儲(chǔ)的文件系統(tǒng)不同,ZooKeeper數(shù)據(jù)保存在內(nèi)存中,這意味著ZooKeeper可以實(shí)現(xiàn)高吞吐量和低延遲數(shù)量肄渗。
ZooKeeper實(shí)現(xiàn)對(duì)高性能,高可用性,嚴(yán)格有序的訪問非常重要。ZooKeeper的性能方面意味著它可以用于大型分布式系統(tǒng)。可靠性方面使它不能成為單一故障點(diǎn)。嚴(yán)格的排序意味著可以在客戶端實(shí)現(xiàn)復(fù)雜的同步原語。
ZooKeeper是可復(fù)制的。就像它所協(xié)調(diào)的分布式進(jìn)程一樣,ZooKeeper本身也被復(fù)制到一組稱為集合的主機(jī)上。
構(gòu)成ZooKeeper服務(wù)的服務(wù)器必須全部相互了解。他們維護(hù)一個(gè)內(nèi)存狀態(tài)的圖像,以及一個(gè)持久存儲(chǔ)中的事務(wù)日志和快照集嵌。只要大部分服務(wù)器都可用,ZooKeeper服務(wù)將可用。
客戶端連接到一臺(tái)ZooKeeper服務(wù)器。客戶端維護(hù)一個(gè)TCP連接箩祥,通過它發(fā)送請(qǐng)求谢揪,獲取響應(yīng)患民,獲取監(jiān)視事件并發(fā)送心跳。如果到服務(wù)器的TCP連接中斷仅孩,客戶端將連接到不同的服務(wù)器托猩。
ZooKeeper是有序的。ZooKeeper使用反映所有ZooKeeper事務(wù)順序的數(shù)字來標(biāo)記每個(gè)更新辽慕。后續(xù)操作可以使用該命令來實(shí)現(xiàn)更高級(jí)別的抽象京腥,例如同步原語。
ZooKeeper是很快的溅蛉。在“讀取主導(dǎo)”的工作負(fù)載中公浪,這個(gè)速度特別快。ZooKeeper應(yīng)用程序在數(shù)千臺(tái)機(jī)器上運(yùn)行温艇,并且在讀取比寫入更為普遍的情況下因悲,性能表現(xiàn)最佳,比例約為10:1勺爱。
數(shù)據(jù)模型和分層名稱空間
ZooKeeper提供的名稱空間與標(biāo)準(zhǔn)文件系統(tǒng)非常相似晃琳。名稱是由斜杠(/)分隔的一系列路徑元素。ZooKeeper名稱空間中的每個(gè)節(jié)點(diǎn)都由一個(gè)路徑標(biāo)識(shí)琐鲁。
節(jié)點(diǎn)和短暫節(jié)點(diǎn)
與標(biāo)準(zhǔn)文件系統(tǒng)不同卫旱,ZooKeeper名稱空間中的每個(gè)節(jié)點(diǎn)都可以有與其相關(guān)的數(shù)據(jù)以及子節(jié)點(diǎn)。這就像有一個(gè)文件系統(tǒng)围段,允許一個(gè)文件也是一個(gè)目錄顾翼。(ZooKeeper被設(shè)計(jì)用于存儲(chǔ)協(xié)調(diào)數(shù)據(jù):狀態(tài)信息,配置奈泪,位置信息等适贸,因此存儲(chǔ)在每個(gè)節(jié)點(diǎn)的數(shù)據(jù)通常很小,在字節(jié)到千字節(jié)范圍內(nèi))涝桅。我們使用znode這個(gè)詞 來表示我們正在談?wù)揨ooKeeper數(shù)據(jù)節(jié)點(diǎn)拜姿。
Znodes維護(hù)一個(gè)統(tǒng)計(jì)結(jié)構(gòu),其中包括數(shù)據(jù)更改的版本號(hào)冯遂,ACL更改和時(shí)間戳蕊肥,以允許緩存驗(yàn)證和協(xié)調(diào)更新。每當(dāng)znode的數(shù)據(jù)發(fā)生變化時(shí)蛤肌,版本號(hào)就會(huì)增加壁却。例如,每當(dāng)客戶端檢索數(shù)據(jù)時(shí)裸准,它也會(huì)收到數(shù)據(jù)的版本展东。
存儲(chǔ)在名稱空間中每個(gè)節(jié)點(diǎn)上的數(shù)據(jù)是以原子方式讀取和寫入的。讀取獲得與znode關(guān)聯(lián)的所有數(shù)據(jù)字節(jié)炒俱,寫入將替換所有數(shù)據(jù)琅锻。每個(gè)節(jié)點(diǎn)都有一個(gè)訪問控制列表(ACL)卦停,限制誰可以做什么。
ZooKeeper也有短暫節(jié)點(diǎn)的概念恼蓬。只要?jiǎng)?chuàng)建znode的會(huì)話處于活動(dòng)狀態(tài)惊完,就會(huì)存在這些znode。當(dāng)會(huì)話結(jié)束時(shí)处硬,znode被刪除小槐。當(dāng)您想實(shí)現(xiàn)[tbd]時(shí),短暫節(jié)點(diǎn)很有用荷辕。
條件更新和監(jiān)視
ZooKeeper支持監(jiān)控概念凿跳。客戶可以在znode上設(shè)置一個(gè)監(jiān)控疮方。當(dāng)znode改變時(shí)控嗜,監(jiān)控將被觸發(fā)并移除。當(dāng)監(jiān)控被觸發(fā)時(shí)骡显,客戶端收到一個(gè)數(shù)據(jù)包說znode已經(jīng)改變疆栏。如果客戶端與其中一個(gè)Zoo Keeper服務(wù)器之間的連接中斷,客戶端將收到本地通知惫谤。這些可以用來[待定]壁顶。
保證
ZooKeeper非常快速溜歪,非常簡單若专。既然它的目標(biāo)是構(gòu)建比較復(fù)雜的服務(wù),比如同步蝴猪,就提供了一套保證调衰。這些是:
- 順序一致性 : 來自客戶端的更新將按照它們發(fā)送的順序進(jìn)行應(yīng)用。
- 原子性 : 更新成功或失敗自阱。沒有部分結(jié)果嚎莉。
- 單系統(tǒng)映像: 無論服務(wù)器連接到哪個(gè)服務(wù)器,客戶端都會(huì)看到相同的服務(wù)視圖动壤。
- 可靠性: 一旦更新被應(yīng)用萝喘,它將一直持續(xù)到客戶覆蓋更新淮逻。
- 及時(shí)性 : 系統(tǒng)的客戶觀點(diǎn)在一定的時(shí)間范圍內(nèi)保證是最新的琼懊。
簡單的API
ZooKeeper的一個(gè)設(shè)計(jì)目標(biāo)是提供一個(gè)非常簡單的編程接口。因此爬早,它只支持這些操作:
- 創(chuàng)建:
在樹中的一個(gè)位置創(chuàng)建一個(gè)節(jié)點(diǎn)- 刪除:
刪除一個(gè)節(jié)點(diǎn)- 判斷是否存在:
測試節(jié)點(diǎn)是否存在于某個(gè)位置- 獲取數(shù)據(jù):
從節(jié)點(diǎn)讀取數(shù)據(jù)- 設(shè)置數(shù)據(jù):
將數(shù)據(jù)寫入節(jié)點(diǎn)- 獲得子集:
檢索一個(gè)節(jié)點(diǎn)的子節(jié)點(diǎn)列表- 同步:
等待數(shù)據(jù)同步到每個(gè)節(jié)點(diǎn)上
實(shí)現(xiàn)
ZooKeeper組件顯示了ZooKeeper服務(wù)的高級(jí)組件哼丈。除請(qǐng)求處理器外,組成ZooKeeper服務(wù)的每個(gè)服務(wù)器都復(fù)制其每個(gè)組件的副本筛严。
復(fù)制的數(shù)據(jù)庫是包含整個(gè)數(shù)據(jù)樹的內(nèi)存數(shù)據(jù)庫醉旦。將更新記錄到磁盤以實(shí)現(xiàn)可恢復(fù)性,并在寫入磁盤之前將其寫入磁盤,然后再將其寫入內(nèi)存數(shù)據(jù)庫车胡。
每個(gè)ZooKeeper服務(wù)器都為客戶端服務(wù)檬输。客戶端連接到一個(gè)服務(wù)器提交irequests匈棘。讀取請(qǐng)求是從每個(gè)服務(wù)器數(shù)據(jù)庫的本地副本服務(wù)的丧慈。請(qǐng)求改變服務(wù)的狀態(tài),寫請(qǐng)求主卫,由協(xié)議協(xié)議處理逃默。
作為協(xié)議協(xié)議的一部分,來自客戶端的所有寫入請(qǐng)求都被轉(zhuǎn)發(fā)給一個(gè)稱為leader的服務(wù)器 簇搅。ZooKeeper服務(wù)器的其余部分(稱為 followers)接收leader的消息建議并同意消息傳遞完域。消息傳遞層負(fù)責(zé)替換失效的leader,并與leader同步followers瘩将。
ZooKeeper使用一個(gè)自定義的原子消息傳遞協(xié)議吟税。由于消息傳遞層是原子的,因此ZooKeeper可以保證本地副本不會(huì)發(fā)生分離鸟蟹。當(dāng)leader接收到一個(gè)寫請(qǐng)求時(shí)乌妙,它會(huì)計(jì)算什么時(shí)候系統(tǒng)的狀態(tài)是什么時(shí)候?qū)懀⑵滢D(zhuǎn)換成一個(gè)捕獲這個(gè)新狀態(tài)的事務(wù)建钥。
使用
ZooKeeper的編程接口是特意設(shè)計(jì)的簡單藤韵。但是,有了它熊经,您可以實(shí)現(xiàn)更高階的操作泽艘,例如同步原語,組成員資格镐依,所有權(quán)等匹涮。一些分布式應(yīng)用程序已經(jīng)使用它來:[tbd:從白皮書和視頻演示中添加使用。]
性能
ZooKeeper被設(shè)計(jì)為高性能的槐壳。但是呢然低?Yahoo! ZooKeeper開發(fā)團(tuán)隊(duì)的成果 研究表明它是。(請(qǐng)參閱ZooKeeper吞吐量作為讀寫速率的變化务唐。)在讀取數(shù)量大于寫入的應(yīng)用程序中雳攘,性能特別高,因?yàn)閷懭氩僮魃婕暗酵剿蟹?wù)器的狀態(tài)枫笛。(讀出次數(shù)寫入通常是協(xié)調(diào)服務(wù)的情況吨灭。)
圖中的ZooKeeper吞吐量讀寫比率發(fā)生變化是動(dòng)ZooKeeper的吞吐量圖3.2版與雙2GHz的至強(qiáng)和兩個(gè)SATA 15K RPM驅(qū)動(dòng)器的服務(wù)器上運(yùn)行。一個(gè)驅(qū)動(dòng)器被用作專用的ZooKeeper日志設(shè)備刑巧⌒郑快照被寫入到OS驅(qū)動(dòng)器无畔。寫請(qǐng)求是1K寫,讀取是1K讀吠冤』胝茫“服務(wù)器”表示ZooKeeper集成的大小,即構(gòu)成服務(wù)的服務(wù)器的數(shù)量拯辙。大約還有30臺(tái)服務(wù)器用于模擬客戶端闸昨。ZooKeeper集成配置使領(lǐng)導(dǎo)不允許來自客戶端的連接。
注意:與之前的3.1版本相比薄风,3.2版本的r / w性能提高了約2倍饵较。
基準(zhǔn)也表明它也是可靠的。顯示了部署如何響應(yīng)各種故障遭赂。圖中標(biāo)注的事件如下:
- follower的失效和恢復(fù)
- 失效和恢復(fù)不同的follower
- leader失效
- 兩名follower失效和恢復(fù)
- 另一位leader失效
可靠性
為了顯示隨著時(shí)間的推移系統(tǒng)的行為循诉,我們運(yùn)行了一個(gè)由7臺(tái)機(jī)器組成的ZooKeeper服務(wù)。我們和以前一樣運(yùn)行了相同的飽和度基準(zhǔn)撇他,但是這次我們把寫入百分比保持在30%茄猫,這是我們預(yù)期的工作量的一個(gè)保守的比例。
這個(gè)圖是幾個(gè)重要的觀察結(jié)果困肩。首先划纽,如果follower失效并迅速恢復(fù),那么ZooKeeper即使失效也能保持高吞吐量锌畸。但更重要的是勇劣,leader選舉算法允許系統(tǒng)恢復(fù)得足夠快嫁艇,以防止吞吐量大幅下降拥诡。在我們的觀察中,ZooKeeper花了不到200ms選出一個(gè)新的leader驼修。第三盆犁,隨著follower的恢復(fù)命咐,ZooKeeper能夠在開始處理請(qǐng)求后再次提高吞吐量。
ZooKeeper項(xiàng)目
ZooKeeper已被 成功應(yīng)用于 許多工業(yè)應(yīng)用谐岁。它用在Yahoo! 作為Yahoo!的協(xié)調(diào)和故障恢復(fù)服務(wù)醋奠。Message Broker,這是一個(gè)高度可擴(kuò)展的發(fā)布 - 訂閱系統(tǒng)伊佃,管理數(shù)千個(gè)復(fù)制和數(shù)據(jù)傳輸主題窜司。它被Yahoo!的抓取服務(wù)使用。爬蟲锭魔,它也管理故障恢復(fù)例证。一些雅虎路呜!廣告系統(tǒng)也使用ZooKeeper來實(shí)現(xiàn)可靠的服務(wù)迷捧。