1. zk客戶端命令查看bbo服務的生產者和消費者
假設zookeeper安裝在172.16.22.2這台伺服器上,現在我們通過命令行查看bbo在zookeeper注冊服務的生產者和消費者信息
首先通過命令切換到/zookeeper-3.4.11/bin目錄,然後輸入
(2182為zookeeper在伺服器上提供服務的埠)會看到如下截圖:
然後在命令行再輸入:
查看目錄信息,就能看到注冊的bbo服務,截圖如下:
在命令行依次輸入:
會看到bbo服務提供的對外介面,截圖如下:
查看消費者命令:
會看到消費者的信息,截圖如下:
查看生產者命令:
會看到生產者的信息,截圖如下:
2. Zookeeper常用命令
ZooKeeper服務命令:
在准備好相應的配置之後,可以直接通過zkServer.sh 這個腳本進行服務的相關操作
1. 啟動ZK服務: sh bin/zkServer.sh start
2. 查看ZK服務狀態: sh bin/zkServer.sh status
3. 停止ZK服務: sh bin/zkServer.sh stop
4. 重啟ZK服務: sh bin/zkServer.sh restart
zk客戶端命令
ZooKeeper命令行工具類似於Linux的shell環境,不過功能肯定不及shell啦,但是使用它我們可以簡單的對ZooKeeper進行訪問,數據創建,數據修改等操作. 使用 zkCli.sh -server 127.0.0.1:2181 連接到 ZooKeeper 服務,連接成功後,系統會輸出 ZooKeeper 的相關環境以及配置信息。
命令行工具的一些簡單操作如下:
1. 顯示根目錄下、文件: ls / 使用 ls 命令來查看當前 ZooKeeper 中所包含的內容
2. 顯示根目錄下、文件: ls2 / 查看當前節點數據並能看到更新次數等數據
3. 創建文件,並設置初始內容: create /zk "test" 創建一個新的 znode節點「 zk 」以及與它關聯的字元串
4. 獲取文件內容: get /zk 確認 znode 是否包含我們所創建的字元串
5. 修改文件內容: set /zk "zkbak" 對 zk 所關聯的字元串進行設置
6. 刪除文件: delete /zk 將剛才創建的 znode 刪除
7. 退出客戶端: quit
8. 幫助命令: help
9rmr命令
刪除節點命令,此命令與delete命令不同的是delete不可刪除有子節點的節點,但是rmr命令可以刪除,注意路徑為絕對路徑。
如rmr /zookeeper/znode
10 delquota命令
刪除配額,-n為子節點個數,-b為節點數據長度。
如delquota –n 2,請參見listquota和setquota命令。
11printwatches命令
設置和顯示監視狀態,on或者off。
如printwatches on
listquota命令
顯示配額。
如listquota /zookeeper
absolute path is/zookeeper/quota/zookeeper/zookeeper_limits
Output quota for /zookeepercount=2,bytes=-1
解釋:
/zookeeper節點個數限額為2,長度無限額。
setAcl命令
設置節點Acl。
此處重點說一下acl,acl由大部分組成:1為scheme,2為user,3為permission,一般情況下表示為scheme:id:permissions。
其中scheme和id是相關的,下面將scheme和id一起說明。
scheme和id
world : 它下面只有一個id, 叫anyone, world:anyone代表任何人,zookeeper中對所有人有許可權的結點就是屬於world:anyone的
auth : 它不需要id, 只要是通過authentication的user都有許可權(zookeeper支持通過kerberos來進行authencation, 也支持username/password形式的authentication)
digest : 它對應的id為username:BASE64(SHA1(password)),它需要先通過username:password形式的authentication
ip : 它對應的id為客戶機的IP地址,設置的時候可以設置一個ip段,比如ip:192.168.1.0/16, 表示匹配前16個bit的IP段
super : 在這種scheme情況下,對應的id擁有超級許可權,可以做任何事情(cdrwa)
permissions
CREATE (c): 創建許可權,可以在在當前node下創建child node
DELETE (d): 刪除許可權,可以刪除當前的node
READ (r): 讀許可權,可以獲取當前node的數據,可以list當前node所有的child nodes
WRITE (w): 寫許可權,可以向當前node寫數據
ADMIN (a): 管理許可權,可以設置當前node的permission
綜上,一個簡單使用setAcl命令,則可以為:
setAcl /zookeeper/node1 world:anyone:cdrw
getAcl命令
獲取節點Acl。
如getAcl /zookeeper/node1
'world,'anyone
: cdrwa
註:可參見setAcl命令。
sync命令
強制同步。
如sync /zookeeper
由於請求在半數以上的zk server上生效就表示此請求生效,那麼就會有一些zk server上的數據是舊的。sync命令就是強制同步所有的更新操作。
redo命令
再次執行某命令。
如redo 10
其中10為命令ID,需與history配合使用。
addauth命令
節點認證。
如addauth digest username:password,可參見setAcl命令 digest處。
使用方法:
一、通過setAcl設置用戶名和密碼
setAcl pathdigest:username:base64(sha1(password)):crwda
二、認證
addauth digest username:password
delete命令
刪除節點。
如delete /zknode1
setquota命令
設置子節點個數和數據長度配額。
如setquota –n 4 /zookeeper/node 設置/zookeeper/node子節點個數最大為4
setquota –b 100 /zookeeper/node 設置/zookeeper/node節點長度最大為100
ZooKeeper 常用四字命令:
ZooKeeper 支持某些特定的四字命令字母與其的交互。它們大多是查詢命令,用來獲取 ZooKeeper 服務的當前狀態及相關信息。用戶在客戶端可以通過 telnet 或 nc 向 ZooKeeper 提交相應的命令
1. 可以通過命令:echo stat|nc 127.0.0.1 2181 來查看哪個節點被選擇作為follower或者leader
2. 使用echo ruok|nc 127.0.0.1 2181 測試是否啟動了該Server,若回復imok表示已經啟動。
3. echo mp| nc 127.0.0.1 2181 ,列出未經處理的會話和臨時節點。
4. echo kill | nc 127.0.0.1 2181 ,關掉server
5. echo conf | nc 127.0.0.1 2181 ,輸出相關服務配置的詳細信息。
6. echo cons | nc 127.0.0.1 2181 ,列出所有連接到伺服器的客戶端的完全的連接 / 會話的詳細信息。
7. echo envi |nc 127.0.0.1 2181 ,輸出關於服務環境的詳細信息(區別於 conf 命令)。
8. echo reqs | nc 127.0.0.1 2181 ,列出未經處理的請求。
9. echo wchs | nc 127.0.0.1 2181 ,列出伺服器 watch 的詳細信息。
10. echo wchc | nc 127.0.0.1 2181 ,通過 session 列出伺服器 watch 的詳細信息,它的輸出是一個與 watch 相關的會話的列表。
11. echo wchp | nc 127.0.0.1 2181 ,通過路徑列出伺服器 watch 的詳細信息。它輸出一個與 session 相關的路徑。
3. ZooKeeper的shell行操作
首先,我們可以是用命令
進入 ZooKeeper 的命令行客戶端,這種是直接連接本機的 ZooKeeper 伺服器。
還有一種方式,可以連接其他的 ZooKeeper 伺服器,只需要我們在命令後面接一 個參數 -server 就可以了。
例如:
進入命令行之後,鍵入 help 可以查看簡易的命令幫助文檔,如下圖
命令 :
命令 :
命令 :
命令 :
命令 :
命令 :
命令 :
命令 :
命令 :
命令 :
安裝nc
4. grub命令行啟動win7
1、首先在電腦桌面右鍵點擊桌面【計算機】後選擇【屬性】。
5. kafka 中的zookeeper 命令行這樣用!
以 zookeeper的地址:192.168.150.41 埠:2185 為例
hosts記錄: 192.168.150.41 zk41
1.連接zoo:
bin/zookeeper-shell.sh 192.168.150.41:2185 或者 bin/zookeeper-shell.sh zk41:2185
簡單幾個命令:
1.ls
2.查看broker信息:
get /brokers/ids/0
常用命令:
6. Zookeeper許可權控制
Zookeeper ACL(Access Control List)一共分為5種許可權:
與Linux許可權類似,5個許可權可以使用int型數字perms的5個二進制位表示,順序為adcwr,如perms=5對應許可權--cwr,perms=31對應許可權adcwr。
一般在命令行設置許可權時會使用ACL簡寫,在API調用時會使用perms數字表示許可權。
Zookeeper許可權驗證方式(scheme)如下:
Zookeeper的默認許可權為 world: anyone :adcwr ,即任何人擁有所有許可權,如果將Zookeeper服務暴露給外網,不進行許可權修改非常危險的。
命令行設置許可權的格式: setAcl {path} {scheme}:{id}:{auth},{scheme}:{id}:{auth}... 可以用逗號分隔
好了,現在每個節點只有擁有對應許可權的連接能夠進行對應操作了。
可以修改配置文件,跳過ACL檢查,把許可權設置正確後再打開ACL檢查
本文搬自 我的博客 ,歡迎參觀!
7. 【Zookeeper系列】ZK命令基本使用
在了解 ZK 底層原理之前,咱們先簡單了解常用的 ZK 命令,熟悉常用 ZK 命令有利於排查相關問題或了解基於 ZK 自研系統等場景。比如在開發的時候,發現有些Dubbo服務無法被調用,這有可能是服務沒有注冊到ZK或者斷開連接;也有可能公司有自研的系統使用 ZK 作為配置中心,熟悉 ZK 命令就能知道是如何做到服務發現注冊和配置動態更新。
話不多說,咱們先來了解常見的 ZK 命令吧!
實際上,ZK並沒有help命令,你可以隨意敲一兩個字元也會這樣顯示,只不過基於使用Linux的習慣,姑且認為輸入help能列印出ZK支持的命令吧。
ls 命令可以查看指定目錄下的節點,使用可選的參數,能夠更加詳細的看到節點的相關信息
stat / 等價於 ls -s /
和 ls 命令相似的,加上-w參數添加監聽
在ZK 3.5版本之後,新增了容器和TTL節點,分別是使用 -c 和 -t 創建。所以讀者們要注意你當前使用的版本,如果版本低於3.5的,是沒有容器和TTL節點。
特別說明一下容器節點和TTL節點的使用:
另外關於 TTL節點 的使用,需要特別注意的是,如果使用默認的配置文件啟動zk,想創建有存活時間的節點,比如執行 create -t 10 /test 是會報 KeeperErrorCode = Unimplemented for XXX 這樣的錯誤。解決辦法是需要在ZK啟動前,先在配置文件加上 extendedTypesEnabled=true 然後重啟ZK(集群部署的話,所有ZK都需要修改配置文件再重啟)
配置後重啟,執行 create -t 10 /test 這樣的命令就不會報錯啦
例子:get -s /demo
例子:先查詢節點版本號,模擬並發下修改同一節點
get -s /demo 可知當前 dataVersion = 1
客戶端1:set -v 1 /demo demo-data1
客戶端2:set -v 1 /demo demo-data2
客戶端1比客戶端2先執行,客戶端2再執行的話,這時顯示報錯
-v version:和 set 命令相似,-v 參數用於判斷當前操作的版本
例子:先創建一個delNode節點,然後刪除
在前面使用create命令的時候,有一個acl參數是設置節點許可權的,那麼我們應該怎麼設置?
舉個例子: create /testAcl demo world:anyone:crwda
這行命令的意思是,創建 testAcl 這個節點,節點值為demo,其許可權策略是所有人都可以執行 crwda 操作。那麼接下來,咱們先看下 ACL 是什麼東東?
ACL 全稱是 Access Control List ,也就是訪問控制列表,ACL可以設置節點的操作許可權。那麼控制許可權的粒度是怎樣呢?
對於節點 ACL 許可權控制,是通過使用: scheme:id:perm 來標識(也就是例子中的格式 -> world:anyone:crwda),其含義是:
Scheme 有哪些授權策略?
ID 授權對象有哪些?
Permission 許可權有哪些?
根據上面的參數可知,我們可以通過給所有人、特定的賬號密碼、特定的 ip 設置節點許可權,這樣能夠更加方面地管理節點的訪問。
值得注意的是,節點可以設置多種授權策略,但對於上下節點而言,許可權的設置只對當前節點有效。換言之,許可權不存在繼承關系,即使節點被設置許可權,但不會影響上下節點原來的許可權!
上面執行了 create /testAcl demo world:anyone:crwda 命令給節點設置許可權,那怎麼看節點的許可權咧?
很簡單,執行 getAcl 節點路徑 就可以查看對應節點的許可權,比如 getAcl /testAcl,執行結果如下
除了在執行create命令創建節點的時候設置許可權,還可以通過 setAcl 指定節點設置許可權,比如我想指定/testAcl這個節點只可以通過特定 IP操作,並且限制執行許可權為crdw,那麼可以執行 setAcl /testAcl ip:127.0.0.1:crwd ,再次執行 getAcl /testAcl 結果如下:
ZK 的命令還有部分沒有演示,這並不阻礙咱們學習ZK的原理,先掌握常見的命令,如果日後有其他場景的話,再根據特定的命令學習就可以啦。
無意中發現有 Zookeeper的客戶端,感興趣的讀者可以玩一下~ 友情提醒,可能在節點數量很多的時候,打開很慢,甚至卡死,所以這個可視化工具可以在自己本地玩玩,不建議應用在生產上哈。這也側面的說明,學會 ZK 命令的重要性(認真臉.jpg)
解壓縮後,進入ZooInspector的build目錄,執行 java -jar zookeeper-dev-ZooInspector.jar 就可以啟動工具。
連接上 ZK 後,就可以看到節點的信息和節點的ACL,具體玩法,可以再自己摸索哈~
好了,以上是 ZK 常見命令的基本使用和可視化工具的基本使用。
參考資料:
《從Paxos到Zookeeper分布式一致性原理與實踐》
如果覺得文章不錯的話,麻煩點個贊哈,你的鼓勵就是我的動力!對於文章有哪裡不清楚或者有誤的地方,歡迎在評論區留言~
8. zookeeper 四字命令怎麼用
zookeeper安裝和使用
zookeeper的安裝基本上可以按照 zookeeperStarted.html 這個頁面上的步驟完成安裝,這里主要介紹下部署一個集群的步驟,因為這個官方頁面似乎講得並不是非常詳細(Running Replicated Zookeeper)。
由於手頭機器不足,所以在一台機器上部署了3個server,如果你手頭也比較緊,也可以這么做。那麼我建了3個文件夾,如下
server1 server2 server3
然後每個文件夾裡面解壓一個zookeeper的下載包,並且還建了幾個文件夾,總體結構如下,最後那個是下載過來壓縮包的解壓文件
data dataLog logs zookeeper-3.3.2
那麼首先進入data目錄,創建一個myid的文件,裡面寫入一個數字,比如我這個是server1,那麼就寫一個1,server2對應myid文件就寫入2,server3對應myid文件就寫個3
然後進入zookeeper-3.3.2/conf目錄,那麼如果是剛下過來,會有3個文件,configuration.xml, log4j.properties,zoo_sample.cfg,這3個文件我們首先要做的就是在這個目錄創建一個zoo.cfg的配置文件,當然你可以把zoo_sample.cfg文件改成zoo.cfg,配置的內容如下所示:
tickTime=2000
initLimit=5
syncLimit=2
dataDir=xxxx/zookeeper/server1/data
dataLogDir=xxx/zookeeper/server1/dataLog
clientPort=2181
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890
標紅的幾個配置應該官網講得很清楚了,只是需要注意的是clientPort這個埠如果你是在1台機器上部署多個server,那麼每台機器都要不同的clientPort,比如我server1是2181,server2是2182,server3是2183,dataDir和dataLogDir也需要區分下。
最後幾行唯一需要注意的地方就是 server.X 這個數字就是對應 data/myid中的數字。你在3個server的myid文件中分別寫入了1,2,3,那麼每個server中的zoo.cfg都配server.1,server.2,server.3就OK了。因為在同一台機器上,後面連著的2個埠3個server都不要一樣,否則埠沖突,其中第一個埠用來集群成員的信息交換,第二個埠是在leader掛掉時專門用來進行選舉leader所用。
進入zookeeper-3.3.2/bin 目錄中,./zkServer.sh start啟動一個server,這時會報大量錯誤看其實沒什麼關系,因為現在集群只起了1台server,zookeeper伺服器端起來會根據zoo.cfg的伺服器列表發起選舉leader的請求,因為連不上其他機器而報錯,那麼當我們起第二個zookeeper實例後,leader將會被選出,從而一致性服務開始可以使用,這是因為3台機器只要有2台可用就可以選出leader並且對外提供服務(2n+1台機器,可以容n台機器掛掉)。
接下來就可以使用了,我們可以先通過 zookeeper自帶的客戶端交互程序來簡單感受下zookeeper到底做一些什麼事情。進入zookeeper-3.3.2/bin(3個server中任意一個)下,./zkCli.sh –server 127.0.0.1:2182,我連的是開著2182埠的機器。
那麼,首先我們隨便打個命令,因為zookeeper不認識,他會給出命令的help,如下圖
ls(查看當前節點數據),
ls2(查看當前節點數據並能看到更新次數等數據) ,
create(創建一個節點) ,
get(得到一個節點,包含數據和更新次數等數據),
set(修改節點)
delete(刪除一個節點)
通過上述命令實踐,我們可以發現,zookeeper使用了一個類似文件系統的樹結構,數據可以掛在某個節點上,可以對這個節點進行刪改。另外我們還發現,當改動一個節點的時候,集群中活著的機器都會更新到一致的數據。
9. zookeeper cli 命令行 set 帶空格的 value 報錯,什麼原因
ZooKeeper有一個分層的名字空間,跟分布式文件系統很相似。唯一的不同是,名字空間中的每個節點都可以有關聯的數據和子節點。這就像一個允許文件也是目錄的文件系統。節點路徑總是表達為規則的、斜杠分隔的絕對路徑,不存在相對路徑。路徑可以使用任何Unicode字元,但是需要遵循下列限制:
l 不能使用空字元(\?)。(這在C綁定中會導致問題)
l 因為不能正確顯示,或者容易弄混淆,不能使用這些字元:\ - \和\ - \?。
l 不允許使用這些字元:\? - uF8FFF、\? - uFFFF、\uXFFFE - \uXFFFF(X是1到E之間的一個數字)、\? - \?。
l 可以使用小數點,但是不能單獨使用.和..來指示路徑中的節點,因為ZooKeeper不使用相對路徑。/a/b/./c或者/a/b/../c是無效的。
l 記號zookeeper是保留的。
10. Zookeeper深入原理
Zookeeper 的視圖結構是一個樹形結構,樹上的每個節點稱之為數據節點(即 ZNode),每個ZNode 上都可以保存數據,同時還可以掛載子節點。並且Zookeeper的根節點為 "/"。
在 Zookeeper 中,每個數據節點都是有生命周期的,其生命周期的長短取決於數據節點的節點類型。在 Zookeeper 中有如下幾類節點:
每個數據節點中除了存儲了數據內容之外,還存儲了數據節點本身的一些狀態信息(State)。
在Zookeeper 中,事務是指能夠改變 Zookeeper 伺服器狀態的操作,我們也稱之為事務操作或更新操作,一般包括數據節點創建與刪除、數據節點內容更新和客戶端會話創建與失效等操作。對於每一個事務請求,Zookeeper 都會為其分配一個全局唯一的事務ID,用 ZXID 來表示,通常是一個 64 位的數字。每一個 ZXID 對應一次更新操作,從這些 ZXID 中可以間接地識別出 Zookeeper 處理這些更新操作請求的全局順序。
ZXID 是一個 64 位的數字,其中低 32 位可以看作是一個簡單的單調遞增的計數器,針對客戶端的每一個事務請求,Leader 伺服器在產生一個新的事務 Proposal 的時候,都會對該計數器進行加 1 操作;而高 32 位則代表了 Leader 周期 epoch 的編號,每當選舉產生一個新的 Leader 伺服器,就會從這個 Leader 伺服器上取出其本地日誌中最大事務 Proposal 的 ZXID,並從該 ZXID 中解析出對應的 epoch 值,然後再對其進行加 1 操作,之後就會以此編號作為新的 epoch,並將低 32 位置 0 來開始生成新的 ZXID。
Zookeeper 中為數據節點引入了版本的概念,每個數據節點都具有三種類型的版本信息(在上面的狀態信息中已經介紹了三種版本信息代表的意思),對數據節點的任何更新操作都會引起版本號的變化。其中我們以 dataVersion 為例來說明。在一個數據節點被創建完畢之後,節點的dataVersion 值是 0,表示的含義是 」當前節點自從創建之後,被更新過 0 次「。如果現在對該節點的數據內容進行更新操作,那麼隨後,dataVersion 的值就會變成 1。即表示的是對數據節點的數據內容的變更次數。
版本的作用是用來實現樂觀鎖機制中的 「寫入校驗」 的。例如,當要修改數據節點的數據內容時,帶上版本號,如果數據節點的版本號與傳入的版本號相等,就進行修改,否則修改失敗。
Zookeeper 提供了分布式數據的發布/訂閱功能。一個典型的發布/訂閱模型系統定義了一種一對多的訂閱關系,能夠讓多個訂閱者同時監聽某一個主題對象,當這個主題對象自身狀態變化時,會通知所有訂閱者,使它們能夠做出相應的處理。在 Zookeeper 中,引入了 Watcher 機制來實現這種分布式的通知功能。Zookeeper 允許客戶端向服務端注冊一個 Watcher 監聽,當服務端的一些指定事件觸發了這個 Watcher,那麼就會向指定客戶端發送一個事件通知來實現分布式的通知功能。
從上圖可以看出 Zookeeper 的 Watcher 機制主要包括客戶端線程、客戶端WatchMananger 和 Zookeeper 伺服器三部分。在具體工作流程上,簡單地講,客戶端在向 Zookeeper 伺服器注冊 Watcher 的同時,會將 Watcher 對象存儲在客戶端的 WatchMananger 中。當 Zookeeper 伺服器端觸發 Watcher 事件後,會向客戶端發送通知,客戶端線程從 WatchManager 中取出對應的 Watcher 對象來執行回調邏輯。
Watcher是一個介面,任何實現了Watcher介面的類就是一個新的Watcher。Watcher內部包含了兩個枚舉類:KeeperState、EventType
注 :客戶端接收到的相關事件通知中只包含狀態及類型等信息,不包括節點變化前後的具體內容,變化前的數據需業務自身存儲,變化後的數據需調用get等方法重新獲取;
上面講到zookeeper客戶端連接的狀態和zookeeper對znode節點監聽的事件類型,下面我們來講解如何建立zookeeper的watcher監聽。在zookeeper中採用zk.getChildren(path, watch)、zk.exists(path, watch)、zk.getData(path, watcher, stat)這樣的方式為某個znode注冊監聽。
下表以node-x節點為例,說明調用的注冊方法和可監聽事件間的關系:
Zookeeper 中提供了一套完善的 ACL(Access Control List)許可權控制機制來保障數據的安全。
ACL 由三部分組成,分別是:許可權模式(Scheme)、授權對象(ID)和許可權(Permission),通常使用「scheme: id:permission」來標識一個有效的ACL 信息。下面分別介紹:
1.7.4、ACL 超級管理員
zookeeper的許可權管理模式有一種叫做super,該模式提供一個超管可以方便的訪問任何許可權的節點
假設這個超管是:super:admin,需要先為超管生成密碼的密文
那麼打開zookeeper目錄下的/bin/zkServer.sh伺服器腳本文件,找到如下一行:
這就是腳本中啟動zookeeper的命令,默認只有以上兩個配置項,我們需要加一個超管的配置項
那麼修改以後這條完整命令變成了
之後啟動zookeeper,輸入如下命令添加許可權
在伺服器集群初始化階段,我們以 3 台機器組成的伺服器集群為例,當有一台伺服器server1 啟動的時候,它是無法進行 Leader 選舉的,當第二台機器 server2 也啟動時,此時這兩台伺服器已經能夠進行互相通信,每台機器都試圖找到一個 Leader,於是便進入了 Leader 選舉流程。
在zookeeper運行期間,leader與非leader伺服器各司其職,即便當有非leader伺服器宕機或新加入,此時也不會影響leader,但是一旦leader伺服器掛了,那麼整個集群將暫停對外服務,進入新一輪leader選舉,其過程和啟動時期的Leader選舉過程基本一致。
假設正在運行的有server1、server2、server3三台伺服器,當前leader是server2,若某一時刻leader掛了,此時便開始Leader選舉。選舉過程如下:
observer角色特點:
為了使用observer角色,在任何想變成observer角色的配置文件中加入如下配置:
並在所有server的配置文件中,配置成observer模式的server的那行配置追加:observer,例如: