Zookeeper——入門介紹(相關(guān)原理、安裝啟動(dòng)及使用操作)

關(guān)注wx:CodingTechWork,一起學(xué)習(xí)進(jìn)步。

引言

??對zk的學(xué)習(xí)和簡單實(shí)用進(jìn)行一個(gè)總結(jié)。

zk介紹

zk概述

  1. zk是一個(gè)具有高可用性的高性能協(xié)調(diào)服務(wù)。
  2. zk的watcher對象有兩個(gè)作用:一方面是用于獲得zk狀態(tài)變化的通知;另一方面是用于獲得znode變化的相關(guān)通知。

zk特點(diǎn)

  1. zk是簡單的,核心是一個(gè)精簡的文件系統(tǒng),提供諸如排序和通知等簡單的操作和額外的抽象操作。
  2. zk是富有表現(xiàn)力的,zk的基本操作是一組豐富的構(gòu)件,可用于實(shí)現(xiàn)多種協(xié)調(diào)數(shù)據(jù)結(jié)構(gòu)和協(xié)議,如分布式隊(duì)列、分布式鎖和一組節(jié)點(diǎn)的“領(lǐng)導(dǎo)者選舉”。
  3. zk具有高可用性,可以幫助系統(tǒng)避免出現(xiàn)單點(diǎn)故障,從而構(gòu)件一個(gè)可靠的應(yīng)用程序。
  4. zk采用松耦合交互方式,交互過程中,參與者可不需要彼此了解,如zk可被用于實(shí)現(xiàn)“數(shù)據(jù)匯集”機(jī)制,讓進(jìn)程在不了解其他進(jìn)程(或網(wǎng)絡(luò))情況下能夠彼此發(fā)現(xiàn)并進(jìn)行信息交互。一個(gè)進(jìn)程可以在zk中留下一條消息后關(guān)閉,另外一個(gè)進(jìn)程還可以繼續(xù)讀取這條消息。
  5. zk是一個(gè)資源庫,提供一個(gè)通用協(xié)調(diào)模式實(shí)現(xiàn)方法的開源共享庫。
  6. zk是高性能的,基準(zhǔn)吞吐量超過每秒10000個(gè)操作。

zk數(shù)據(jù)模型

數(shù)據(jù)模型特點(diǎn)

  1. 樹形節(jié)點(diǎn):zk維護(hù)一個(gè)樹形層次結(jié)構(gòu),樹中的節(jié)點(diǎn)被稱為znode。znode可以用于存儲數(shù)據(jù),并且有一個(gè)與之相關(guān)聯(lián)的ACL。
  2. 小數(shù)據(jù)存儲:zk被設(shè)計(jì)用來實(shí)現(xiàn)協(xié)調(diào)服務(wù),通常使用小數(shù)據(jù)文件,而不是用于大容量數(shù)據(jù)存儲,一個(gè)znode能存儲的數(shù)據(jù)被限制在1MB以內(nèi)。
  3. 原子性數(shù)據(jù)訪問:zk的數(shù)據(jù)訪問具有原子性??蛻舳俗x取一個(gè)znode的數(shù)據(jù)時(shí),要么讀到所有數(shù)據(jù),要么讀操作全部失?。ú粫嬖谧x取部分?jǐn)?shù)據(jù)這種狀態(tài))。同樣,寫操作也是一樣,要么全部調(diào)換znode存儲數(shù)據(jù),要么寫不成功而失敗,不會出現(xiàn)部分寫現(xiàn)象。
  4. 路徑引用:znode通過路徑被引用,路徑用斜杠分割的Unicode字符串,路徑必須是絕對路徑,每條路徑從一個(gè)斜杠字符開始。路徑引用中不包含“.”這種不合法表示,不支持路徑解析。hadoop是通過URI,如hdfs://ns1/user/userA
  5. "zookeeper"字符串是一個(gè)保留詞,不能作為路徑表示中的一部分。zk中使用/zookeeper子樹保存管理信息。

znode

znode概念

  1. zk可以看作是一個(gè)具有高可用性特征的文件系統(tǒng),沒有文件和目錄,而是使用“節(jié)點(diǎn)”概念,稱為znode,znode既可以作為保存數(shù)據(jù)的容器(類似于文件),也可以作為保存其他znode的容器(類似于目錄)
  2. 所有znode構(gòu)成一個(gè)層次化的命名空間,創(chuàng)建一個(gè)以組名為節(jié)點(diǎn)名的znode作為父節(jié)點(diǎn),然后以組成員名(服務(wù)器名)為節(jié)點(diǎn)名來創(chuàng)建作為子節(jié)點(diǎn)的znode。


    znode介紹

