第6章 ZooKeeper分布式協(xié)調(diào)服務(wù)_第1頁
第6章 ZooKeeper分布式協(xié)調(diào)服務(wù)_第2頁
第6章 ZooKeeper分布式協(xié)調(diào)服務(wù)_第3頁
第6章 ZooKeeper分布式協(xié)調(diào)服務(wù)_第4頁
第6章 ZooKeeper分布式協(xié)調(diào)服務(wù)_第5頁
已閱讀5頁,還剩85頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第六章

ZooKeeper分布式協(xié)調(diào)服務(wù)大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)6.1ZooKeeper概述6.2

ZooKeeper數(shù)據(jù)模型6.3

ZooKeeper中watch機(jī)制6.4

ZooKeeper的選舉機(jī)制6.5

ZooKeeper會(huì)話6.6

ZooKeeper中ACL訪問控制6.7可插拔ZooKeeper身份驗(yàn)證6.8

ZooKeeper綁定6.9

ZooKeeper部署及操作6.10

ZooKeeper典型應(yīng)用6.11本章小結(jié)本章目錄大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)6.1ZooKeeper概述大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)6.1ZooKeeper概述ZooKeeper是一個(gè)為分布式應(yīng)用提供一致性服務(wù)的軟件,提供的功能包括配置維護(hù)、域名服務(wù)、分布式同步、組服務(wù)等。由于協(xié)調(diào)服務(wù)過程中容易出現(xiàn)競(jìng)爭(zhēng)條件和死鎖等錯(cuò)誤,所以ZooKeeper背后的動(dòng)機(jī)是減輕分布式應(yīng)用程序從頭開始實(shí)現(xiàn)協(xié)調(diào)服務(wù)的負(fù)擔(dān)。它本質(zhì)上是一個(gè)分布式的小文件存儲(chǔ)系統(tǒng),提供基于類似文件系統(tǒng)的目錄樹方式的數(shù)據(jù)存儲(chǔ)服務(wù),通過對(duì)樹中的節(jié)點(diǎn)進(jìn)行有效管理,來維護(hù)和監(jiān)控存儲(chǔ)的數(shù)據(jù)狀態(tài)的變化,通過監(jiān)控這些數(shù)據(jù)狀態(tài)的變化實(shí)現(xiàn)基于數(shù)據(jù)的集群管理。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)6.1.1ZooKeeper的設(shè)計(jì)目標(biāo)簡(jiǎn)單:ZooKeeper允許分布式進(jìn)程之間通過一個(gè)共享的分層命名空間(HierarchicalNamespace)來相互協(xié)調(diào),該命名空間的組織方式類似標(biāo)準(zhǔn)文件系統(tǒng)。復(fù)制:與它協(xié)調(diào)的分布式進(jìn)程一樣,ZooKeeper本身旨在通過一組被稱為ensemble的主機(jī)進(jìn)行復(fù)制。組成ZooKeeper服務(wù)的服務(wù)器必須相互了解,它們維護(hù)內(nèi)存中的狀態(tài)圖像,以及永久存儲(chǔ)中的事務(wù)日志和快照。有序:ZooKeeper會(huì)為每個(gè)更新操作分配一個(gè)唯一且遞增的數(shù)字,用來反映所有ZooKeeper事務(wù)的順序,后續(xù)操作可以使用該順序來實(shí)現(xiàn)同步原語之類的更高級(jí)別的抽象??焖伲篫ooKeeper在“以讀取為主”的工作負(fù)載中尤其快,其應(yīng)用程序在數(shù)千臺(tái)機(jī)器上運(yùn)行,在讀取比寫入更常見的情況下表現(xiàn)最佳,比率約為10∶1。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)6.1.2ZooKeeper的特性全局?jǐn)?shù)據(jù)一致性:全局?jǐn)?shù)據(jù)一致性是指每臺(tái)服務(wù)器都保存一份相同的數(shù)據(jù)副本,因此,當(dāng)客戶端連接到集群的任意節(jié)點(diǎn)上時(shí),看到的目錄樹都是一致的(數(shù)據(jù)都是一致的),即展示的都是同一個(gè)視圖,這也是ZooKeeper最重要的特性??煽啃裕篫ooKeeper具有簡(jiǎn)單、健壯、良好的性能,如果消息(對(duì)目錄結(jié)構(gòu)的增、刪、改、查)被其中一臺(tái)服務(wù)器接收,那么它將被所有的服務(wù)器接收。順序性:ZooKeeper的順序性主要分為全局有序和偏序兩種,其中,全局有序是指如果在一臺(tái)服務(wù)器上,消息A在消息B前發(fā)布,則在所有服務(wù)器上,消息A都將在消息B前發(fā)布;偏序是指如果一個(gè)消息B在消息A后被同一個(gè)發(fā)送者發(fā)布,則消息A必將排在消息B前面。無論是全局有序還是偏序,其目的都是保證ZooKeeper的全局?jǐn)?shù)據(jù)一致。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)6.1.2ZooKeeper的特性原子性:指一次數(shù)據(jù)更新操作要么成功(半數(shù)以上節(jié)點(diǎn)成功),要么失敗,不存在中間狀態(tài)。實(shí)時(shí)性:指ZooKeeper保證客戶端在一個(gè)時(shí)間間隔范圍內(nèi)獲得服務(wù)器的更新信息或服務(wù)器失效的信息。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)6.1.3ZooKeeper的集群角色ZooKeeper是由一個(gè)領(lǐng)導(dǎo)者(Leader)和多個(gè)跟隨者(Follower)組成的集群。此外,針對(duì)訪問量比較大的ZooKeeper集群,還可新增觀察者(Observer)角色。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)6.1.3ZooKeeper的集群角色領(lǐng)導(dǎo)者:ZooKeeper集群工作的核心,也是事務(wù)性請(qǐng)求(寫操作)的唯一調(diào)度和處理者。所有的事務(wù)性請(qǐng)求必須通過領(lǐng)導(dǎo)者完成后廣播給其他服務(wù)器。它保證集群事務(wù)處理的順序性,同時(shí)負(fù)責(zé)投票的發(fā)起和決議,以及更新系統(tǒng)狀態(tài)。跟隨者:可直接處理客戶端的非事務(wù)請(qǐng)求(讀操作),如果跟隨者收到客戶端發(fā)來的事務(wù)性請(qǐng)求,則會(huì)轉(zhuǎn)發(fā)給領(lǐng)導(dǎo)者處理,同時(shí)負(fù)責(zé)在領(lǐng)導(dǎo)者選舉過程中參與投票。一個(gè)ZooKeeper集群可能同時(shí)存在多個(gè)跟隨者。觀察者:負(fù)責(zé)觀察ZooKeeper集群的最新狀態(tài)的變化,并將這些狀態(tài)進(jìn)行同步。對(duì)于非事務(wù)性請(qǐng)求,觀察者可以直接進(jìn)行獨(dú)立處理;對(duì)于事務(wù)性請(qǐng)求,觀察者會(huì)將其轉(zhuǎn)發(fā)給領(lǐng)導(dǎo)者服務(wù)器進(jìn)行處理。它不會(huì)參與任何形式的投票,只提供非事務(wù)性的服務(wù),通常用于在不影響集群事務(wù)處理能力的前提下提升集群的非事務(wù)處理能力(提高集群讀的能力,也降低集群選主的復(fù)雜程度)。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)6.1.4ZooKeeper的實(shí)現(xiàn)ZooKeeper組件如圖所示,除了請(qǐng)求處理器(ReqeustProcessor),組成ZooKeeper服務(wù)的每臺(tái)服務(wù)器都擁有自己所有組件的一份本地副本。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)6.2ZooKeeper數(shù)據(jù)模型大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)6.2.1數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)ZooKeeper命名空間中的每個(gè)節(jié)點(diǎn)都可以有與其關(guān)聯(lián)的數(shù)據(jù)及子節(jié)點(diǎn),可以使用特殊的znode類型來實(shí)現(xiàn)類似文件系統(tǒng)的目錄結(jié)構(gòu),每個(gè)znode都是由3部分組成的,分別是stat(狀態(tài)信息,描述該znode的版本、權(quán)限信息、ACL更改等)、data(與該znode關(guān)聯(lián)的數(shù)據(jù))和children(該znode的子節(jié)點(diǎn))。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)6.2.2節(jié)點(diǎn)類型大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)節(jié)點(diǎn)類型解

釋持久(Persistent)節(jié)點(diǎn)默認(rèn)節(jié)點(diǎn)類型,當(dāng)前會(huì)話關(guān)閉后,該節(jié)點(diǎn)仍存在;只有進(jìn)行刪除節(jié)點(diǎn)操作,該節(jié)點(diǎn)才會(huì)消失;可創(chuàng)建子節(jié)點(diǎn);持久順序(PersistentSequential)節(jié)點(diǎn)默認(rèn)節(jié)點(diǎn)類型,當(dāng)前會(huì)話關(guān)閉后,該節(jié)點(diǎn)仍存在;只有進(jìn)行刪除節(jié)點(diǎn)操作,該節(jié)點(diǎn)才會(huì)消失;節(jié)點(diǎn)名后綴為自增數(shù)字;節(jié)點(diǎn)可創(chuàng)建子節(jié)點(diǎn);臨時(shí)(Epheneral)節(jié)點(diǎn)當(dāng)前會(huì)話關(guān)閉后,該節(jié)點(diǎn)會(huì)被刪除;不能創(chuàng)建子節(jié)點(diǎn);臨時(shí)順序(EpheneralSequential)節(jié)點(diǎn)當(dāng)前會(huì)話關(guān)閉后,該節(jié)點(diǎn)會(huì)被刪除;節(jié)點(diǎn)名后綴為自增數(shù)字;節(jié)點(diǎn)不能創(chuàng)建子節(jié)點(diǎn);6.2.3Znode屬性czxid:創(chuàng)建此znode的更改的zxid。mzxid:最后修改此znode的更改的zxid。pzxid:最后修改此znode子節(jié)點(diǎn)的更改的zxid。ctime:從創(chuàng)建此znode的紀(jì)元開始的時(shí)間(以ms為單位)。mtime:上次修改此znode時(shí)從紀(jì)元開始的時(shí)間(以ms為單位)。dataversion:znode的數(shù)據(jù)版本號(hào)。cversion:znode的子節(jié)點(diǎn)被更改的版本號(hào)。aversion:znode的ACL版本號(hào)。ephemeralOwner:如果znode是臨時(shí)節(jié)點(diǎn),則ephemeralOwner的值為該znode所有者的sessionid;如果znode不是臨時(shí)節(jié)點(diǎn),則ephemeralOwner的值為零。dataLength:znode的數(shù)據(jù)字段的長(zhǎng)度。numChildren:znode擁有的子節(jié)點(diǎn)數(shù)量。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)6.2.4容器節(jié)點(diǎn)容器節(jié)點(diǎn)是具有特殊用途的znode在分布式系統(tǒng)中,它可以用于解決常見的分布式應(yīng)用場(chǎng)景和問題,如選舉、鎖等。當(dāng)容器的最后一個(gè)子節(jié)點(diǎn)被刪除時(shí),該容器將成為服務(wù)器在未來某個(gè)時(shí)間點(diǎn)刪除的候選者。鑒于此屬性,應(yīng)該準(zhǔn)備好在容器節(jié)點(diǎn)內(nèi)創(chuàng)建子節(jié)點(diǎn)時(shí)獲取KeeperException.NoNodeException的輸出。也就是說,在容器節(jié)點(diǎn)內(nèi)創(chuàng)建子znode時(shí),要檢查KeeperException.NoNodeException,并重新創(chuàng)建容器節(jié)點(diǎn)。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)6.2.5TTL節(jié)點(diǎn)在創(chuàng)建持久節(jié)點(diǎn)和持久順序節(jié)點(diǎn)時(shí),可以選擇為節(jié)點(diǎn)設(shè)置一個(gè)TTL時(shí)間(以ms為單位)。如果節(jié)點(diǎn)在TTL時(shí)間內(nèi)沒有被修改且沒有子節(jié)點(diǎn),則它將成為將來某個(gè)時(shí)問點(diǎn)被服務(wù)器刪除的候選節(jié)點(diǎn)。注意:TTL節(jié)點(diǎn)必須通過系統(tǒng)屬性啟用,因?yàn)槟J(rèn)情況下它們是禁用的。如果嘗試在未設(shè)置正確系統(tǒng)屬性的情況下創(chuàng)建TTL節(jié)點(diǎn),那么服務(wù)器將拋出KeeperException.UnimplementedException。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)6.3ZooKeeper中watch機(jī)制大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)6.3.1watch機(jī)制的定義Watch事件是一次性觸發(fā)的(每次數(shù)據(jù)發(fā)生變化之前都要手動(dòng)創(chuàng)建Watch),當(dāng)Watch監(jiān)視的數(shù)據(jù)發(fā)生變化時(shí),通知設(shè)置了該Watch的客戶端。在事件發(fā)送到客戶端的過程中,可能在未到達(dá)客戶端之前,更改操作就已經(jīng)返回更改成功代碼到發(fā)起更改的客戶端了。另外,網(wǎng)絡(luò)延遲或其他因素也可能會(huì)導(dǎo)致不同的客戶端在不同的時(shí)間點(diǎn)收到Watch事件或更新操作返回的代碼。因此,ZooKeeper提供了排序功能:客戶端在第一次收到Watch事件之前,無法看到該事件設(shè)置的更改,同時(shí)保證不同客戶端收到的所有東西都會(huì)有一致的順序。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)6.3.2watch機(jī)制的語義通過設(shè)置Watch的3個(gè)方法來讀取ZooKeeper狀態(tài),這3個(gè)方法分別為exists、getData和getChildren。下面詳細(xì)說明Watch可以觸發(fā)的事件及啟用它們的調(diào)用。(1)創(chuàng)建事件:通過調(diào)用exists啟用。(2)刪除事件:通過調(diào)用exists、getData和getChildren啟用。(3)更改事件:通過調(diào)用exists和getData啟用。(4)子事件:通過調(diào)用getChildren啟用。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)6.3.3watch機(jī)制的實(shí)現(xiàn)在發(fā)送一個(gè)Watch監(jiān)控事件的會(huì)話請(qǐng)求時(shí),首先,客戶端會(huì)把該會(huì)話標(biāo)記為帶有Watch監(jiān)控的事件請(qǐng)求,之后通過創(chuàng)建好的注冊(cè)類來保存watcher事件和節(jié)點(diǎn)間的對(duì)應(yīng)關(guān)系;然后,客戶端向服務(wù)器發(fā)送請(qǐng)求時(shí),將請(qǐng)求封裝成一個(gè)對(duì)象并添加到一個(gè)等待發(fā)送隊(duì)列中;之后,ZooKeeper客戶端就會(huì)向服務(wù)器發(fā)送這個(gè)請(qǐng)求,并等待服務(wù)器的響應(yīng)。一旦收到服務(wù)器的響應(yīng),客戶端將調(diào)用負(fù)責(zé)處理響應(yīng)的方法,并根據(jù)響應(yīng)中的結(jié)果執(zhí)行相應(yīng)的邏輯。對(duì)于包含watcher的請(qǐng)求,客戶端會(huì)將watcher注冊(cè)到WatchManager中;最后,WatchManager負(fù)責(zé)管理所有已注冊(cè)的watcher事件,在節(jié)點(diǎn)發(fā)生變化時(shí),服務(wù)器會(huì)將相關(guān)的通知報(bào)文發(fā)送給客戶端,客戶端接收到通知后,WatchManager會(huì)查找并觸發(fā)相應(yīng)的watcher回調(diào)函數(shù)。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)6.3.4watch機(jī)制的特點(diǎn)一次性觸發(fā):當(dāng)Watch的對(duì)象發(fā)生改變時(shí),將會(huì)觸發(fā)此對(duì)象上Watch所對(duì)應(yīng)的事件,這種監(jiān)聽是一次性的,即后續(xù)再次發(fā)生同樣的事件不會(huì)再次觸發(fā)。如果收到Watch事件并希望收到有關(guān)未來更改的通知,則必須設(shè)置另一個(gè)Watch;由于在獲取事件和發(fā)送新請(qǐng)求以獲取Watch之間存在延遲,所以無法可靠地看到ZooKeeper中節(jié)點(diǎn)發(fā)生的每次更改,需要注意處理znode在獲取事件和再次設(shè)置Watch之間多次更改的情況。事件封裝:ZooKeeper使用WatchedEvent對(duì)象來封裝服務(wù)器事件并傳遞。該對(duì)象包含了每個(gè)事件的3個(gè)基本屬性,即通知狀態(tài)、事件類型和節(jié)點(diǎn)路徑。異步發(fā)送:Watch的通知事件是從服務(wù)器異步發(fā)送到客戶端的。先注冊(cè)再觸發(fā):ZooKeeper中的Watch機(jī)制必須由客戶端先向服務(wù)器注冊(cè)監(jiān)聽,只有這樣才會(huì)觸發(fā)事件的監(jiān)聽,并通知客戶端。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)6.3.5Watch機(jī)制的通知狀態(tài)和事件類型大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)連接狀態(tài)狀態(tài)含義事件類型事件含義Disconnected連接失敗NodeCreated節(jié)點(diǎn)被創(chuàng)建SyncConnected連接成功NodeDataChanged節(jié)點(diǎn)數(shù)據(jù)變更AuthFailed認(rèn)證失敗NodeChildrenChanged子節(jié)點(diǎn)數(shù)據(jù)變更Expired會(huì)話過期NodeDeleted節(jié)點(diǎn)被刪除6.4ZooKeeper的選舉機(jī)制大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)6.4.1全新集群選舉步驟1:服務(wù)器1啟動(dòng)后會(huì)先給自己投票;之后發(fā)起一次選舉,由于其他機(jī)器還沒有啟動(dòng),所以它無法收到投票的反饋信息,此時(shí),服務(wù)器1的票數(shù)為1,不夠半數(shù)以上(3票),選舉無法完成,因此服務(wù)器1的狀態(tài)一直屬于LOOKING狀態(tài)。步驟2:服務(wù)器2啟動(dòng)后會(huì)先給自己投票;之后在集群中啟動(dòng)ZooKeeper服務(wù)的機(jī)器發(fā)起投票對(duì)比,服務(wù)器1發(fā)現(xiàn)服務(wù)器2的編號(hào)比自己目前投票推舉的(服務(wù)器1)大,更改選票為推舉服務(wù)器2,但此時(shí)服務(wù)器1的票數(shù)為0,服務(wù)器2的票數(shù)為2,服務(wù)器2的票數(shù)并沒有大于集群半數(shù)(2<5/2),因此兩臺(tái)服務(wù)器的狀態(tài)依然是LOOKING狀態(tài)。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)6.4.1全新集群選舉步驟3:服務(wù)器3啟動(dòng)后會(huì)先給自己投票;之后與之前啟動(dòng)的服務(wù)器1和服務(wù)器2交換信息,由于服務(wù)器3的編號(hào)最大,所以服務(wù)器1和服務(wù)器2會(huì)將票投給服務(wù)器3,此時(shí)服務(wù)器3的票數(shù)已經(jīng)超過半數(shù)(3>5/2),所以服務(wù)器3成為領(lǐng)導(dǎo)者,服務(wù)器1和服務(wù)器2更改為FOLLOWING狀態(tài),服務(wù)器3更改為L(zhǎng)EADING狀態(tài)。步驟4:服務(wù)器4啟動(dòng)后會(huì)先給自己投票;之后與之前啟動(dòng)的服務(wù)器1~3交換信息,盡管服務(wù)器4的編號(hào)大,但此時(shí)服務(wù)器1~3已經(jīng)不是LOOKING狀態(tài),不會(huì)更改選票信息,服務(wù)器3已經(jīng)成為領(lǐng)導(dǎo)者,所以服務(wù)器4只能更改選票信息為服務(wù)器3,并更改為FOLLOWING狀態(tài)。步驟5:服務(wù)器5啟動(dòng),同服務(wù)器4一樣,成為追隨者狀態(tài),更改為FOLLOWING狀態(tài)。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)6.4.2非全新集群選舉對(duì)于正常運(yùn)行的ZooKeeper集群,一旦中途發(fā)生服務(wù)器初始化啟動(dòng)或在服務(wù)器運(yùn)行期間無法與領(lǐng)導(dǎo)者保持連接的情況,就需要重新選舉,選舉過程中就需要引入服務(wù)器ID、數(shù)據(jù)ID和邏輯時(shí)鐘。這是由于ZooKeeper集群已經(jīng)運(yùn)行過一段時(shí)間,服務(wù)器中會(huì)存在運(yùn)行的數(shù)據(jù)。下面來講解非全新集群選舉的過程。首先,統(tǒng)計(jì)邏輯時(shí)鐘是否相同,如果邏輯時(shí)鐘小,則說明途中可能存在宕機(jī)問題,因此數(shù)據(jù)不完整,該選舉結(jié)果將被忽略,重新投票選舉;其次,統(tǒng)一邏輯時(shí)鐘后,對(duì)比數(shù)據(jù)ID,數(shù)據(jù)ID反映數(shù)據(jù)的新舊程度,因此數(shù)據(jù)ID大的勝出;最后,如果邏輯時(shí)鐘和數(shù)據(jù)ID都相同,那么比較myid,大者勝出。簡(jiǎn)單地講,非全新集群選舉屬于優(yōu)中選優(yōu),保證領(lǐng)導(dǎo)者是ZooKeeper集群中數(shù)據(jù)最完整、最可靠的一臺(tái)服務(wù)器。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)6.5ZooKeeper會(huì)話大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)6.5.1ZooKeeper會(huì)話概述ZooKeeper客戶端通過使用語言綁定創(chuàng)建服務(wù)句柄來與ZooKeeper服務(wù)建立會(huì)話。創(chuàng)建成功后,句柄以CONNECTING狀態(tài)作為開始狀態(tài),客戶端庫嘗試連接構(gòu)成ZooKeeper服務(wù)的服務(wù)器之一,此時(shí)句柄切換到CONNECTED狀態(tài)。在正常操作期間,客戶端句柄將處于這兩種狀態(tài)之一。如果發(fā)生不可恢復(fù)的錯(cuò)誤,如會(huì)話過期或身份驗(yàn)證失敗,或者應(yīng)用程序顯式關(guān)閉句柄,則句柄將轉(zhuǎn)為CLOSED狀態(tài)。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)6.5.2ZooKeeper客戶端的狀態(tài)轉(zhuǎn)換大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)6.5.3創(chuàng)建會(huì)話當(dāng)客戶端獲得ZooKeeper服務(wù)的句柄時(shí),ZooKeeper會(huì)創(chuàng)建一個(gè)ZooKeeper會(huì)話,以64位數(shù)字表示,并分配給客戶端。如果客戶端連接到不同的ZooKeeper服務(wù)器,那么客戶端將發(fā)送會(huì)話ID作為連接握手的一部分。作為一項(xiàng)安全措施,服務(wù)器會(huì)為任何ZooKeeper服務(wù)器都可以驗(yàn)證的會(huì)話ID創(chuàng)建一個(gè)密碼。當(dāng)客戶端建立會(huì)話時(shí),該密碼會(huì)與會(huì)話ID一起發(fā)送給客戶端。每當(dāng)與新服務(wù)器重新建立會(huì)話時(shí),客戶端都會(huì)發(fā)送此密碼和會(huì)話ID。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)6.5.3創(chuàng)建會(huì)話ZooKeeper客戶端庫創(chuàng)建ZooKeeper會(huì)話調(diào)用的參數(shù)之一是會(huì)話超時(shí)時(shí)間(以ms為單位)??蛻舳税l(fā)送一個(gè)請(qǐng)求超時(shí)時(shí)間,服務(wù)器則以能夠提供的會(huì)話超時(shí)時(shí)間作為響應(yīng)返回給客戶端。當(dāng)前的實(shí)現(xiàn)要求會(huì)話超時(shí)時(shí)間至少為tickTime的2倍(在服務(wù)器配置中設(shè)置),最大為tickTime的20倍。ZooKeeper客戶端API允許訪問已協(xié)商的會(huì)話超時(shí)時(shí)間,可以使用ZooKeeper客戶端API提供的“getSessionTimeout()方法從ZooKeeper對(duì)象中檢索協(xié)商后的會(huì)話超時(shí)時(shí)間值并返回(以ms為單位)。ZooKeeper會(huì)話建立調(diào)用的另一個(gè)參數(shù)是默認(rèn)watcher。當(dāng)客戶端發(fā)生任何狀態(tài)更改時(shí),會(huì)通知watcher。例如,如果客戶端失去與服務(wù)器的連接,或者客戶端的會(huì)話過期,那么客戶端將被通知。這個(gè)watcher的初始狀態(tài)應(yīng)該認(rèn)為是斷開的(即在任何狀態(tài)更改事件未發(fā)送給觀察者之前的客戶端庫)。在新連接建立的情況下,發(fā)送給watcher的第一個(gè)事件通常是會(huì)話連接事件。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)6.5.3創(chuàng)建會(huì)話一旦成功建立與服務(wù)器的連接,基本上有兩種情況,即當(dāng)執(zhí)行同步或異步操作時(shí),客戶端庫會(huì)生成connectionloss,并滿足以下條件之一。(1)應(yīng)用程序在會(huì)話上的調(diào)用操作不再活躍或有效。(2)當(dāng)服務(wù)器有掛起操作時(shí),ZooKeeper客戶端與服務(wù)器斷開連接,即有一個(gè)掛起的異步調(diào)用。(3)要?jiǎng)?chuàng)建客戶端會(huì)話,應(yīng)用程序代碼必須提供一個(gè)連接字符串。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)6.5.4會(huì)話過期會(huì)話過期由ZooKeeper集群本身管理,而不由客戶端管理。當(dāng)ZooKeeper客戶端與集群建立會(huì)話時(shí),客戶端會(huì)提供上面詳述的會(huì)話超時(shí)時(shí)間。集群使用此值來確定客戶端會(huì)話何時(shí)到期。當(dāng)集群在指定的會(huì)話超時(shí)期限(沒有心跳)內(nèi)沒有收到客戶端的消息時(shí),就會(huì)發(fā)生過期。在會(huì)話到期時(shí),集群將刪除該會(huì)話擁有的一些或所有臨時(shí)節(jié)點(diǎn),并立即將更改通知一些或所有連接的客戶端(所有監(jiān)聽這些節(jié)點(diǎn)的客戶端)。此時(shí),過期會(huì)話的客戶端仍然與集群斷開連接,直到它能夠重新建立與集群的連接,它才會(huì)被通知會(huì)話過期。過期會(huì)話的watcher監(jiān)聽的狀態(tài)轉(zhuǎn)換示例如下:CONNECTED:會(huì)話已建立且客戶端正在與集群通信(客戶端/服務(wù)器通信正常運(yùn)行)。DISCONNECTED:客戶端與集群失去連接。EXPIRED:最終客戶端重新連接到集群,被通知會(huì)話過期。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)6.5.5本地會(huì)話由于ZooKeeper中會(huì)話的創(chuàng)建和關(guān)閉成本很高,因?yàn)樗鼈冃枰俨么_認(rèn),當(dāng)需要處理數(shù)千個(gè)客戶端連接時(shí),它們成為ZooKeeper集成的瓶頸。所以在V3.5.0之后引入了一種新的會(huì)話類型:本地會(huì)話。當(dāng)localSessionsUpgradingEnabled禁用時(shí),本地會(huì)話無法創(chuàng)建臨時(shí)節(jié)點(diǎn)。一旦本地會(huì)話丟失,用戶就無法使用會(huì)話ID/密碼重新建立它,會(huì)話和它的watch將永遠(yuǎn)消失。注意:丟失TCP連接并不一定意味著會(huì)話丟失。如果可以在會(huì)話超時(shí)之前與同一臺(tái)ZooKeeper服務(wù)器重新建立連接,那么客戶端可以繼續(xù)訪問服務(wù)器。當(dāng)建立本地會(huì)話后,會(huì)話信息僅在其連接的ZooKeeper服務(wù)器上維護(hù)。領(lǐng)導(dǎo)者不知道此類會(huì)話的創(chuàng)建,并且沒有寫入磁盤的狀態(tài)。PING請(qǐng)求、過期和其他會(huì)話狀態(tài)維護(hù)由當(dāng)前會(huì)話連接的服務(wù)器來處理。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)6.5.5本地會(huì)話當(dāng)localSessionsUpgradingEnabled啟用時(shí),本地會(huì)話可以自動(dòng)升級(jí)為全局會(huì)話。當(dāng)創(chuàng)建一個(gè)新的會(huì)話時(shí),會(huì)本地保存在封裝的LocalSessionTracker中。隨后可以根據(jù)需求將其升級(jí)為全局會(huì)話(如創(chuàng)建的臨時(shí)節(jié)點(diǎn)),如果需要升級(jí),則從本地集合中刪除會(huì)話,同時(shí)保留相同的會(huì)話ID。目前,只有創(chuàng)建的臨時(shí)節(jié)點(diǎn)需要從本地會(huì)話升級(jí)為全局會(huì)話,因?yàn)閯?chuàng)建臨時(shí)節(jié)點(diǎn)在很大程度上依賴于全局會(huì)話,如果本地會(huì)話可以在不升級(jí)為全局會(huì)話的情況下創(chuàng)建臨時(shí)節(jié)點(diǎn),則會(huì)導(dǎo)致不同節(jié)點(diǎn)之間的數(shù)據(jù)不一致。另外,領(lǐng)導(dǎo)者還需要了解會(huì)話的生命周期,以便清理關(guān)閉或過期的臨時(shí)節(jié)點(diǎn)。在本地會(huì)話綁定到其特定的服務(wù)器時(shí),需要一個(gè)全局會(huì)話。在升級(jí)過程中,一個(gè)會(huì)話既可以是本地會(huì)話又可以是全局會(huì)話,但是升級(jí)操作不能被兩個(gè)線程同時(shí)調(diào)用。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)6.5.5本地會(huì)話ZooKeeperServer(Standalone)使用SessionTrackerImpl,LeaderZooKeeper使用持有SessionTrackerImpl(全局)和LocalSessionTracker(如果啟用)的LeaderSessionTracker,F(xiàn)ollowerZooKeeperServer和ObserverZooKeeperServer使用持有LocalSessionTracker的LearnerSessionTracker。會(huì)話的UML類圖如圖:大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)6.6ZooKeeper中ACL訪問控制大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)6.6.1ACL訪問控制概述ZooKeeper使用ACL來控制對(duì)其znode的訪問。ACL實(shí)現(xiàn)與UNIX文件訪問權(quán)限非常相似:它使用權(quán)限位來允許或禁止對(duì)節(jié)點(diǎn)的各種操作及這些權(quán)限位適用的范圍。與標(biāo)準(zhǔn)UNIX權(quán)限不同,ZooKeeper節(jié)點(diǎn)不受user(文件所有者)、group(組)和world(其他)3個(gè)標(biāo)準(zhǔn)范圍的限制。ZooKeeper支持可插拔的身份驗(yàn)證方案。ID由表單scheme:expression指定,其中,scheme是ID對(duì)應(yīng)的身份驗(yàn)證方案,由scheme定義有效的expression集合。當(dāng)客戶端連接到ZooKeeper并對(duì)其自身進(jìn)行身份驗(yàn)證時(shí),ZooKeeper會(huì)將與客戶端對(duì)應(yīng)的所有ID與客戶端連接相關(guān)聯(lián)。當(dāng)客戶端嘗試訪問節(jié)點(diǎn)時(shí),這些ID會(huì)根據(jù)znode的ACL進(jìn)行檢查。ACL由成對(duì)的(scheme:expression,perms)組成,expression的格式特定于scheme。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)6.6.2ACL權(quán)限ZooKeeper支持CREATE(創(chuàng)建一個(gè)子節(jié)點(diǎn))、READ(從節(jié)點(diǎn)和子節(jié)點(diǎn)列表中獲取數(shù)據(jù))、WRITE(為節(jié)點(diǎn)設(shè)置數(shù)據(jù))、DELETE(刪除子節(jié)點(diǎn))和ADMIN(設(shè)置權(quán)限)。CREATE權(quán)限和DELETE權(quán)限已從WRITE權(quán)限中分離出來,以實(shí)現(xiàn)更精細(xì)的訪問控制。如:可以令A(yù)用戶能夠在ZooKeeper節(jié)點(diǎn)上執(zhí)行“SET”操作,但不能執(zhí)行"CREATE"或"DELETE"子節(jié)點(diǎn)的操作。有CREATE但無DELETE權(quán)限(這類似文件的APPEND權(quán)限)表示客戶端發(fā)出一個(gè)在父目錄下創(chuàng)建節(jié)點(diǎn)的請(qǐng)求。這時(shí),所有客戶端都能夠添加子節(jié)點(diǎn),但是只有創(chuàng)建者能夠刪除子節(jié)點(diǎn)。ADMIN權(quán)限將實(shí)體指定為所有者。為了檢索一個(gè)節(jié)點(diǎn)的ACL,用戶必須具有READ或ADMIN權(quán)限,但如果沒有ADMIN權(quán)限,哈希值將被屏蔽。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)6.6.3ACL內(nèi)置方案world:有一個(gè)單一的ID——anyone,代表任何人。auth:一個(gè)特殊的內(nèi)置方案,它忽略任何提供的表達(dá)式,而使用當(dāng)前用戶、憑據(jù)和方案。使用"auth"方案時(shí)仍必須在ACL中提供表達(dá)式,因?yàn)锳CL必須匹配格式scheme:expression:perms。digest:使用username:password字符串生成MD5hash,并將其用作ACLID身份。通過以明文形式發(fā)送username:password來完成身份驗(yàn)證。在ACL中使用該方案時(shí),表達(dá)式將由SHA1passworddigest編碼username:base64。ip:使用客戶端主機(jī)IP作為ACLID身份。ACL表達(dá)式的格式為addr/bits,其中,addr的最高有效位與客戶端主機(jī)IP地址的最高有效位相匹配。x509:使用客戶端X500Principal作為ACLID身份。ACL表達(dá)式是客戶端的確切X500Principal名稱。當(dāng)使用安全端口時(shí),客戶端會(huì)自動(dòng)進(jìn)行身份驗(yàn)證,并設(shè)置x509方案的身份驗(yàn)證信息。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)6.6.4ACL在C庫中的應(yīng)用ZooKeeperC庫提供的常量、標(biāo)準(zhǔn)ACLID、附帶的標(biāo)準(zhǔn)ACL,以及ZooKeeper處理ACL的操作。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)//常量constintZOO_PERM_READ;//可以讀取節(jié)點(diǎn)的值并列出其子節(jié)點(diǎn)constintZOO_PERM_WRITE;//可以設(shè)置節(jié)點(diǎn)的值constintZOO_PERM_CREATE;//可以創(chuàng)建子節(jié)點(diǎn)constintZOO_PERM_DELETE;//可以刪除子節(jié)點(diǎn)constintZOO_PERM_ADMIN;//可以執(zhí)行set_acl()constintZOO_PERM_ALL;//上述所有標(biāo)志//標(biāo)準(zhǔn)ACLIDstructIdZOO_ANYONE_ID_UNSAFE;//('world','anyone')structIdZOO_AUTH_IDS;//('auth','')6.6.4ACL在C庫中的應(yīng)用其中,ZOO_OPEN_ACL_UNSAFE對(duì)所有ACL完全免費(fèi)開放,任何應(yīng)用程序都可以在節(jié)點(diǎn)上執(zhí)行任何操作,并且可以創(chuàng)建、列出和刪除其子節(jié)點(diǎn);ZOO_READ_ACL_UNSAFE是任何應(yīng)用程序的只讀訪問權(quán)限;CREATE_ALL_ACL將所有權(quán)限授予節(jié)點(diǎn)的創(chuàng)建者。創(chuàng)建者必須通過服務(wù)器的身份驗(yàn)證(如使用digest方案)才能使用此ACL創(chuàng)建節(jié)點(diǎn)。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)//(ZOO_PERM_ALL,ZOO_ANYONE_ID_UNSAFE)structACL_vectorZOO_OPEN_ACL_UNSAFE;//(ZOO_PERM_READ,ZOO_ANYONE_ID_UNSAFE)structACL_vectorZOO_READ_ACL_UNSAFE;//(ZOO_PERM_ALL,ZOO_AUTH_IDS)structACL_vectorZOO_CREATOR_ALL_ACL;ZooKeeper客戶端附帶3個(gè)標(biāo)準(zhǔn)ACL:6.6.4ACL在C庫中的應(yīng)用ZooKeeper處理ACL的操作:intzoo_add_auth(zhandle_t*zh,constchar*scheme,constchar*cert,intcertLen,void_completion_tcompletion,constvoid*data);應(yīng)用程序使用zoo_add_auth函數(shù)向服務(wù)器進(jìn)行自我驗(yàn)證。如果應(yīng)用程序想要使用不同的方案或身份進(jìn)行身份驗(yàn)證,則可以多次調(diào)用該函數(shù)。intzoo_create(zhandle_t*zh,constchar*path,constchar*value,intvaluelen,conststructACL_vector*acl,intflags,char*realpath,intmax_realpath_len);zoo_create(...)操作創(chuàng)建一個(gè)新節(jié)點(diǎn),acl參數(shù)是與節(jié)點(diǎn)關(guān)聯(lián)的ACL,父節(jié)點(diǎn)必須設(shè)置CREATE權(quán)限位。intzoo_get_acl(zhandle_t*zh,constchar*path,structACL_vector*acl,structStat*stat);此操作返回節(jié)點(diǎn)的ACL信息。intzoo_set_acl(zhandle_t*zh,constchar*path,intversion,conststructACL_vector*acl);此函數(shù)將節(jié)點(diǎn)的ACL替換為新列表。該節(jié)點(diǎn)必須具有ADMIN權(quán)限。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)6.7可插拔ZooKeeper身份驗(yàn)證大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)6.7.1身份驗(yàn)證框架首先,身份驗(yàn)證框架必須對(duì)客戶端進(jìn)行身份驗(yàn)證,這通常在客戶端連接服務(wù)器后立即完成,包括驗(yàn)證從客戶端發(fā)送或收集的關(guān)于客戶端的信息并將其與連接相關(guān)聯(lián);其次,框架在ACL中查找與客戶端對(duì)應(yīng)的條目,ACL條目是<idspec,permissions>。其中,idspec可以是與連接關(guān)聯(lián)的身份驗(yàn)證信息匹配的簡(jiǎn)單字符串,也可以是針對(duì)該信息評(píng)估的表達(dá)式,由身份驗(yàn)證插件的實(shí)現(xiàn)來進(jìn)行匹配。身份驗(yàn)證插件必須實(shí)現(xiàn)的接口如下:大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)publicinterfaceAuthenticationProvider{StringgetScheme();KeeperException.CodehandleAuthentication(ServerCnxncnxn,byteauthData[]);booleanisValid(Stringid);booleanmatches(Stringid,StringaclExpr);booleanisAuthenticated();}6.7.2身份驗(yàn)證的額外參數(shù)在ZooKeeper3.6.0中,另一種提供了額外的參數(shù)的抽象用于可插拔身份驗(yàn)證:如果開發(fā)者擴(kuò)展了ServerAuthenticationProvider類,而不是實(shí)現(xiàn)AuthenticationProvider接口,則handleAuthentication()和matches()方法將收到額外的參數(shù)(通過ServerObjs和MatchValues參數(shù))。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)publicabstractclassServerAuthenticationProviderimplementsAuthenticationProvider{publicabstractKeeperException.CodehandleAuthentication(ServerObjsserverObjs,byteauthData[]);publicabstractbooleanmatches(ServerObjsserverObjs,MatchValuesmatchValues);}6.8ZooKeeper綁定大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)6.8.1Java綁定ZooKeeperJava綁定有兩個(gè)包:org.apache.ZooKeeper和org.apache.ZooKeeper.data。組成ZooKeeper的其余包在內(nèi)部使用或是服務(wù)器實(shí)現(xiàn)的一部分。org.apache.ZooKeeper.data包由生成的類組成,這些類僅用作容器。ZooKeeperJava客戶端使用的主要類是ZooKeeper類,它的兩個(gè)構(gòu)造函數(shù)的區(qū)別僅在于可選的會(huì)話ID和密碼不同。ZooKeeper支持跨進(jìn)程實(shí)例的會(huì)話恢復(fù),Java程序可以將其會(huì)話ID和密碼保存為穩(wěn)定存儲(chǔ)、重新啟動(dòng)和恢復(fù)該程序的早期實(shí)例使用的會(huì)話。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)6.8.1Java綁定

在創(chuàng)建ZooKeeper對(duì)象時(shí),也會(huì)創(chuàng)建兩個(gè)線程:一個(gè)I/O線程和一個(gè)事件線程。所有I/O都發(fā)生在I/O線程上(使用JavaNIO)。所有事件回調(diào)都發(fā)生在事件線程上。會(huì)話維護(hù)涉及多種操作和線程。同步方法的響應(yīng)也在I/O線程中處理。異步方法和watch事件的所有響應(yīng)都在事件線程上處理。這種設(shè)計(jì)有以下幾點(diǎn)需要注意:異步調(diào)用和watcher回調(diào)的所有完成都將按順序完成一次完成。調(diào)用者可以進(jìn)行任何調(diào)用處理,但在此期間不會(huì)處理其他回調(diào)。回調(diào)不會(huì)阻塞I/O線程的處理或同步調(diào)用的處理。同步調(diào)用可能不會(huì)以正確的順序返回。

與ZooKeeper關(guān)閉相關(guān)的規(guī)則很簡(jiǎn)單。一旦ZooKeeper對(duì)象關(guān)閉或收到致命事件(SESSION_EXPIRED和AUTH_FAILED),ZooKeeper對(duì)象就會(huì)失效。在關(guān)閉過程中,兩個(gè)線程都會(huì)停止運(yùn)行,對(duì)ZooKeeper句柄的任何進(jìn)一步訪問都是未定義的行為,應(yīng)該避免發(fā)生。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)6.8.2C綁定C綁定庫具有單線程和多線程兩種庫。多線程庫最容易使用,并且與JavaAPI最相似。該庫將創(chuàng)建一個(gè)IO線程和一個(gè)事件調(diào)度線程,用于處理連接維護(hù)和回調(diào)問題。通過暴露多線程庫中使用的事件循環(huán),單線程庫允許ZooKeeper在事件驅(qū)動(dòng)的應(yīng)用程序中使用。C綁定庫包括兩個(gè)共享庫:ZooKeeper_st和ZooKeeper_mt。ZooKeeper_st僅提供用于集成到應(yīng)用程序事件循環(huán)中的異步API和回調(diào),這個(gè)庫存在的唯一原因就是為了支持那些pthread庫不可用或不穩(wěn)定的平臺(tái)(例如FreeBSD4.x)。在其他所有情況下,應(yīng)用程序開發(fā)人員應(yīng)與ZooKeeper_mt鏈接,因?yàn)樗▽?duì)Sync和AsyncAPI的支持。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)6.9ZooKeeper部署及操作大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)6.9.1ZooKeeper的下載與安裝在ApacheZooKeeper官網(wǎng)下載zookeeper安裝包。將下載完畢的ZooKeeper安裝包上傳至Linux系統(tǒng)的/export/software/目錄下。解壓安裝包apache-zookeeper-3.8.0-bin.tar.gz至/export/servers/目錄,具體命令如下:大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)tar-zxvfapache-zookeeper-3.8.0-bin.tar.gz-C/export/servers/6.9.2配置修改修改zoo_sample.cfg將/export/servers/apache-zookeeper-3.8.0-bin/conf路徑下的zoo_sample.cfg修改為zoo.cfg:2.修改dataDir路徑打開zoo.cfg文件:修改dataDir路徑(修改配置如圖所示):大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)$mvzoo_sample.cfgzoo.cfgdataDir=/export/servers/apache-zookeeper-3.8.0-bin/zkData$vimzoo.cfg6.9.2配置修改3.創(chuàng)建zkData目錄使用以下命令在/export/servers/apache-zookeeper-3.8.0-bin/這個(gè)目錄下創(chuàng)建zkData目錄:4.配置環(huán)境變量Linux系統(tǒng)目錄/etc下的文件profile中的內(nèi)容都是與Linux環(huán)境變量相關(guān)的。因此,一般配置環(huán)境變量都是在profile文件中進(jìn)行的。執(zhí)行命令vim/etc/profile,對(duì)profile文件進(jìn)行修改,添加ZooKeeper的環(huán)境變量。具體命令如下:大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)[root@masterapache-zookeeper-3.8.0-bin]#mkdirzkDataexportZK_HOME=/export/servers/apache-zookeeper-3.8.0-binexportPATH=$ZK_HOME/sbin:$ZK_HOME/bin:$PATH6.9.2配置修改ZooKeeper的配置文件zoo.cfg中的參數(shù)含義解讀如下。(1)tickTime=2000:通信心跳時(shí)間,ZooKeeper服務(wù)器與客戶端心跳時(shí)間,單位為ms。tickTime如圖所示:(2)initLimit=10:LF初始通信時(shí)限。領(lǐng)導(dǎo)者和跟隨者初始連接時(shí)能容忍的最大心跳數(shù)(tickTime的數(shù)量)。(3)syncLimit=5:LF同步通信時(shí)限。領(lǐng)導(dǎo)者和跟隨者之間的通信時(shí)間如果超過了syncLimit*tickTime,則領(lǐng)導(dǎo)者認(rèn)為跟隨者“死忘”,從服務(wù)器列表中刪除跟隨者。(4)dataDir:保存ZooKeeper中的數(shù)據(jù)。注意:默認(rèn)的tmp目錄容易被Linux系統(tǒng)定期刪除,因此一般不用默認(rèn)的tmp目錄。(5)clientPort=2181:客戶端連接端口,通常不做修改。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)6.9.3ZooKeeper操作啟動(dòng)ZooKeeper查看進(jìn)程是否啟動(dòng)

