Zookeeper Learning
引子?
云計(jì)算越來(lái)越流行的今天,單一機(jī)器處理能力已經(jīng)不能滿(mǎn)足我們的需求,不得不采用大量的服務(wù)集群。服務(wù)集群對(duì)外提供服務(wù)的過(guò)程中,有很多的配置需要隨時(shí)更新,服務(wù)間需要協(xié)調(diào)工作,這些信息如何推送到各個(gè)節(jié)點(diǎn)?并且保證信息的一致性和可靠性?
眾所周知,分布式協(xié)調(diào)服務(wù)很難正確無(wú)誤的實(shí)現(xiàn),它們很容易在競(jìng)爭(zhēng)條件和死鎖上犯錯(cuò)誤。如何在這方面節(jié)省力氣?Zookeeper是一個(gè)不錯(cuò)的選擇。 Zookeeper背后的動(dòng)機(jī)就是解除分布式應(yīng)用在實(shí)現(xiàn)協(xié)調(diào)服務(wù)上的痛苦。本文在介紹Zookeeper的基本理論基礎(chǔ)上,用Zookeeper實(shí)現(xiàn)了一 個(gè)配置管理中心,利用Zookeeper將配置信息分發(fā)到各個(gè)服務(wù)節(jié)點(diǎn)上,并保證信息的正確性和一致性。
Zookeeper是什么?
引用官方的說(shuō)法:“Zookeeper是一個(gè)高性能,分布式的,開(kāi)源分布式應(yīng)用協(xié)調(diào)服務(wù)。它提供了簡(jiǎn)單原始的功能,分布式應(yīng)用可以基于它實(shí)現(xiàn)更高級(jí) 的服務(wù),比如同步,配置管理,集群管理,名空間。它被設(shè)計(jì)為易于編程,使用文件系統(tǒng)目錄樹(shù)作為數(shù)據(jù)模型。服務(wù)端跑在java上,提供java和C的客戶(hù)端 API”。
Zookeeper總體結(jié)構(gòu)
Zookeeper服務(wù)自身組成一個(gè)集群(2n+1個(gè)服務(wù)允許n個(gè)失效)。Zookeeper服務(wù)有兩個(gè)角色,一個(gè)是leader,負(fù)責(zé)寫(xiě)服務(wù)和數(shù)據(jù)同步,剩下的是follower,提供讀服務(wù),leader失效后會(huì)在follower中重新選舉新的leader。
Zookeeper邏輯圖如下,
客戶(hù)端可以連接到每個(gè)server,每個(gè)server的數(shù)據(jù)完全相同。
每個(gè)follower都和leader有連接,接受leader的數(shù)據(jù)更新操作。
Server記錄事務(wù)日志和快照到持久存儲(chǔ)。
大多數(shù)server可用,整體服務(wù)就可用。
Zookeeper數(shù)據(jù)模型
Zookeeper表現(xiàn)為一個(gè)分層的文件系統(tǒng)目錄樹(shù)結(jié)構(gòu)(不同于文件系統(tǒng)的是,節(jié)點(diǎn)可以有自己的數(shù)據(jù),而文件系統(tǒng)中的目錄節(jié)點(diǎn)只有子節(jié)點(diǎn))。
數(shù)據(jù)模型結(jié)構(gòu)圖如下,
圓形節(jié)點(diǎn)可以含有子節(jié)點(diǎn),多邊形節(jié)點(diǎn)不能含有子節(jié)點(diǎn)。一個(gè)節(jié)點(diǎn)對(duì)應(yīng)一個(gè)應(yīng)用,節(jié)點(diǎn)存儲(chǔ)的數(shù)據(jù)就是應(yīng)用需要的配置信息。
Zookeeper 特點(diǎn)
順序一致性:按照客戶(hù)端發(fā)送請(qǐng)求的順序更新數(shù)據(jù)。
原子性:更新要么成功,要么失敗,不會(huì)出現(xiàn)部分更新。
單一性 :無(wú)論客戶(hù)端連接哪個(gè)server,都會(huì)看到同一個(gè)視圖。
可靠性:一旦數(shù)據(jù)更新成功,將一直保持,直到新的更新。
及時(shí)性:客戶(hù)端會(huì)在一個(gè)確定的時(shí)間內(nèi)得到最新的數(shù)據(jù)。
Zookeeper運(yùn)用場(chǎng)景
數(shù)據(jù)發(fā)布與訂閱 (我的業(yè)務(wù)用到這個(gè)特性,后面會(huì)有詳細(xì)介紹)
應(yīng)用配置集中到節(jié)點(diǎn)上,應(yīng)用啟動(dòng)時(shí)主動(dòng)獲取,并在節(jié)點(diǎn)上注冊(cè)一個(gè)watcher,每次配置更新都會(huì)通知到應(yīng)用。
名空間服務(wù)
分布式命名服務(wù),創(chuàng)建一個(gè)節(jié)點(diǎn)后,節(jié)點(diǎn)的路徑就是全局唯一的,可以作為全局名稱(chēng)使用。
分布式通知/協(xié)調(diào)
不同的系統(tǒng)都監(jiān)聽(tīng)同一個(gè)節(jié)點(diǎn),一旦有了更新,另一個(gè)系統(tǒng)能夠收到通知。
分布式鎖
Zookeeper能保證數(shù)據(jù)的強(qiáng)一致性,用戶(hù)任何時(shí)候都可以相信集群中每個(gè)節(jié)點(diǎn)的數(shù)據(jù)都是相同的。一個(gè)用戶(hù)創(chuàng)建一個(gè)節(jié)點(diǎn)作為鎖,另一個(gè)用戶(hù)檢測(cè)該節(jié)點(diǎn),如果存在,代表別的用戶(hù)已經(jīng)鎖住,如果不存在,則可以創(chuàng)建一個(gè)節(jié)點(diǎn),代表?yè)碛幸粋€(gè)鎖。
集群管理
每個(gè)加入集群的機(jī)器都創(chuàng)建一個(gè)節(jié)點(diǎn),寫(xiě)入自己的狀態(tài)。監(jiān)控父節(jié)點(diǎn)的用戶(hù)會(huì)受到通知,進(jìn)行相應(yīng)的處理。離開(kāi)時(shí)刪除節(jié)點(diǎn),監(jiān)控父節(jié)點(diǎn)的用戶(hù)同樣會(huì)收到通知。
轉(zhuǎn)載于:https://blog.51cto.com/milesaway/1719316
總結(jié)
以上是生活随笔為你收集整理的Zookeeper Learning的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 三星1TB硬盘MM804RS不识别加电磁
- 下一篇: 华为三月份的新品可真多!P60系列和Ma