znode分類

??znode分為短暫和持久兩種大類型。類型在創(chuàng)建時(shí)被確定且后面不能再修改。


znode分類

短暫znode

  1. 在創(chuàng)建短暫znode的客戶端會話結(jié)束時(shí),zk會將該短暫的znode刪除。在創(chuàng)建持久znode時(shí),不依賴于客戶端會話,只有客戶端明確要?jiǎng)h除znode時(shí),才會被刪除。
  2. 短暫znode不可以有子節(jié)點(diǎn)。
  3. 短暫znode都會被板頂?shù)揭粋€(gè)客戶端會話,但對所有客戶端可見。
  4. 短暫znode應(yīng)用:使用短暫znode來實(shí)現(xiàn)一個(gè)組成員管理服務(wù),讓任何進(jìn)程都知道在特定的時(shí)刻有哪些組成員可用。

順序znode

  1. 順序znode是指名稱中包含zk指定順序號的znode,若在創(chuàng)建znode時(shí)設(shè)置了順序標(biāo)識,則該znode名稱之后會附加一個(gè)值,這個(gè)值是由一個(gè)單調(diào)遞增的計(jì)數(shù)器(由父節(jié)點(diǎn)維護(hù))所添加的。

觀察機(jī)制

  1. 觀察機(jī)制通知客戶端znode的變化。
  2. 可以針對zk服務(wù)的操作設(shè)置觀察,如客戶端A可以對一個(gè)znode調(diào)用exists操作,設(shè)定一個(gè)觀察,若znode不存在,客戶端A調(diào)用exists操作返回false。過段時(shí)間后,若另外一個(gè)客戶端B創(chuàng)建了這個(gè)znode,觀察被觸發(fā),通知前一個(gè)客戶端A這個(gè)znode被創(chuàng)建。
  3. 觀察只能被觸發(fā)一次,若想多次收到觀察通知,客戶端需要重注冊所需要的觀察。

zk實(shí)現(xiàn)

zk運(yùn)行模式分類

  1. 獨(dú)立模式:只有一個(gè)zk服務(wù)器,簡單,適合測試環(huán)境,不能保證高可用性和可恢復(fù)性。
  2. 復(fù)制模式奇數(shù)個(gè)服務(wù)器,運(yùn)行一個(gè)計(jì)算機(jī)集群上,這個(gè)計(jì)算機(jī)集群被稱為一個(gè)集合體,zk通過復(fù)制來實(shí)現(xiàn)高可用性,只要集合體中半數(shù)以上的機(jī)器處于可用狀態(tài),就能夠提供服務(wù)。對znode樹的每一個(gè)修改都會被復(fù)制到集合體中超過半數(shù)的機(jī)器上。

zk服務(wù)器為何是奇數(shù)個(gè)?

??因?yàn)閦k生產(chǎn)環(huán)境一般是使用復(fù)制模式,即集合體中半數(shù)以上的機(jī)器處于可用狀態(tài),zk就可以繼續(xù)提供服務(wù),比如在一個(gè)有5個(gè)節(jié)點(diǎn)的集合體中,任意2臺機(jī)器故障,都可以保證服務(wù)繼續(xù)。而在6個(gè)節(jié)點(diǎn)的集合體里,只能夠容忍2臺機(jī)器出現(xiàn)故障,如果出現(xiàn)3臺機(jī)器,剩下3臺機(jī)器沒有超過集合體的半數(shù),無法判斷是否可用。

zk實(shí)現(xiàn)原理

??zk使用了Zab協(xié)議,經(jīng)歷領(lǐng)導(dǎo)者選舉原子廣播兩個(gè)循環(huán)重復(fù)的階段。

  1. 領(lǐng)導(dǎo)者選舉:集合體中的所有機(jī)器通過一個(gè)選擇過程選出一臺被稱為領(lǐng)導(dǎo)者(leader)的機(jī)器,其他機(jī)器稱為跟隨者(follower),一旦半數(shù)以上的跟隨者將其狀態(tài)與領(lǐng)導(dǎo)者同步了,則表明該階段完成。
  2. 原子廣播:所有的寫請求都會被轉(zhuǎn)發(fā)給領(lǐng)導(dǎo)者,再由領(lǐng)導(dǎo)者更新廣播給跟隨者,當(dāng)半數(shù)以上的跟隨者已經(jīng)將修改持久化后,領(lǐng)導(dǎo)者才會提交這個(gè)更新,客戶端會收到一個(gè)更新成功的響應(yīng)。