大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)[root@masterapache-zookeeper-3.8.0-bin]#bin/zkServer.shstartZooKeeperJMXenabledbydefaultUsingconfig:/export/servers/apache-zookeeper-3.8.0-bin/bin/../conf/zoo.cfgStartingzookeeper...STARTED[root@masterapache-zookeeper-3.8.0-bin]#jps3090Jps3047QuorumPeerMain6.9.3ZooKeeper操作3.查看狀態(tài)4.啟動(dòng)客戶端大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)[root@masterapache-zookeeper-3.8.0-bin]#bin/zkServer.shstatusZooKeeperJMXenabledbydefaultUsingconfig:/export/servers/apache-zookeeper-3.8.0-bin/bin/../conf/zoo.cfgClientportfound:2181.Clientaddress:localhost.ClientSSL:false.Mode:standalone$bin/zkCli.sh6.9.3ZooKeeper操作5.退出客戶端6.停止ZooKeeper大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)[root@masterapache-zookeeper-3.8.0-bin]#bin/zkServer.shstopZooKeeperJMXenabledbydefaultUsingconfig:/export/servers/apache-zookeeper-3.8.0-bin/bin/../conf/zoo.cfgStoppingzookeeper...STOPPEDquit6.9.4ZooKeeper集群部署1.集群操作(1)集群規(guī)劃在master、slave01和slave02幾個(gè)節(jié)點(diǎn)上都部署ZooKeeper。(2)配置服務(wù)器編號(hào)。①在/export/servers/apache-zookeeper-3.8.0-bin/目錄下創(chuàng)建zkData目錄:②在/export/servers/apache-zookeeper-3.8.0-bin/zkData目錄下創(chuàng)建myid文件,該文件中的內(nèi)容就是服務(wù)器編號(hào)(master服務(wù)器對(duì)應(yīng)編號(hào)100,slave01服務(wù)器對(duì)應(yīng)編號(hào)101,slave02服務(wù)器對(duì)應(yīng)編號(hào)102)。具體命令如下:大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)$mkdirzkData$vimyid6.9.4ZooKeeper集群部署③在文件中添加與master服務(wù)器對(duì)應(yīng)的編號(hào)(注意:上下不要有空行,左右不要有空格):大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)100$vimzoo.cfg#修改數(shù)據(jù)存儲(chǔ)路徑配置dataDir=/export/servers/apache-zookeeper-3.8.0-bin/zkData#增加如下配置(每行最后不能有空格)#######################cluster##########################server.100=master:2888:3888server.101=slave01:2888:3888server.102=slave02:2888:3888同樣,分別在slave01、slave02服務(wù)器上修改myid文件中的內(nèi)容為101、102。(3)配置zoo.cfg文件。①打開zoo.cfg文件:6.9.4ZooKeeper集群部署②配置參數(shù)解讀:其中,A是一個(gè)數(shù)字,表示這是第幾號(hào)服務(wù)器;在集群模式下配置一個(gè)文件myid,這個(gè)文件在dataDir目錄下,這個(gè)文件中有一個(gè)數(shù)據(jù)就是A的值,ZooKeeper啟動(dòng)時(shí)讀取此文件,拿到其中的數(shù)據(jù)并與zoo.cfg文件中的配置信息進(jìn)行比較,從而判斷到底是哪個(gè)服務(wù)器;B是這個(gè)服務(wù)器的地址;C是這個(gè)服務(wù)器跟隨者與集群中的領(lǐng)導(dǎo)者服務(wù)器交換信息的端口。萬一集群中的領(lǐng)導(dǎo)者服務(wù)器“死亡”,需要一個(gè)端口來重新進(jìn)行選舉,選出一個(gè)新的領(lǐng)導(dǎo)者,而D這個(gè)端口就是用來執(zhí)行選舉時(shí)服務(wù)器相互通信的端口。分別在slave01、slave02服務(wù)器上按如上步驟修改zoo.cfg文件。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)server.A=B:C:D6.9.4ZooKeeper集群部署(4)集群操作的具體步驟。①分別啟動(dòng)ZooKeeper:大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)[root@masterapache-zookeeper-3.8.0-bin]$bin/zkServer.shstart[root@slave01apache-zookeeper-3.8.0-bin]$bin/zkServer.shstart[root@slave02apache-zookeeper-3.8.0-bin]$bin/zkServer.shstart6.9.4ZooKeeper集群部署②查看節(jié)點(diǎn)狀態(tài):大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)[root@masterapache-zookeeper-3.8.0-bin]#bin/zkServer.shstatusZooKeeperJMXenabledbydefaultUsingconfig:/export/servers/apache-zookeeper-3.8.0-bin/bin/../conf/zoo.cfgClientportfound:2181.Clientaddress:localhost.ClientSSL:false.Mode:follower[root@slave01apache-zookeeper-3.8.0-bin]#bin/zkServer.shstatusZooKeeperJMXenabledbydefaultUsingconfig:/export/servers/apache-zookeeper-3.8.0-bin/bin/../conf/zoo.cfgClientportfound:2181.Clientaddress:localhost.ClientSSL:false.Mode:leader[root@slave02apache-zookeeper-3.8.0-bin]#bin/zkServer.shstatusZooKeeperJMXenabledbydefaultUsingconfig:/export/servers/apache-zookeeper-3.8.0-bin/bin/../conf/zoo.cfgClientportfound:2181.Clientaddress:localhost.ClientSSL:false.Mode:follower6.9.4ZooKeeper集群部署(5)集群命令腳本。①在master服務(wù)器的/usr/bin目錄下創(chuàng)建腳本:$vimzk.sh在腳本中編寫如下內(nèi)容:大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)#!/bin/bashcase$1in"start"){foriinmasterslave01slave02doecho----------Zookeeper$i啟動(dòng)------------ssh$i"/export/servers/apache-zookeeper-3.8.0-bin/bin/zkServer.shstart"done};;6.9.4ZooKeeper集群部署大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)"stop"){foriinmasterslave01slave02doecho----------Zookeeper$i停止------------ssh$i"/export/servers/apache-zookeeper-3.8.0-bin/bin/zkServer.shstop"done};;"status"){foriinmasterslave01slave02doecho----------Zookeeper$i狀態(tài)------------ssh$i"/export/servers/apache-zookeeper-3.8.0-bin/bin/zkServer.shstatus"done};;esac6.9.4ZooKeeper集群部署②增加腳本執(zhí)行權(quán)限:③ZooKeeper集群?jiǎn)?dòng)腳本:大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)[root@masterbin]#zk.shstart----------zookeepermaster啟動(dòng)------------ZooKeeperJMXenabledbydefaultUsingconfig:/export/servers/apache-zookeeper-3.8.0-bin/bin/../conf/zoo.cfgStartingzookeeper...STARTED----------zookeeperslave01啟動(dòng)------------ZooKeeperJMXenabledbydefaultUsingconfig:/export/servers/apache-zookeeper-3.8.0-bin/bin/../conf/zoo.cfgStartingzookeeper...STARTED----------zookeeperslave02啟動(dòng)------------ZooKeeperJMXenabledbydefaultUsingconfig:/export/servers/apache-zookeeper-3.8.0-bin/bin/../conf/zoo.cfgStartingzookeeper...STARTED$chmodu+xzk.sh6.9.4ZooKeeper集群部署④ZooKeeper集群狀態(tài)腳本:大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)[root@masterconf]#zk.shstatus----------zookeepermaster狀態(tài)------------ZooKeeperJMXenabledbydefaultUsingconfig:/export/servers/apache-zookeeper-3.8.0-bin/bin/../conf/zoo.cfgClientportfound:2181.Clientaddress:localhost.ClientSSL:false.Mode:leader----------zookeeperslave01狀態(tài)------------ZooKeeperJMXenabledbydefaultUsingconfig:/export/servers/apache-zookeeper-3.8.0-bin/bin/../conf/zoo.cfgClientportfound:2181.Clientaddress:localhost.ClientSSL:false.Mode:follower----------zookeeperslave02狀態(tài)------------ZooKeeperJMXenabledbydefaultUsingconfig:/export/servers/apache-zookeeper-3.8.0-bin/bin/../conf/zoo.cfgClientportfound:2181.Clientaddress:localhost.ClientSSL:false.Mode:follower6.9.4ZooKeeper集群部署大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)⑤ZooKeeper集群停止腳本:[root@masterbin]#zk.shstop----------zookeepermaster停止------------ZooKeeperJMXenabledbydefaultUsingconfig:/export/servers/apache-zookeeper-3.8.0-bin/bin/../conf/zoo.cfgStoppingzookeeper...STOPPED----------zookeeperslave01停止------------ZooKeeperJMXenabledbydefaultUsingconfig:/export/servers/apache-zookeeper-3.8.0-bin/bin/../conf/zoo.cfgStoppingzookeeper...STOPPED----------zookeeperslave02停止------------ZooKeeperJMXenabledbydefaultUsingconfig:/export/servers/apache-zookeeper-3.8.0-bin/bin/../conf/zoo.cfgStoppingzookeeper...STOPPED6.9.4ZooKeeper集群部署大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)2.客戶端命令行操作命令行語法功能描述help顯示所有操作命令lspath使用ls命令查看當(dāng)前znode的子節(jié)點(diǎn)[可監(jiān)聽]-w:監(jiān)聽子節(jié)點(diǎn)變化-s:附加次級(jí)信息create普通創(chuàng)建-s:含有序列-e:臨時(shí)(重啟或超時(shí)消失)getpath獲得節(jié)點(diǎn)的值[可監(jiān)聽]-w:監(jiān)聽節(jié)點(diǎn)內(nèi)容變化-s:附加次級(jí)信息set設(shè)置節(jié)點(diǎn)的具體值stat查看節(jié)點(diǎn)狀態(tài)delete刪除節(jié)點(diǎn)deleteall遞歸刪除節(jié)點(diǎn)6.9.4ZooKeeper集群部署大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)①啟動(dòng)客戶端:②

顯示所有操作命令[root@masterapache-zookeeper-3.8.0-bin]$bin/zkCli.sh-servermaster:21816.9.4ZooKeeper集群部署大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)(2)znode數(shù)據(jù)信息。①查看當(dāng)前znode中所包含的內(nèi)容(ls):[zk:slave02:2181(CONNECTED)1]ls/[zookeeper][zk:localhost:2181(CONNECTED)2]ls-s/[zookeeper]cZxid=0x0ctime=ThuJan0108:00:00CST1970mZxid=0x0mtime=ThuJan0108:00:00CST1970pZxid=0x0cversion=-1dataVersion=0aclVersion=0ephemeralOwner=0x0dataLength=0numChildren=1②查看當(dāng)前znode中所包含的內(nèi)容(ls-s):6.9.4ZooKeeper集群部署大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)其中各個(gè)變量的含義如下。

cZxid:創(chuàng)建節(jié)點(diǎn)的事務(wù)zxid。每次修改ZooKeeper狀態(tài)都會(huì)產(chǎn)生一個(gè)ZooKeeper事務(wù)ID。事務(wù)ID是ZooKeeper中所有修改總的次序。

ctime:znode被創(chuàng)建的毫秒數(shù)(從1970年開始)。

mzxid:znode最后更新的事務(wù)zxid。

