1.分布式應(yīng)用程序
分布式應(yīng)用程序并發(fā)的在網(wǎng)絡(luò)中上運(yùn)行,通過協(xié)調(diào)不同節(jié)點(diǎn)上進(jìn)程以快速有效的方式完成特定任務(wù)。
分布式應(yīng)用程序特點(diǎn):高可用,可擴(kuò)展,透明。
分布式程序缺點(diǎn):競爭條件,死鎖,數(shù)據(jù)的不一致。
2.分布式協(xié)同技術(shù)
分布式協(xié)同技術(shù)主要用來解決分布式環(huán)境(如圖所示)中的多個進(jìn)程之間的同步問題,讓它們有序的去訪問某種臨界資源,防止造成”臟數(shù)據(jù)”的后果。

如圖所示:在這個分布式系統(tǒng)中,第一臺機(jī)器上掛載了一個資源,這三個進(jìn)程都要競爭該資源。但又不希望它們同時進(jìn)行訪問,這時候就需要一個協(xié)調(diào)器——分布式鎖——來實(shí)現(xiàn)有序訪問的功能。比如”進(jìn)程-1″需要使用該資源的時候,會先去申請鎖;”進(jìn)程1″獲得鎖以后會對該資源保持獨(dú)占,這樣其他進(jìn)程就無法訪問該資源;”進(jìn)程1″使用完該資源以后就將鎖釋放掉,讓其他進(jìn)程來獲得鎖。通過這種鎖機(jī)制,保證了分布式系統(tǒng)中多個進(jìn)程能夠有序的訪問該臨界資源。
這種分布式鎖機(jī)制就是分布式協(xié)同技術(shù)的核心內(nèi)容。
3.ZooKeeper
ZooKeeper就是這樣一種基于分布式鎖機(jī)制的分布式協(xié)同技術(shù)。Zookeeper是Apache Hadoop的一個子項(xiàng)目,它主要是用來解決分布式應(yīng)用中經(jīng)常遇到的數(shù)據(jù)一致性問題,如:統(tǒng)一命名服務(wù)、狀態(tài)同步服務(wù)、集群管理、分布式應(yīng)用配置項(xiàng)的管理等。Zookeeper 作為一個分布式的服務(wù)框架,能夠提供基于類似于文件系統(tǒng)的目錄節(jié)點(diǎn)樹方式的數(shù)據(jù)存儲、數(shù)據(jù)監(jiān)控、數(shù)據(jù)同步等功能,從而達(dá)到監(jiān)控和管理集群的目的。
ZooKeeper內(nèi)部使用Zab協(xié)議,定義了自己的Znode數(shù)據(jù)結(jié)構(gòu),在該數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)上定義了一些原語(操作),并通過Watcher的通知機(jī)制,在分布式應(yīng)用程序中傳遞消息。簡言之,ZooKeeper = 數(shù)據(jù)結(jié)構(gòu)(Znode)+操作原語+通知機(jī)制(watcher)。
ZooKeeper作為一種開源為分布式應(yīng)用,具有高可用、高性能、一致性、容錯性、可靠性等一系列優(yōu)點(diǎn),因此ZooKeeper一出現(xiàn)就被迅速且廣泛應(yīng)用于大型分布式系統(tǒng)中的配置維護(hù)、組服務(wù)、分布式消息隊(duì)列、分布式通知/協(xié)調(diào)等應(yīng)用場景中。
4.ZooKeeper的功能
- 命名服務(wù):按名稱識別集群中的節(jié)點(diǎn)。它與DNS類似,但是用于節(jié)點(diǎn)。
- 配置管理:加入節(jié)點(diǎn)的系統(tǒng)配置信息的最新化。
- 群集管理:實(shí)時連接/離開群集中的節(jié)點(diǎn)和節(jié)點(diǎn)狀態(tài)。
- 領(lǐng)導(dǎo)選舉:選擇節(jié)點(diǎn)作為協(xié)調(diào)目標(biāo)的領(lǐng)導(dǎo)者。
- 鎖定和同步服務(wù):修改數(shù)據(jù)時鎖定數(shù)據(jù)。此機(jī)制可幫助您在連接其他分式應(yīng)用程序(如Apache HBase)時進(jìn)行自動故障恢復(fù)。
- 高度可靠的數(shù)據(jù)注冊表:數(shù)據(jù)即使在一個或幾個節(jié)點(diǎn)關(guān)閉時的可用性。
5.ZooKeeper的優(yōu)點(diǎn)
- 簡單的分布式協(xié)調(diào)過程
- 同步 – 服務(wù)器進(jìn)程之間的相互排斥和協(xié)作。此過程有助于Apache HBase進(jìn)行配置管理。
- 有序消息
- 序列化 – 根據(jù)特定規(guī)則對數(shù)據(jù)進(jìn)行編碼。確保應(yīng)用程序運(yùn)行一致。這種方法可以用在MapReduce中來協(xié)調(diào)隊(duì)列以執(zhí)行正在運(yùn)行的線程。
- 可靠性
- 原子性
6.ZooKeeper的體系結(jié)構(gòu)

- ZooKeeper客戶端:分布式中的一個節(jié)點(diǎn),訪問服務(wù)器的配置信息,周期性向server發(fā)送心跳包,server向client回應(yīng)確認(rèn),如果client沒有收到回應(yīng),則重定向到另一個server。
- ZooKeeper服務(wù)器:ZooKeeper集群中的一個節(jié)點(diǎn),為client提供所需的服務(wù),給client回應(yīng)信息表明自己是存活的。
- ZooKeeper集群:分為leader和follower,至少需要3個節(jié)點(diǎn)(一個leader,兩個follower)。
- leader:連接任何一個節(jié)點(diǎn),如果節(jié)點(diǎn)出現(xiàn)故障,leader自動修復(fù),在service啟動時完成leader的選舉。leader的主要功能有三個:(a)恢復(fù)數(shù)據(jù);(b)維持與follower的心跳,接收follower請求并判斷follower的請求消息類型;(c)follower的消息類型主要有PING消息、REQUEST消息、ACK消息、REVALIDATE消息,根據(jù)不同的消息類型,進(jìn)行不同的處理。
- follower:聽從leader的指令,完成選舉工作。
7. zookeeper數(shù)據(jù)模型
ZooKeeper節(jié)點(diǎn)被稱為znode,每個znode最多可以存儲1MB的數(shù)據(jù)。
ZooKeeper的樹形結(jié)構(gòu)的主要目的是存儲同步數(shù)據(jù)并描述znode的元數(shù)據(jù)。這個結(jié)構(gòu)被稱為ZooKeeper數(shù)據(jù)模型。
ZooKeeper數(shù)據(jù)模型中的每個znode都維護(hù)一個stat結(jié)構(gòu)。統(tǒng)計(jì)信息只是提供znode的元數(shù)據(jù)。它由版本號,動作控制列表(ACL),時間戳和數(shù)據(jù)長度組成。
- 版本號:每個znode都有一個版本號,這意味著每當(dāng)與znode相關(guān)的數(shù)據(jù)發(fā)生變化時,其相應(yīng)的版本號也會增加。當(dāng)多個zookeeper客戶端試圖通過同一個znode執(zhí)行操作時,使用版本號很重要。
- 動作控制列表(ACL):ACL基本上是用于訪問znode的認(rèn)證機(jī)制。它管理所有的znode讀寫操作。
- 時間戳:時間戳表示從znode創(chuàng)建和修改的時間。它通常以毫秒表示。ZooKeeper從“事務(wù)ID”(zxid)中識別對znodes的每個更改。Zxid是唯一的,并為每個事務(wù)維護(hù)時間,以便可以輕松識別從一個請求到另一個請求所用的時間。
- 數(shù)據(jù)長度:存儲在znode中的數(shù)據(jù)總量是數(shù)據(jù)長度。最多可以存儲1MB的數(shù)據(jù)。
8.Znode的類型
有四種類型的znode:
- PERSISTENT(持久化目錄節(jié)點(diǎn)):即使在創(chuàng)建特定znode的客戶端斷開連接后,仍處于活動狀態(tài)。默認(rèn)情況下,除非另有說明,否則所有znode都是永久的。
- PERSISTENT_SEQUENTIAL(持久化順序編號目錄節(jié)點(diǎn)):客戶端與ZooKeeper斷開連接后,該節(jié)點(diǎn)依舊存在,只是ZooKeeper給該節(jié)點(diǎn)名稱進(jìn)行順序編號。ZooKeeper創(chuàng)建Znode時通過將一個10位數(shù)的序列號附加到原始名稱來設(shè)置znode的路徑。順序節(jié)點(diǎn)在鎖定和同步中起著重要作用。
- EPHEMERAL(臨時目錄節(jié)點(diǎn)):臨時的znode在客戶端活著之前一直處于活動狀態(tài)。當(dāng)客戶端從ZooKeeper集群中斷開連接時,會自動刪除臨時znode。臨時目錄節(jié)點(diǎn)在leader選舉中發(fā)揮重要作用。
- EPHEMERAL_SEQUENTIAL(臨時順序編號目錄節(jié)點(diǎn)):客戶端與ZooKeeper斷開連接后,該節(jié)點(diǎn)被刪除,只是ZooKeeper給該節(jié)點(diǎn)名稱進(jìn)行順序編號。ZooKeeper創(chuàng)建Znode時通過將一個10位數(shù)的序列號附加到原始名稱來設(shè)置znode的路徑。順序節(jié)點(diǎn)在鎖定和同步中起著重要作用。
9. ZooKeeper會話機(jī)制
會話對于ZooKeeper的運(yùn)行非常重要。會話中的請求按先進(jìn)先出順序執(zhí)行。
一旦客戶端連接到服務(wù)器,會話將被建立并且會話ID被分配給客戶端。