如果領(lǐng)導(dǎo)者機(jī)器出現(xiàn)故障,則剩余機(jī)器會選出一個(gè)新的領(lǐng)導(dǎo)者機(jī)器。若舊領(lǐng)導(dǎo)者恢復(fù)正常,會變成一個(gè)跟隨者。一般選舉只需要200毫秒

zk數(shù)據(jù)一致性

客戶端連接到哪一臺機(jī)器?

跟隨者負(fù)責(zé)響應(yīng)讀請求,領(lǐng)導(dǎo)者負(fù)責(zé)提交寫請求

??一個(gè)跟隨者有可能滯后于領(lǐng)導(dǎo)者幾個(gè)更新,而每個(gè)客戶端都有可能被連接到領(lǐng)導(dǎo)者,但客戶端對此無法控制,無法知道自己是否連接到領(lǐng)導(dǎo)者機(jī)器。所以客戶端最好是全部連接到領(lǐng)導(dǎo)者機(jī)器,若實(shí)現(xiàn)不了,最好不要連接到領(lǐng)導(dǎo)者機(jī)器。對zk進(jìn)行配置,使得領(lǐng)導(dǎo)者不接受任何客戶端連接,領(lǐng)導(dǎo)者任務(wù)就變成了協(xié)調(diào)更新,可以將leaderServes屬性設(shè)置為no來實(shí)現(xiàn),推薦操作3臺服務(wù)器的集群中使用該配置。

zxid

  1. 每一個(gè)對znode樹的更新都被賦予一個(gè)全局唯一的ID,即為zxid(ZooKeeper Transaction ID)。
  2. zk要求對所有的更新進(jìn)行編號排序,決定了分布式系統(tǒng)的執(zhí)行順序。

數(shù)據(jù)一致性的保證

  1. 順序一致性:來自任意特定客戶端的更新都會按照其發(fā)送順序被提交。如znode a值改為b,然后b值改為c,則其他所有客戶端看到c后,都不會看到b值。(如果沒有客戶端對a值更新)執(zhí)行是有順序的。
  2. 原子性:每個(gè)更新要么成功,要么失敗。若一個(gè)更新失敗,不會有客戶端看到這個(gè)更新的結(jié)果。
  3. 單一系統(tǒng)映像:一個(gè)客戶端無論連哪臺機(jī)器,都看到同樣的系統(tǒng)視圖。若一個(gè)客戶端在同一個(gè)會話中連接到一臺新服務(wù)器,所看到的系統(tǒng)狀態(tài)不會比上一個(gè)服務(wù)器上所看到的更老。若一臺服務(wù)器A出現(xiàn)故障,它的客戶端嘗試連接其他服務(wù)器時(shí),所有狀態(tài)滯后于服務(wù)器A的都不會接受該連接請求,而是去連接狀態(tài)超前或同于服務(wù)器A的機(jī)器。
  4. 持久性:一個(gè)更新一旦成功,其結(jié)果就會持久存在且不會被撤銷,所以更新操作不會受到服務(wù)器故障的影響。
  5. 及時(shí)性:任何客戶端的滯后性有限,一般是不超過幾十秒。由于性能要求,所有的讀操作都是從zk服務(wù)器的內(nèi)存中讀數(shù)據(jù),不參與寫操作的全局排序。

ZK會話

