Zookeeper有兩種運(yùn)行模式:
獨(dú)立模式(standalone mode):只運(yùn)行在一臺(tái)服務(wù)器上,適合測(cè)試環(huán)境
復(fù)制模式(replicated mode):運(yùn)行于一個(gè)集群上,適合生產(chǎn)環(huán)境,這個(gè)計(jì)算機(jī)集群被稱為一個(gè)“集合體”(ensemble)。Zookeeper通過復(fù)制來實(shí)現(xiàn)高可用性,只要集合體中半數(shù)以上的機(jī)器處于可用狀態(tài),它就能夠保證服務(wù)繼續(xù)。為什么一定要超過半數(shù)呢?這跟Zookeeper的復(fù)制策略有關(guān):zookeeper確保對(duì)znode樹的每一個(gè)修改都會(huì)被復(fù)制到集合體中超過半數(shù)的機(jī)器上。
生產(chǎn)環(huán)境,zookeeper集群的服務(wù)器數(shù)目應(yīng)該是奇數(shù)。
Zookeeper集群中的角色及其職責(zé)
領(lǐng)導(dǎo)者
1.管理寫請(qǐng)求
跟隨者
1.響應(yīng)客戶端的讀請(qǐng)求
2.負(fù)責(zé)把客戶端提交的寫請(qǐng)求轉(zhuǎn)發(fā)給領(lǐng)導(dǎo)者
znode的觀察機(jī)制
znode以某種方式發(fā)生變化時(shí),“觀察”(watch)機(jī)制可以讓客戶端得到通知。可以針對(duì)ZooKeeper服務(wù)的“操作”來設(shè)置觀察,該服務(wù)的其他操作可以觸發(fā)觀察。比如,客戶端可以對(duì)某個(gè)客戶端調(diào)用exists操作,同時(shí)在它上面設(shè)置一個(gè)觀察,如果此時(shí)這個(gè)znode不存在,則exists返回false,如果一段時(shí)間之后,這個(gè)znode被其他客戶端創(chuàng)建,則這個(gè)觀察會(huì)被觸發(fā),之前的那個(gè)客戶端就會(huì)得到通知。
sync: 將客戶端的znode視圖與ZooKeeper同步
SYNC消息:返回SYNC結(jié)果到客戶端,這個(gè)消息最初由客戶端發(fā)起,用來強(qiáng)制得到最新的更新。
跨客戶端視圖的并發(fā)一致性:
ZooKeeper并不保證在某時(shí)刻,兩個(gè)不同的客戶端具有一致的數(shù)據(jù)視圖。因?yàn)榫W(wǎng)絡(luò)延遲的原因,一個(gè)客戶端可能在另一個(gè)客戶端得到修改通知之前進(jìn)行更新。假定有兩個(gè)客戶端A和B。如果客戶端A將一個(gè)節(jié)點(diǎn)/a的值從0修改為1,然后通知客戶端B讀取/a,客戶端B讀取到的值可能還是0,這取決于它連接到了哪個(gè)服務(wù)器。如果客戶端A和B讀取到相同的值很重要,那么客戶端B應(yīng)該在執(zhí)行讀取之前調(diào)用sync()方法。
所以,ZooKeeper本身不保證修改在多個(gè)服務(wù)器間同步地發(fā)生,但是可以使用ZooKeeper原語來構(gòu)建高層功能,提供有用的客戶端同步。
設(shè)計(jì)目的
1.最終一致性:client不論連接到哪個(gè)Server,展示給它都是同一個(gè)視圖,這是zookeeper最重要的性能。
2 .可靠性:具有簡單、健壯、良好的性能,如果消息m被到一臺(tái)服務(wù)器接受,那么它將被所有的服務(wù)器接受。
3 .實(shí)時(shí)性:Zookeeper保證客戶端將在一個(gè)時(shí)間間隔范圍內(nèi)獲得服務(wù)器的更新信息,或者服務(wù)器失效的信息。但由于網(wǎng)絡(luò)延時(shí)等原因,Zookeeper不能保證兩個(gè)客戶端能同時(shí)得到剛更新的數(shù)據(jù),如果需要最新數(shù)據(jù),應(yīng)該在讀數(shù)據(jù)之前調(diào)用sync()接口。
4 .等待無關(guān)(wait-free):慢的或者失效的client不得干預(yù)快速的client的請(qǐng)求,使得每個(gè)client都能有效的等待。
5.原子性:更新只能成功或者失敗,沒有中間狀態(tài)。
6 .順序性:包括全局有序和偏序兩種:全局有序是指如果在一臺(tái)服務(wù)器上消息a在消息b前發(fā)布,則在所有Server上消息a都將在消息b前被發(fā)布;偏序是指如果一個(gè)消息b在消息a后被同一個(gè)發(fā)送者發(fā)布,a必將排在b前面。
節(jié)點(diǎn)宕機(jī):
應(yīng)用集群中,我們常常需要讓每一個(gè)機(jī)器知道集群中(或依賴的其他某一個(gè)集群)哪些機(jī)器是活著的,并且在集群機(jī)器因?yàn)殄礄C(jī),網(wǎng)絡(luò)斷鏈等原因能夠不在人工介入的情況下迅速通知到每一個(gè)機(jī)器。
Zookeeper同樣很容易實(shí)現(xiàn)這個(gè)功能,比如我在zookeeper服務(wù)器端有一個(gè)znode叫/APP1SERVERS,那么集群中每一個(gè)機(jī)器啟動(dòng)的時(shí)候都去這個(gè)節(jié)點(diǎn)下創(chuàng)建一個(gè)EPHEMERAL類型的節(jié)點(diǎn),比如server1創(chuàng)建/APP1SERVERS/SERVER1(可以使用ip,保證不重復(fù)),server2創(chuàng)建/APP1SERVERS/SERVER2,然后SERVER1和SERVER2都watch /APP1SERVERS這個(gè)父節(jié)點(diǎn),那么也就是這個(gè)父節(jié)點(diǎn)下數(shù)據(jù)或者子節(jié)點(diǎn)變化都會(huì)通知對(duì)該節(jié)點(diǎn)進(jìn)行watch的客戶端。因?yàn)镋PHEMERAL類型節(jié)點(diǎn)有一個(gè)很重要的特性,就是客戶端和服務(wù)器端連接斷掉或者session過期就會(huì)使節(jié)點(diǎn)消失,那么在某一個(gè)機(jī)器掛掉或者斷鏈的時(shí)候,其對(duì)應(yīng)的節(jié)點(diǎn)就會(huì)消失,然后集群中所有對(duì)/APP1SERVERS進(jìn)行watch的客戶端都會(huì)收到通知,然后取得最新列表即可。
zookeeper是一個(gè)高可用性,高性能的協(xié)調(diào)服務(wù)
解決哪些問題
在分布式應(yīng)用中,經(jīng)常會(huì)出現(xiàn)部分失敗的情況,即當(dāng)節(jié)點(diǎn)間傳遞消息的時(shí)候由于網(wǎng)絡(luò)或者接收者進(jìn)程死掉等原因,發(fā)送者無法知道接收者是否收到消息。
由于部分失敗是分布式系統(tǒng)固有的特征因此zookeeper并不能避免部分失敗,但是它可以幫你在部分失敗的時(shí)候進(jìn)行正確處理
為了解決這個(gè)問題zookeeper具有以下特征:
1:zookeeper提供豐富的構(gòu)件(building block)來實(shí)現(xiàn)很多協(xié)調(diào)數(shù)據(jù)結(jié)構(gòu)和協(xié)議
2:訪問原子性,客戶端要么讀到所有數(shù)據(jù),要么讀取失敗,不會(huì)出現(xiàn)只讀取部分的情況
3:zookeeper運(yùn)行在一組機(jī)器上,具有高可用性,幫助系統(tǒng)避免單點(diǎn)故障,同時(shí)刪掉故障服務(wù)器
4:順序一致性:任意客戶端的更新請(qǐng)求會(huì)被按照發(fā)送順序提交
5:單一系統(tǒng)映像:當(dāng)一臺(tái)服務(wù)器故障,導(dǎo)致它的客戶端需要連接其它服務(wù)器的時(shí)候,所有更新晚于故障服務(wù)器的服務(wù)器都不會(huì)接收請(qǐng)求,一直到更新趕上故障服務(wù)器
6:及時(shí)性:任何客戶端能看到的滯后都是有限的,不會(huì)超過幾十秒,且提供sync操作強(qiáng)制客戶端所連的服務(wù)器與領(lǐng)導(dǎo)者同步
7:會(huì)話:每個(gè)客戶端連接時(shí)會(huì)嘗試連接到配置列表中的一臺(tái)服務(wù)器,一旦失敗會(huì)自動(dòng)連接另一臺(tái)服務(wù)器依次類推,知道成功連接一臺(tái)服務(wù)器,從而創(chuàng)建一個(gè)會(huì)話,客戶端可以位每個(gè)會(huì)話設(shè)置超時(shí)時(shí)間,一旦會(huì)話過期,則所有短暫znode會(huì)丟失,因?yàn)閦ookeeper會(huì)自動(dòng)發(fā)送心跳包,所以很少發(fā)生
8:約會(huì)機(jī)制(rendezvous),在交互的過程中,被協(xié)調(diào)的各方不許要事先彼此了解,甚至不必同時(shí)存在
9:ACL:zookeeper提供了digest(通過用戶名密碼),host(通過主機(jī)名),ip(通過ip地址)3種身份驗(yàn)證模式,依賴與zookeeper的身份驗(yàn)證機(jī)制每個(gè)ACL都是一個(gè)身份對(duì)應(yīng)一組權(quán)限,如果我們要給demo.com的客戶端域一個(gè)讀權(quán)限在java語言中可以這樣創(chuàng)建:
new ACL(Perms.READ, new Id("host", "demo.com"));
Ids.OPEN_ACL_UNSAFE是將所有ADMIN之外的權(quán)限授予每個(gè)人
另zookeeper還可以集成第三方的身份驗(yàn)證系統(tǒng)
10:提供關(guān)于通用協(xié)調(diào)模式的開源共享資源庫
11:高性能的(官方數(shù)據(jù))對(duì)以寫為主的工作負(fù)載來說使用5臺(tái)不錯(cuò)的機(jī)器基準(zhǔn)吞吐量達(dá)到10000+