關(guān)注wx:CodingTechWork,一起學(xué)習(xí)進(jìn)步。
引言
??對zk的學(xué)習(xí)和簡單實(shí)用進(jìn)行一個(gè)總結(jié)。
zk介紹
zk概述
- zk是一個(gè)具有高可用性的高性能協(xié)調(diào)服務(wù)。
- zk的watcher對象有兩個(gè)作用:一方面是用于獲得zk狀態(tài)變化的通知;另一方面是用于獲得znode變化的相關(guān)通知。
zk特點(diǎn)
- zk是簡單的,核心是一個(gè)精簡的文件系統(tǒng),提供諸如排序和通知等簡單的操作和額外的抽象操作。
- 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)者選舉”。
- zk具有高可用性,可以幫助系統(tǒng)避免出現(xiàn)單點(diǎn)故障,從而構(gòu)件一個(gè)可靠的應(yīng)用程序。
- 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ù)讀取這條消息。
- zk是一個(gè)資源庫,提供一個(gè)通用協(xié)調(diào)模式實(shí)現(xiàn)方法的開源共享庫。
- zk是高性能的,基準(zhǔn)吞吐量超過每秒10000個(gè)操作。
zk數(shù)據(jù)模型
數(shù)據(jù)模型特點(diǎn)
-
樹形節(jié)點(diǎn):zk維護(hù)一個(gè)
樹形層次結(jié)構(gòu),樹中的節(jié)點(diǎn)被稱為znode。znode可以用于存儲數(shù)據(jù),并且有一個(gè)與之相關(guān)聯(lián)的ACL。 -
小數(shù)據(jù)存儲:zk被設(shè)計(jì)用來實(shí)現(xiàn)協(xié)調(diào)服務(wù),通常使用小數(shù)據(jù)文件,而不是用于大容量數(shù)據(jù)存儲,一個(gè)znode能存儲的數(shù)據(jù)被限制在
1MB以內(nèi)。 -
原子性數(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)象。 -
路徑引用:znode通過路徑被引用,路徑用斜杠分割的Unicode字符串,
路徑必須是絕對路徑,每條路徑從一個(gè)斜杠字符開始。路徑引用中不包含“.”這種不合法表示,不支持路徑解析。hadoop是通過URI,如hdfs://ns1/user/userA - "zookeeper"字符串是一個(gè)
保留詞,不能作為路徑表示中的一部分。zk中使用/zookeeper子樹保存管理信息。
znode
znode概念
- zk可以看作是一個(gè)具有高可用性特征的文件系統(tǒng),沒有文件和目錄,而是使用“節(jié)點(diǎn)”概念,稱為znode,znode既可以作為保存數(shù)據(jù)的容器(類似于文件),也可以作為保存其他znode的容器(類似于目錄)
-
所有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
- 在創(chuàng)建短暫znode的客戶端會話結(jié)束時(shí),zk會將該短暫的znode刪除。在創(chuàng)建持久znode時(shí),不依賴于客戶端會話,只有客戶端明確要?jiǎng)h除znode時(shí),才會被刪除。
- 短暫znode不可以有子節(jié)點(diǎn)。
- 短暫znode都會被板頂?shù)揭粋€(gè)客戶端會話,但對所有客戶端可見。
- 短暫znode應(yīng)用:使用短暫znode來實(shí)現(xiàn)一個(gè)組成員管理服務(wù),讓任何進(jìn)程都知道在特定的時(shí)刻有哪些組成員可用。
順序znode
- 順序znode是指名稱中包含zk指定順序號的znode,若在創(chuàng)建znode時(shí)設(shè)置了順序標(biāo)識,則該znode名稱之后會附加一個(gè)值,這個(gè)值是由一個(gè)單調(diào)遞增的計(jì)數(shù)器(由父節(jié)點(diǎn)維護(hù))所添加的。
觀察機(jī)制
- 觀察機(jī)制通知客戶端znode的變化。
- 可以針對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)建。
- 觀察只能被觸發(fā)一次,若想多次收到觀察通知,客戶端需要重注冊所需要的觀察。
zk實(shí)現(xiàn)
zk運(yùn)行模式分類
- 獨(dú)立模式:只有一個(gè)zk服務(wù)器,簡單,適合測試環(huán)境,不能保證高可用性和可恢復(fù)性。
-
復(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ù)的階段。
-
領(lǐng)導(dǎo)者選舉:集合體中的所有機(jī)器通過一個(gè)選擇過程選出一臺被稱為
領(lǐng)導(dǎo)者(leader)的機(jī)器,其他機(jī)器稱為跟隨者(follower),一旦半數(shù)以上的跟隨者將其狀態(tài)與領(lǐng)導(dǎo)者同步了,則表明該階段完成。 - 原子廣播:所有的寫請求都會被轉(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ī)器?
??一個(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
- 每一個(gè)對znode樹的更新都被賦予一個(gè)全局唯一的ID,即為
zxid(ZooKeeper Transaction ID)。 - zk要求對所有的更新進(jìn)行編號排序,決定了分布式系統(tǒng)的執(zhí)行順序。
數(shù)據(jù)一致性的保證
- 順序一致性:來自任意特定客戶端的更新都會按照其發(fā)送順序被提交。如znode a值改為b,然后b值改為c,則其他所有客戶端看到c后,都不會看到b值。(如果沒有客戶端對a值更新)執(zhí)行是有順序的。
- 原子性:每個(gè)更新要么成功,要么失敗。若一個(gè)更新失敗,不會有客戶端看到這個(gè)更新的結(jié)果。
- 單一系統(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ī)器。
- 持久性:一個(gè)更新一旦成功,其結(jié)果就會持久存在且不會被撤銷,所以更新操作不會受到服務(wù)器故障的影響。
- 及時(shí)性:任何客戶端的滯后性有限,一般是不超過幾十秒。由于性能要求,所有的讀操作都是從zk服務(wù)器的內(nèi)存中讀數(shù)據(jù),不參與寫操作的全局排序。
ZK會話
會話介紹
- 每個(gè)zk客戶端的配置中都包含集合體服務(wù)器列表,在啟動(dòng)時(shí),客戶端會嘗試連接列表中的一臺服務(wù)器,若連接失敗,會嘗試連接列表中其他服務(wù)器,一直練到成功或者全部連不上而失敗。
- 客戶端一旦和zk服務(wù)器建立連接,這臺服務(wù)器就會為該客戶端創(chuàng)建一個(gè)新的會話,每個(gè)會話都有一個(gè)超時(shí)時(shí)間的設(shè)置,由創(chuàng)建會話的應(yīng)用來設(shè)定。若服務(wù)器在超時(shí)時(shí)間內(nèi)沒有收到任何請求,相應(yīng)的會話會過期。一旦過期,則無法重新打開。
- 一個(gè)會話空閑超過一段時(shí)間,可以通過客戶端發(fā)送ping請求來保持會話不過期(ping請求由zk的客戶端庫自動(dòng)發(fā)送),這個(gè)時(shí)間足夠低,監(jiān)測出服務(wù)器故障,zk客戶端會自動(dòng)進(jìn)行故障切換,切換到另一臺服務(wù)器,會話有效。切換過程中的客戶端其他操作會失敗。
時(shí)間
-
“滴答時(shí)間”:tick time定義了zk的基本時(shí)間周期,被集合體的服務(wù)器用來定義相互交互的時(shí)間表。 - 會話超時(shí)值設(shè)置基于滴答時(shí)間,大于等于2個(gè)滴答時(shí)間,小于等于20個(gè)滴答時(shí)間。如通常滴答參數(shù)設(shè)為
2秒(2000毫秒),則會話超時(shí)時(shí)間為4-40秒。 - 會話超時(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)離開后又重新加入組的情況。 - 會話超時(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è)會話。
- 一般zk的集合體服務(wù)器越多,會話超時(shí)的設(shè)置越大??墒褂胘mx監(jiān)控zk度量指標(biāo),頻繁遇到丟連接時(shí),要考慮增大超時(shí)的設(shè)置。
狀態(tài)
zk對象在生命周期中可以通過
getState()方法查詢對象的狀態(tài),返回值States是zk對象不同狀態(tài)的枚舉類型值。
- 建立連接過程中,zk實(shí)例處于
CONNECTING狀態(tài),建立連接完成后,進(jìn)入CONNECTED狀態(tài)。通過注冊觀察對象,進(jìn)入CONNECTED后,觀察對象會收到一個(gè)WatchedEvent通知,KeeperState值為SyncConnected。 - zk實(shí)例在斷開然后重連zk服務(wù),狀態(tài)就會在CONNECTED和CONNECTING之間轉(zhuǎn)換。若斷開連接會收到一個(gè)
Disconnected事件。(重連是zk自動(dòng)發(fā)起) - 若調(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)用的參與者檢索和更新配置文件。
- 存儲的配置數(shù)據(jù)是字符串,關(guān)鍵字是znode路徑,每個(gè)znode上存儲了一個(gè)鍵值對;
- 在任何時(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é)分配順序號。
- 首先制定一個(gè)作為鎖的znode,通常用它來描述被鎖定的實(shí)體,稱為/leader。
- 然后希望獲得鎖的客戶端創(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安裝
安裝流程
- 下載
進(jìn)入官網(wǎng):https://zookeeper.apache.org/,點(diǎn)擊【Project】—>【Releases】尋找合適的版本。 - 解壓
tar xzf zookeeper-x.y.z.tar.gz
- 加入命令行路徑
export ZOOKEEPER_HOME=~/sw/zookeeper-x.y.z
export PATH=$PATH:%ZOOKEEPER_HOME/bin
- 配置文件(主要)
| 配置 | 說明 |
|---|---|
| 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)聽客戶端連接的端口 |
- 啟動(dòng)
zkServer.sh start
zk配置服務(wù)器ID
-
zk服務(wù)器的集合體中,每個(gè)服務(wù)器都有一個(gè)數(shù)值型的ID,服務(wù)器ID在集合體中唯一,取值為1~255,通過一個(gè)名為myid的純文本文件設(shè)定服務(wù)器的ID,保存在dataDir參數(shù)所指定的目錄中。
zk配置服務(wù)器id - 為每臺服務(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ù)器連接。 - 流程:當(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ù)
initLimit和syncLimit參數(shù)是強(qiáng)制的,都是以滴答參數(shù)(tickTime)的倍數(shù)進(jìn)行度量。
- 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ù)值。
- 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同步 |
觀察事件類型
查看zk的連接數(shù)
- 查看zk的連接數(shù)的幾種命令
netstat -na | grep 2181 | wc -l
netstat -an | grep -I 2181
echo stat | nc localhost 2181
- 查看最大連接數(shù)配置
echo conf | nc localhost 2181 | grep "max"

查看znode節(jié)點(diǎn)列表
- 查看命令行幫助
./zkCli.sh -server localhost ls
- 查看所有組
./zkCli.sh -server localhost ls /
- 查看具體組
./zkCli.sh -server localhost ls /brokers
常用操作命令
| 操作 | 描述 | |
|---|---|---|
| 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 /znode或get /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四字母組合命令
使用示例
監(jiān)聽端口:使用ruok,代表Are you OK?
echo ruok | nc localhost 2181
返回結(jié)果為imok,代表I'm OK

zk的ACL
ACL介紹
- 每個(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)。 - ACL依賴于zk的客戶端身份驗(yàn)證機(jī)制:
a)digest:通過用戶名和密碼識別客戶端;
b) sals: 通過kerberos認(rèn)證來識別客戶端;(klist -kt和kinit -kt)
c)ip: 通過客戶端的ip來識別客戶端; - ACL權(quán)限控制,可使用
scheme:id:permission來識別:
a)權(quán)限模式(scheme):鑒權(quán)策略;
b)授權(quán)對象(id)
c)權(quán)限(permission)
ACL詳解
- 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)證 |
- 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模式一致 |
- 權(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)威指南-第四版》