會話介紹

  1. 每個(gè)zk客戶端的配置中都包含集合體服務(wù)器列表,在啟動(dòng)時(shí),客戶端會嘗試連接列表中的一臺服務(wù)器,若連接失敗,會嘗試連接列表中其他服務(wù)器,一直練到成功或者全部連不上而失敗。
  2. 客戶端一旦和zk服務(wù)器建立連接,這臺服務(wù)器就會為該客戶端創(chuàng)建一個(gè)新的會話,每個(gè)會話都有一個(gè)超時(shí)時(shí)間的設(shè)置,由創(chuàng)建會話的應(yīng)用來設(shè)定。若服務(wù)器在超時(shí)時(shí)間內(nèi)沒有收到任何請求,相應(yīng)的會話會過期。一旦過期,則無法重新打開。
  3. 一個(gè)會話空閑超過一段時(shí)間,可以通過客戶端發(fā)送ping請求來保持會話不過期(ping請求由zk的客戶端庫自動(dòng)發(fā)送),這個(gè)時(shí)間足夠低,監(jiān)測出服務(wù)器故障,zk客戶端會自動(dòng)進(jìn)行故障切換,切換到另一臺服務(wù)器,會話有效。切換過程中的客戶端其他操作會失敗。

時(shí)間

  1. “滴答時(shí)間”:tick time定義了zk的基本時(shí)間周期,被集合體的服務(wù)器用來定義相互交互的時(shí)間表。
  2. 會話超時(shí)值設(shè)置基于滴答時(shí)間,大于等于2個(gè)滴答時(shí)間,小于等于20個(gè)滴答時(shí)間。如通常滴答參數(shù)設(shè)為2秒(2000毫秒),則會話超時(shí)時(shí)間為4-40秒。
  3. 會話超時(shí)時(shí)間若設(shè)置太短,會較快監(jiān)測到機(jī)器故障,但是要避免設(shè)置太低,繁忙的網(wǎng)絡(luò)會導(dǎo)致數(shù)據(jù)包傳輸延遲,導(dǎo)致會話過期,機(jī)器會出現(xiàn)“振動(dòng)(flap)”現(xiàn)象,即在很短的時(shí)間內(nèi)反復(fù)出現(xiàn)離開后又重新加入組的情況。
  4. 會話超時(shí)時(shí)間設(shè)置大一點(diǎn)時(shí),適用于重建會話代價(jià)較大的應(yīng)用程序客戶端,比如對應(yīng)用進(jìn)行維護(hù)或升級時(shí),超時(shí)時(shí)間大,重啟應(yīng)用程序,也可以避免會話過期(重啟時(shí),未檢測會話是否過期,避免過期),服務(wù)器會為每個(gè)會話分配一個(gè)唯一的ID和密碼,建立連接過程中傳遞給zk,可以用于恢復(fù)一個(gè)會話。
  5. 一般zk的集合體服務(wù)器越多,會話超時(shí)的設(shè)置越大??墒褂胘mx監(jiān)控zk度量指標(biāo),頻繁遇到丟連接時(shí),要考慮增大超時(shí)的設(shè)置。

狀態(tài)

zk會話狀態(tài)

zk對象在生命周期中可以通過getState()方法查詢對象的狀態(tài),返回值States是zk對象不同狀態(tài)的枚舉類型值。

  1. 建立連接過程中,zk實(shí)例處于CONNECTING狀態(tài),建立連接完成后,進(jìn)入CONNECTED狀態(tài)。通過注冊觀察對象,進(jìn)入CONNECTED后,觀察對象會收到一個(gè)WatchedEvent通知,KeeperState值為SyncConnected
  2. zk實(shí)例在斷開然后重連zk服務(wù),狀態(tài)就會在CONNECTED和CONNECTING之間轉(zhuǎn)換。若斷開連接會收到一個(gè)Disconnected事件。(重連是zk自動(dòng)發(fā)起)
  3. 若調(diào)用close()方法或者出現(xiàn)會話超時(shí)(觀察事件KeeperState的值為Expired時(shí)),zk實(shí)例會轉(zhuǎn)換到第三個(gè)狀態(tài)CLOSED。zk對象不再被認(rèn)為是活躍的(通過State使用isAlive()方法判斷),且不能再用。

zk應(yīng)用

配置服務(wù)

??配置服務(wù)是分布式應(yīng)用中的基本服務(wù)之一,使集群中的機(jī)器可以共享配置信息中公共部分。zk可以作為一個(gè)具有高可用性的配置存儲器,允許分布式應(yīng)用的參與者檢索和更新配置文件。

  1. 存儲的配置數(shù)據(jù)是字符串,關(guān)鍵字是znode路徑,每個(gè)znode上存儲了一個(gè)鍵值對;
  2. 在任何時(shí)刻只有一個(gè)客戶端執(zhí)行更新操作,其他客戶端負(fù)責(zé)觀察。

鎖服務(wù)