mtime:znode最后修改的毫秒數(shù)(從1970年開始)。

pZxid:znode最后更新的子節(jié)點(diǎn)zxid。

cversion:znode子節(jié)點(diǎn)的變化次數(shù)。

dataversion:znode數(shù)據(jù)變化號(hào)。

aclVersion:znode訪問控制列表的變化號(hào)。

ephemeralOwner:如果是臨時(shí)節(jié)點(diǎn),那么它是znode擁有者的sessionid;如果不是臨時(shí)節(jié)點(diǎn),則其值為0。

dataLength:znode的數(shù)據(jù)長(zhǎng)度。

numChildren:znode子節(jié)點(diǎn)數(shù)量。6.9.4ZooKeeper集群部署大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)(3)節(jié)點(diǎn)類型(持久/臨時(shí)/有序號(hào)/無序號(hào))。在命令行輸入創(chuàng)建節(jié)點(diǎn)的命令,具體命令格式如下:其中,-s表示是否開啟節(jié)點(diǎn)的序列化特性;-e表示開啟臨時(shí)節(jié)點(diǎn)特性,若不指定,則表示永久節(jié)點(diǎn);path表示創(chuàng)建的路徑;data表示創(chuàng)建節(jié)點(diǎn)的數(shù)據(jù),這是因?yàn)閦node可以像目錄一樣存在,也可以像文件一樣保存數(shù)據(jù);acl用來進(jìn)行權(quán)限控制。①分別創(chuàng)建兩個(gè)普通節(jié)點(diǎn)(永久節(jié)點(diǎn)+不帶序號(hào)):$create[-s][-e]pathdata.acl[zk:localhost:2181(CONNECTED)3]create/shuihu"shuihu"Created/shuihu[zk:localhost:2181(CONNECTED)4]create/shuihu/liangshan"liangshan"Created/shuihu/liangshan6.9.4ZooKeeper集群部署大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)②獲得節(jié)點(diǎn)的值:[zk:localhost:2181(CONNECTED)5]get-s/shuihushuihucZxid=0x900000002ctime=SatMar0416:58:55CST2023mZxid=0x900000002mtime=SatMar0416:58:55CST2023pZxid=0x900000003cversion=1dataVersion=0aclVersion=0ephemeralOwner=0x0dataLength=8numChildren=16.9.4ZooKeeper集群部署大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)[zk:localhost:2181(CONNECTED)6]get-s/shuihu/liangshanliangshancZxid=0x900000003ctime=SatMar0416:59:15CST2023mZxid=0x900000003mtime=SatMar0416:59:15CST2023pZxid=0x900000003cversion=0dataVersion=0aclVersion=0ephemeralOwner=0x0dataLength=9numChildren=06.9.4ZooKeeper集群部署大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)③創(chuàng)建帶序號(hào)的節(jié)點(diǎn)(永久節(jié)點(diǎn)+帶序號(hào)):先創(chuàng)建一個(gè)普通的根節(jié)點(diǎn)/shuihu/liangshan:創(chuàng)建帶序號(hào)的節(jié)點(diǎn):如果原來沒有序號(hào)節(jié)點(diǎn),則序號(hào)從0開始依次遞增;如果原節(jié)點(diǎn)下已有兩個(gè)節(jié)點(diǎn),則排序時(shí)從2開始,依次類推。[zk:localhost:2181(CONNECTED)1]create/shuihu/liangshan"liangshan"Created/shuihu/liangshan[zk:localhost:2181(CONNECTED)2]create-s/shuihu/liangshan/guansheng"guansheng"Created/shuihu/liangshan/guansheng0000000000[zk:localhost:2181(CONNECTED)3]create-s/shuihu/liangshan/chaijin"chaijin"Created/shuihu/liangshan/chaijin00000000016.9.4ZooKeeper集群部署大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)④創(chuàng)建短暫節(jié)點(diǎn)(短暫節(jié)點(diǎn)+不帶序號(hào)/帶序號(hào))。創(chuàng)建臨時(shí)的不帶序號(hào)的節(jié)點(diǎn):創(chuàng)建臨時(shí)的帶序號(hào)的節(jié)點(diǎn):在當(dāng)前客戶端能查看到的內(nèi)容如下:修改節(jié)點(diǎn)數(shù)據(jù)值:退出當(dāng)前客戶端后重啟:[zk:localhost:2181(CONNECTED)4]create-e/shuihu/liangshan/wuyong"wuyong"Created/shuihu/liangshan/wuyong[zk:localhost:2181(CONNECTED)6]ls/shuihu/liangshan[chaijin0000000001,guansheng0000000000,wuyong0000000002][zk:localhost:2181(CONNECTED)5]create-e-s/shuihu/liangshan/wuyong"wuyong"Created/shuihu/liangshan/wuyong0000000002[zk:localhost:2181(CONNECTED)7]set/shuihu/liangshan/wuyong0000000002"zhiduoxing"[zk:localhost:2181(CONNECTED)8]quit6.9.4ZooKeeper集群部署大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)(4)監(jiān)聽器原理。監(jiān)聽節(jié)點(diǎn)即監(jiān)聽節(jié)點(diǎn)的變化,當(dāng)節(jié)點(diǎn)發(fā)生變化(數(shù)據(jù)改變、節(jié)點(diǎn)刪除、子節(jié)點(diǎn)增加/刪除)時(shí),ZooKeeper會(huì)通知客戶端。監(jiān)聽原理可以概括為3個(gè)過程:客戶端向服務(wù)器注冊(cè)Watch、服務(wù)器事件發(fā)生觸發(fā)Watch、客戶端回調(diào)Watch得到觸發(fā)事件的情況。監(jiān)聽機(jī)制保證ZooKeeper保存的任何數(shù)據(jù)的任何改變都能快速的響應(yīng)到監(jiān)聽該節(jié)點(diǎn)的應(yīng)用程序。①節(jié)點(diǎn)的值變化監(jiān)聽。在slave02客戶端上注冊(cè)Watch,以監(jiān)聽/shuihu節(jié)點(diǎn)數(shù)據(jù)變化:在slave01客戶端上修改/shuihu節(jié)點(diǎn)的數(shù)據(jù):[zk:localhost:2181(CONNECTED)0]get-w/shuihu[zk:localhost:2181(CONNECTED)0]set/shuihu"mingzhu"6.9.4ZooKeeper集群部署大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)觀察slave02客戶端收到數(shù)據(jù)變化的監(jiān)聽:注意:在slave01客戶端上再多次修改/shuihu的值時(shí),slave02客戶端不會(huì)再收到監(jiān)聽。因?yàn)樽?cè)一次,只能監(jiān)聽一次。若想再次監(jiān)聽,則需要再次注冊(cè)。②節(jié)點(diǎn)的子節(jié)點(diǎn)變化監(jiān)聽(路徑變化)。在slave02客戶端上注冊(cè)Watch,以監(jiān)聽/shuihu節(jié)點(diǎn)的子節(jié)點(diǎn)變化:[zk:localhost:2181(CONNECTED)1]WATCHER::WatchedEventstate:SyncConnectedtype:NodeDataChangedpath:/shuihu[zk:localhost:2181(CONNECTED)1]ls-w/shuihu[liangshan]6.9.4ZooKeeper集群部署大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)在slave01客戶端/shuihu節(jié)點(diǎn)上創(chuàng)建子節(jié)點(diǎn):觀察slave02客戶端收到子節(jié)點(diǎn)變化的監(jiān)聽:注意:節(jié)點(diǎn)的路徑變化也是

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論