??分布式鎖能夠在一組進(jìn)程之間提供互斥機(jī)制,使任何時(shí)刻只有一個(gè)進(jìn)程可以持有鎖??梢杂糜谠诖笮头植际较到y(tǒng)中實(shí)現(xiàn)領(lǐng)導(dǎo)者選舉,在任何時(shí)間點(diǎn),持有鎖的那個(gè)進(jìn)程就是系統(tǒng)的領(lǐng)導(dǎo)者。(不同于zk自身的領(lǐng)導(dǎo)者選舉)

實(shí)現(xiàn)原理

使用順序znode來為競爭鎖的進(jìn)程強(qiáng)制排序,zk是順序的仲裁者,負(fù)責(zé)分配順序號。

  1. 首先制定一個(gè)作為鎖的znode,通常用它來描述被鎖定的實(shí)體,稱為/leader。
  2. 然后希望獲得鎖的客戶端創(chuàng)建一些短暫順序znode,作為鎖znode的子節(jié)點(diǎn)。在任何時(shí)間點(diǎn),順序號最小的客戶端持有鎖。如2個(gè)客戶端幾乎同時(shí)創(chuàng)建znode,為/leader/lock-1和/leader/lock-2,則創(chuàng)建/leader/lock-1的客戶端持有鎖。若刪除znode /leader/lock-1,則釋放鎖,創(chuàng)建/leader/lock-2的客戶端會持有鎖。

zk安裝

安裝流程

  1. 下載
    進(jìn)入官網(wǎng):https://zookeeper.apache.org/,點(diǎn)擊【Project】—>【Releases】尋找合適的版本。
  2. 解壓
tar xzf zookeeper-x.y.z.tar.gz
  1. 加入命令行路徑
export ZOOKEEPER_HOME=~/sw/zookeeper-x.y.z
export PATH=$PATH:%ZOOKEEPER_HOME/bin
  1. 配置文件(主要)
配置 說明
zoo.cfg 一般放在conf子目錄或者/etc/zookeeper子目錄中,若設(shè)置環(huán)境變量ZOOCFGDIR,可以保存在該環(huán)境變量所指定的目錄
tickTime=2000 指定zk基本事件單元(毫秒)
dataDir=/Users/tom/zookeeper dataDir指定zk存儲持久數(shù)據(jù)的本地系統(tǒng)位置
clientPort=2181 指定zk用于監(jiān)聽客戶端連接的端口
  1. 啟動(dòng)
zkServer.sh start

zk配置服務(wù)器ID

  1. zk服務(wù)器的集合體中,每個(gè)服務(wù)器都有一個(gè)數(shù)值型的ID,服務(wù)器ID在集合體中唯一,取值為1~255,通過一個(gè)名為myid的純文本文件設(shè)定服務(wù)器的ID,保存在dataDir參數(shù)所指定的目錄中。


    zk配置服務(wù)器id
  2. 為每臺服務(wù)器設(shè)置ID,還需要將集合體中其他服務(wù)器ID和網(wǎng)絡(luò)位置告訴所有服務(wù)器,通過以下方式設(shè)置:
    server.n=hostname:port:port
    其中,n是服務(wù)器的ID,第一個(gè)端口是跟隨者用來連接領(lǐng)導(dǎo)者的端口,第二個(gè)端口用于領(lǐng)導(dǎo)者選舉。舉例:
    示例

    a)服務(wù)器在3個(gè)端口上進(jìn)行監(jiān)聽:2888端口用于客戶端連接;
    b)對于領(lǐng)導(dǎo)者而言,2888端口被用于跟隨者連接;
    c)3888端口被用于領(lǐng)導(dǎo)者選舉階段的其他服務(wù)器連接。
  3. 流程:當(dāng)一個(gè)zk服務(wù)器啟動(dòng)時(shí),它讀取myid文件用于確定自己服務(wù)器ID;然后,通過讀取配置文件來確定應(yīng)當(dāng)在哪個(gè)端口進(jìn)行監(jiān)聽;同時(shí),確定集合體中其他服務(wù)器的網(wǎng)絡(luò)地址。在客戶端中,其實(shí)就是通過zookeeper1:2181、zookeeper2:2181和zookeeper3:2181作為主機(jī)字符串。

zk配置時(shí)間參數(shù)

zk時(shí)間配置

initLimit和syncLimit參數(shù)是強(qiáng)制的,都是以滴答參數(shù)(tickTime)的倍數(shù)進(jìn)行度量。

  1. initLimit參數(shù):設(shè)定所有跟隨者與領(lǐng)導(dǎo)者進(jìn)行連接并同步的時(shí)間范圍。在設(shè)定的時(shí)間段內(nèi),半數(shù)以上的跟隨者若未能完成同步,領(lǐng)導(dǎo)者便會放棄領(lǐng)導(dǎo)地位,進(jìn)行另外一個(gè)領(lǐng)導(dǎo)者的選舉。若經(jīng)常發(fā)生這種情況,需要調(diào)大參數(shù)值。
  2. syncLimit參數(shù):設(shè)定允許一個(gè)跟隨者與領(lǐng)導(dǎo)者進(jìn)行同步的時(shí)間。在設(shè)定的時(shí)間段內(nèi),一個(gè)跟隨者未能完成同步,會自己重啟。所有關(guān)聯(lián)到跟隨者的客戶端則會連接到另外一個(gè)跟隨者

zk操作

服務(wù)操作

操作 描述
create 創(chuàng)建一個(gè)znode(必須要有父節(jié)點(diǎn))
delete 刪除一個(gè)znode(不能有任何子節(jié)點(diǎn))
exists 測試一個(gè)znode存在與否并且查詢它的元數(shù)據(jù)
getACL、setACL 獲取/設(shè)置一個(gè)znode的ACL
getChildren 獲取一個(gè)znode的子節(jié)點(diǎn)列表
getData、setData 獲取/設(shè)置一個(gè)znode所保存的數(shù)據(jù)
sync 將客戶端的znode視圖與zk同步

觀察事件類型

觀察及其觸發(fā)操作所所對應(yīng)的事件類型

查看zk的連接數(shù)

  1. 查看zk的連接數(shù)的幾種命令
netstat -na | grep 2181 | wc -l
netstat -an | grep -I 2181
echo stat | nc localhost 2181
  1. 查看最大連接數(shù)配置
echo conf | nc localhost 2181 | grep "max"
查看最大連接數(shù)配置

查看znode節(jié)點(diǎn)列表

  1. 查看命令行幫助
./zkCli.sh -server localhost ls 
  1. 查看所有組
./zkCli.sh -server localhost ls /
zk查看所有組
  1. 查看具體組
./zkCli.sh -server localhost ls /brokers
zk查看具體組

常用操作命令

操作 描述
get path [watch] 1. 獲取指定節(jié)點(diǎn)信息(包括數(shù)據(jù)內(nèi)容和節(jié)點(diǎn)狀態(tài)信息);
2. 節(jié)點(diǎn)路徑必須以/開頭;
3. watch為可選參數(shù),表示是否注冊監(jiān)聽,若添加該參數(shù),則其他客戶端修改節(jié)點(diǎn)數(shù)據(jù)后,當(dāng)前客戶端可收到數(shù)據(jù)變更通知;
4. 示例:get /znodeget /znode watch
stat path [watch] 用于查看節(jié)點(diǎn)狀態(tài)信息,與get命令類似。如stat /
set path data [version] 對指定znode添加內(nèi)容,version表示可以指定的dataVersion
ls path [watch] 獲取當(dāng)前路徑下的子節(jié)點(diǎn)列表(僅僅包含下一級子節(jié)點(diǎn))
ls2 path [watch] ls的增強(qiáng)版,獲取當(dāng)前路徑下的子節(jié)點(diǎn)列表(僅僅包含下一級子節(jié)點(diǎn))以及當(dāng)前節(jié)點(diǎn)下的狀態(tài)信息
delete path [version] 刪除指定節(jié)點(diǎn),當(dāng)指定節(jié)點(diǎn)下有子節(jié)點(diǎn)時(shí),該節(jié)點(diǎn)無法刪除
rmr path 增強(qiáng)版delete,可以遞歸刪除指定節(jié)點(diǎn)
create [-s] [-e] path data acl 創(chuàng)建節(jié)點(diǎn),-s表示順序節(jié)點(diǎn),-e表示臨時(shí)節(jié)點(diǎn),acl表示設(shè)置權(quán)限控制
sync path 強(qiáng)制同步,由于請求在半數(shù)以上的服務(wù)器上生效就表示此請求生效,name就會有一些服務(wù)器數(shù)據(jù)是舊的,sync可以強(qiáng)制這些服務(wù)器同步更新操作
setAcl path acl 設(shè)置節(jié)點(diǎn)acl,格式為:scheme:id:permissions
getAcl path 獲取節(jié)點(diǎn)acl信息,如getAcl /node1
listquota path 顯示節(jié)點(diǎn)配額
setquota [-n val1 -b val2] path 設(shè)置節(jié)點(diǎn)個(gè)數(shù)及數(shù)據(jù)長度的配額,-n為子節(jié)點(diǎn)個(gè)數(shù),-b為節(jié)點(diǎn)數(shù)據(jù)長度
delquota [-n -b] path 刪除配額,-n為子節(jié)點(diǎn)個(gè)數(shù),-b為節(jié)點(diǎn)數(shù)據(jù)長度

zk端口監(jiān)聽命令

zk四字母組合命令

zk命令

使用示例

監(jiān)聽端口:使用ruok,代表Are you OK?
echo ruok | nc localhost 2181
返回結(jié)果為imok,代表I'm OK


ruok

zk的ACL

ACL介紹

  1. 每個(gè)znode創(chuàng)建時(shí)都會帶有一個(gè)ACL列表,其用于決定誰可以對該znode擁有哪些執(zhí)行權(quán)限。
    a)zk的權(quán)限控制是基于每個(gè)znode的,需要對每個(gè)znode進(jìn)行權(quán)限設(shè)置;
    b)每個(gè)znode支持多種權(quán)限設(shè)置;
    c)子節(jié)點(diǎn)不會繼承父節(jié)點(diǎn)的權(quán)限,客戶端有可能無權(quán)訪問父節(jié)點(diǎn),但是可能可以訪問它的子節(jié)點(diǎn)。
  2. ACL依賴于zk的客戶端身份驗(yàn)證機(jī)制:
    a)digest:通過用戶名和密碼識別客戶端;
    b) sals: 通過kerberos認(rèn)證來識別客戶端;(klist -ktkinit -kt
    c)ip: 通過客戶端的ip來識別客戶端;
  3. ACL權(quán)限控制,可使用scheme:id:permission來識別:
    a)權(quán)限模式(scheme):鑒權(quán)策略;
    b)授權(quán)對象(id)
    c)權(quán)限(permission)

ACL詳解

  1. scheme:zk內(nèi)置一些權(quán)限控制方案,可以用以下方案對每個(gè)znode進(jìn)行權(quán)限設(shè)置。
方案 說明
world 只有一個(gè)用戶:anyone,代表所有人。(默認(rèn)權(quán)限)
ip 使用ip地址認(rèn)證
auth 使用已添加認(rèn)證的用戶認(rèn)證
digest 使用用戶名:密碼方式認(rèn)證
  1. id:授權(quán)對象id是指權(quán)限賦予的用戶或者實(shí)體,如ip地址或者機(jī)器,授權(quán)模式schemoa與授權(quán)對象id的關(guān)系如下:
權(quán)限模式 授權(quán)對象
ip 通常是一個(gè)ip地址或者ip段,如"192.168.0.10"或"192.168.0.1/24"
digest 自定義,通常是“username:BASE64(SHA-1(username:password))”,如“userA:jfCYslg7DFSjtoeFAdfs7FD=”
world 只有一個(gè)id:anyone
super 與digest模式一致
  1. 權(quán)限permission
權(quán)限 ACL簡寫 說明
CREATE c 可以創(chuàng)建子節(jié)點(diǎn),create
DELETE d 可以刪除子節(jié)點(diǎn)(僅僅是下一級節(jié)點(diǎn)),delete
READ r 可以讀取節(jié)點(diǎn)數(shù)據(jù)及顯示子節(jié)點(diǎn)列表,getChildren、getData
WRITE w 可以設(shè)置節(jié)點(diǎn)數(shù)據(jù),setData
ADMIN a 可以設(shè)置節(jié)點(diǎn)訪問控制權(quán)限列表,setACL
命令 使用方式 描述
getAcl getAcl <path> 讀取ACL權(quán)限
setAcl setAcl <path> <acl> 設(shè)置ACL權(quán)限
addauth addauth <scheme> <auth> 設(shè)置認(rèn)證

refer by >
官網(wǎng):https://zookeeper.apache.org
《Hadoop權(quán)威指南-第四版》

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容