1、分佈式系統概念java
在聊Zookeeper以前,咱們先來聊聊什麼是分佈式系統;所謂分佈式系統就是一個系統的軟件或硬件組件分佈在網絡中的不一樣計算機之上,彼此間經過消息傳遞進行通訊和協做的系統;簡單講就是一個系統的組件分佈在不一樣網絡中的各主機上,彼此經過消息傳遞通訊和協做,咱們把這樣的系統就叫作分佈式系統;node
2、分佈式系統的特徵linux
一、分佈性:所謂分佈性就是指咱們在上面描述的各組件分佈在不一樣的網絡中的不一樣計算機上;算法
二、對等性:所謂對等性是指不一樣計算節點上的組件沒有主從之分,全部組件的角色身份都是平等的;apache
三、併發性:指集羣中的各節點同時對一些資源進行併發訪問;各節點同時併發訪問一些資源,如何協調這些節點對同一資源的訪問是一個分佈式系統面臨的一個問題; json
四、缺少全局時鐘:集羣各節點組件沒有一個全局時鐘;api
五、故障必然會發生:這個是說一個分佈式系統中的各個節點必定會故障發生;bash
3、分佈式系統常見的故障服務器
一、通訊異常:集羣各節點都是經過網絡通訊,若是因各網絡設備故障或異常,或者網絡線路故障均可致使通訊異常;網絡
二、網絡分區:在發生通訊異常後,各節點間通訊延遲變得愈來愈高,最終會致使一個分佈式系統的全部節點中,一部分可以正常通訊,一部分不能正常通訊,咱們把這種現象叫作網絡發生了分區;好比,兩臺server組成的集羣,當其中一臺server不可以正常的聯繫到另外一臺server,這個時候咱們就說網絡發生了分區;對於網絡分區,如何界定哪臺server的網絡故障就先得尤其重要;
三、三態:指在分佈式系統中各組件間的每一次請求和應答狀態;若是可以正常響應請求咱們就說本次請求成功被響應;反之,咱們就說本次請求失敗;除了這兩種狀態外,還有第三種,在分佈式系統中網絡是不可靠因素,所以各組件間調用就頗有可能存在超時;所謂超時是指在必定時間範圍內請求一直沒有獲得響應;
四、節點故障:指分佈式系統中各節點因各類緣由致使節點故障;好比節點斷電宕機,人爲操做不當等等;
4、CAP理論和BASE理論
CAP理論指一個分佈式系統中,一致性(Consistency)、可用性(Availability)、分區容錯性(Partition tolerance);這三個要素最多隻能同時知足兩個;這樣一來咱們的系統要麼知足一致性和可用性,要麼知足一致性和分區容錯性,要麼知足可用性和分區容錯性;咱們知道一個分佈式系統各組件間傳遞消息來通訊,因此網絡分區容錯性應該必須知足;這樣一來咱們的系統就必須在一致性和可用性之間作權衡;
BASE理論:BA表示基本可用,S表示軟狀態,E表示最終一致性;它主要是對CAP理論中的一致性和可用性進行權衡的結果;意思是說一個分佈式系統應該知足系統基本可用(容許部分節點不可用),在必定時間窗口內咱們容許各節點之間數據不一致,但要保證最終一致;
5、zookeeper簡介
zookeeper是一個開源的分佈式協調服務,由知名互聯網公司Yahoo建立,它是Chubby的開源實現;換句話講,zookeeper是一個典型的分佈式數據一致性解決方案,分佈式應用程序能夠基於它實現數據的發佈/訂閱、負載均衡、名稱服務、分佈式協調/通知、集羣管理、Master選舉、分佈式鎖和分佈式隊列;
zookeeper集羣中的相關概念
集羣角色:Leader、Follower、Observer;一個zookeeper(簡稱zk)集羣,是由一個leader,多個Follower和Observer角色組成;其中Leader是由follower和observer選舉產生,提供讀寫服務;Leader參與選舉,可以被選舉,提供讀服務;Observer參與選舉,不可以被選舉,提供讀服務;
zk會話:指客戶端和服務端創建的tcp長連接;
數據節點(ZNode):即zk數據模型中的數據單元;zk的數據都存儲於內存中,數據模型爲樹狀結構(ZNode Tree);每一個ZNode都會保存本身的數據於內存中;其中ZNode節點又分持久節點和臨時節點,所謂持久節點指僅顯式刪除才消失的節點;臨時節點指會話停止即自動消失的節點;
版本(version):ZK會爲每一個ZNode維護一個稱之爲Stat的數據結構,記錄了當前ZNode的三個數據版本;當前版本(version),當前znode的子節點的版本(cversion),當前znode的ACL的版本(aversion);
ACL:ZK使用ACL機制進行權限控制;CREATE, READ,WRITE,DELETE,ADMIN;
事件監聽器(Watcher):ZK上,由用戶指定的觸發機制,在某些事件產生時,ZK可以將通知給相關的客戶端;
ZAB協議:Zookeeper Atomic Broadcast,ZK原子廣播協議;Zab協議是爲分佈式協調服務Zookeeper專門設計的一種 支持崩潰恢復的原子廣播協議; 主要做用是在zk集羣leader崩潰之後,可以基於此協議選舉新leader,而且保證數據最終一致性和完整性;zk客戶端鏈接zk集羣中的任何一個節點,發起請求,若是客戶端發送讀請求,則直接由當前節點響應;若是客戶端發送的是寫請求,且當前節點不是leader節點,則由當前節點把寫請求,轉發給leader,由leader進行寫事務廣播,只有超過集羣節點半數的響應容許寫,該事務纔會被並提交;只有當leader寫成功後,leader會通知各follower來同步數據;對於zab協議來說,它存在三種狀態,分別是Looking,Following和Leading;所謂looking狀態指zk集羣正在啓動或leader崩潰之後,各節點進行選舉的過程時的狀態;following狀態指當zk集羣中有leader之後,各個follower的狀態;leading狀態就是指leader所屬狀態;因此zk集羣中的各節點都會在這三個狀態上來回轉換,在集羣剛啓動或leder崩潰之後,各節點都會切換爲looking狀態,在選舉產生leader之後,當選leader的節點會從looking切換爲leading狀態,其餘follower會從looking切換爲following狀態;只要zk集羣觸發一次新的選舉,都會通過上述狀態的轉換;
6、zookeeper集羣部署
環境說明
主機名 | ip地址 |
node01 | 192.168.0.41 |
node02 | 192.168.0.42 |
node03 | 192.168.0.43 |
一、集羣各節點安裝jdk
[root@node01 ~]# yum install -y java-1.8.0-openjdk-devel
提示:各節點的時間同步、selinux、iptables和firewalld服務的配置都要提早作好;
驗證:在各節點執行java -version看看對應java的版本是否是咱們安裝的版本?
提示:只要在各節點上可以看到對應版本的java信息出現,而且是咱們指定的版本,說明java環境沒有問題;
二、下載zookeeper二進制包
[root@node01 ~]# cd /usr/local/ [root@node01 local]# ll total 0 drwxr-xr-x. 2 root root 6 Nov 5 2016 bin drwxr-xr-x. 2 root root 6 Nov 5 2016 etc drwxr-xr-x. 2 root root 6 Nov 5 2016 games drwxr-xr-x. 2 root root 6 Nov 5 2016 include drwxr-xr-x. 2 root root 6 Nov 5 2016 lib drwxr-xr-x. 2 root root 6 Nov 5 2016 lib64 drwxr-xr-x. 2 root root 6 Nov 5 2016 libexec drwxr-xr-x. 2 root root 6 Nov 5 2016 sbin drwxr-xr-x. 5 root root 49 Sep 15 20:33 share drwxr-xr-x. 2 root root 6 Oct 19 19:42 src [root@node01 local]# wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.6.2/apache-zookeeper-3.6.2-bin.tar.gz --2020-10-19 19:42:52-- https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.6.2/apache-zookeeper-3.6.2-bin.tar.gz Resolving mirrors.tuna.tsinghua.edu.cn (mirrors.tuna.tsinghua.edu.cn)... 101.6.8.193, 2402:f000:1:408:8100::1 Connecting to mirrors.tuna.tsinghua.edu.cn (mirrors.tuna.tsinghua.edu.cn)|101.6.8.193|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 12515974 (12M) [application/x-gzip] Saving to: ‘apache-zookeeper-3.6.2-bin.tar.gz’ 100%[================================================================================>] 12,515,974 4.02MB/s in 3.0s 2020-10-19 19:42:55 (4.02 MB/s) - ‘apache-zookeeper-3.6.2-bin.tar.gz’ saved [12515974/12515974] [root@node01 local]# ll total 12224 -rw-r--r-- 1 root root 12515974 Sep 9 19:36 apache-zookeeper-3.6.2-bin.tar.gz drwxr-xr-x. 2 root root 6 Nov 5 2016 bin drwxr-xr-x. 2 root root 6 Nov 5 2016 etc drwxr-xr-x. 2 root root 6 Nov 5 2016 games drwxr-xr-x. 2 root root 6 Nov 5 2016 include drwxr-xr-x. 2 root root 6 Nov 5 2016 lib drwxr-xr-x. 2 root root 6 Nov 5 2016 lib64 drwxr-xr-x. 2 root root 6 Nov 5 2016 libexec drwxr-xr-x. 2 root root 6 Nov 5 2016 sbin drwxr-xr-x. 5 root root 49 Sep 15 20:33 share drwxr-xr-x. 2 root root 6 Oct 19 19:42 src [root@node01 local]# scp apache-zookeeper-3.6.2-bin.tar.gz node02:/usr/local/ apache-zookeeper-3.6.2-bin.tar.gz 100% 12MB 26.8MB/s 00:00 [root@node01 local]# scp apache-zookeeper-3.6.2-bin.tar.gz node03:/usr/local/ apache-zookeeper-3.6.2-bin.tar.gz 100% 12MB 32.7MB/s 00:00 [root@node01 local]#
解壓二進制包,並把解壓後的目錄作軟連接
提示:其餘兩個節點都要作相同的操做;
三、配置zookeeper
提示:zookeeper在二進制包中給咱們提供了一個示例配置文件其路徑爲conf/下名爲zoo_sample.cfg,咱們須要將其複製爲zoo.cfg,而後基於此文件作修改便可;這裏主要修改dataDir,從名字上咱們能夠知道,這個參數是指定zookeeper的數據目錄;上面的tickTime用於指定節點向leader發送心跳的間隔時間,單位毫秒,通常不用改;initLimit用於指定初始化階段要通過多個tickTime時長;超出則爲初始化超時或初始化失敗;syncLimit用戶指定同步階段須要通過多少個tickTime時長,超出指定的時長,則爲同步失敗,或同步超時;clientPort用於指定客戶端鏈接zk集羣所用端口,即zk集羣客戶監聽端口;後面的server.1使用於配置集羣第一個節點的信息;其語法格式爲server.id=[hostname or ipaddr ]:port:port[:observer];其中第一個port用於指定follower與leader進行通訊和數據同步時所使用端口;第二個port是指定leader選舉時使用的端口;集羣中有多少zk主機就要配置多少個server,而且每一個server的ID必須惟一,除此以外對應在配置文件中配置的serverID必須同對應server上的數據目錄下的myid文件內容中的ID保持一致;
zk配置參數說明
除了以上配置,zk還有其餘配置
存儲配置: preAllocSize:爲事務日誌預先分配的磁盤空間量;默認65535KB; snapCount:每多少次事務後執行一次快照操做;每事務的平均大小在100字節; autopurget.snapRetainCount:自動清理快照時,須要保存最近的快照個數; autopurge.purgeInterval:purge操做的時間間隔,0表示不啓動; fsync.warningthresholdms:zk進行事務日誌fsync操做時消耗的時長報警閾值; weight.X=N:判斷quorum時投票權限,默認1; 網絡配置: maxClientCnxns:每客戶端IP的最大併發鏈接數; clientPortAddress:zk監聽IP地址; minSessionTimeout:會話的最短超時時長; maxSessionTimeout:會話的最大超時時長 集羣配置: initLimit:Follower連入Leader並完成數據同步的時長; syncLimit:心跳檢測的最大延遲; leaderServes:默認zk的leader接收讀寫請求,額外還要負責協調各Follower發來的事務等;所以,爲使得leader集中處理zk集羣內部信息,建議不讓leader直接提供服務; cnxTimeout:Leader選舉期間,各服務器建立TCP鏈接的超時時長; ellectionAlg:選舉算法,目前僅支持FastLeaderElection算法一種;
複製配置文件到集羣各節點,建立數據目錄並在其數據目錄下各自建立用於保存節點id的myid文件,其內容僅爲當前節點的server id
[root@node01 conf]# scp zoo.cfg node02:/usr/local/zookeeper/conf/ zoo.cfg 100% 1244 412.3KB/s 00:00 [root@node01 conf]# scp zoo.cfg node03:/usr/local/zookeeper/conf/ zoo.cfg 100% 1244 486.7KB/s 00:00 [root@node01 conf]# mkdir /data/zookeeper -pv mkdir: created directory ‘/data’ mkdir: created directory ‘/data/zookeeper’ [root@node01 conf]# echo 1 >/data/zookeeper/myid [root@node01 conf]# cat /data/zookeeper/myid 1 [root@node01 conf]# ssh node02 'mkdir -pv /data/zookeeper/ && echo 2 >/data/zookeeper/myid && cat /data/zookeeper/myid' mkdir: created directory ‘/data’ mkdir: created directory ‘/data/zookeeper/’ 2 [root@node01 conf]# ssh node03 'mkdir -pv /data/zookeeper/ && echo 3 >/data/zookeeper/myid && cat /data/zookeeper/myid' mkdir: created directory ‘/data’ mkdir: created directory ‘/data/zookeeper/’ 3 [root@node01 conf]#
提示:這裏的myid中的server id是根據其配置文件中配置的server id,意思就是主配置文件中的server id 要和其當前主節點中的myid保持一致,不然zk集羣啓動不了;若是隻有一臺zkserver,能夠只配置單臺zkserver的屬性信息,不用在其數據目錄下建立myid保存serverID;
在各節點啓動zookeeper
[root@node01 ~]# /usr/local/zookeeper/bin/zkServer.sh --help /usr/bin/java ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg Usage: /usr/local/zookeeper/bin/zkServer.sh [--config <conf-dir>] {start|start-foreground|stop|version|restart|status|print-cmd} [root@node01 ~]# /usr/local/zookeeper/bin/zkServer.sh start /usr/bin/java ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg Starting zookeeper ... STARTED [root@node01 ~]# ssh node02 '/usr/local/zookeeper/bin/zkServer.sh start' /usr/bin/java ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg Starting zookeeper ... STARTED [root@node01 ~]# ssh node03 '/usr/local/zookeeper/bin/zkServer.sh start' /usr/bin/java ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg Starting zookeeper ... STARTED [root@node01 ~]# ss -tnl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:22 *:* LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 50 ::ffff:192.168.0.41:3888 :::* LISTEN 0 50 :::8080 :::* LISTEN 0 128 :::22 :::* LISTEN 0 100 ::1:25 :::* LISTEN 0 50 :::2181 :::* LISTEN 0 50 :::35879 :::* [root@node01 ~]#
提示:能夠看到node01上388八、218一、8080這三個端口都處於監聽狀態了;8080是jetty監聽的端口,用於管理用,若是修改其監聽端口能夠在配置文件中加admin.serverPort=來定義便可;
node02上監聽端口狀況
[root@node02 local]# ss -tnl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:22 *:* LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 50 ::ffff:192.168.0.42:3888 :::* LISTEN 0 50 :::8080 :::* LISTEN 0 128 :::22 :::* LISTEN 0 100 ::1:25 :::* LISTEN 0 50 :::2181 :::* LISTEN 0 50 :::35589 :::* LISTEN 0 50 ::ffff:192.168.0.42:2888 :::* [root@node02 local]#
提示:node02相對node01多監聽了一個2888端口,這個端口只有leader節點纔會監聽,從查看端口的狀況就能夠判斷node02此時是leader節點;
node03上監聽端口狀況
[root@node03 local]# ss -tnl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:22 *:* LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 50 ::ffff:192.168.0.43:3888 :::* LISTEN 0 50 :::8080 :::* LISTEN 0 128 :::22 :::* LISTEN 0 100 ::1:25 :::* LISTEN 0 50 :::46683 :::* LISTEN 0 50 :::2181 :::* [root@node03 local]#
提示:node03和node01同樣,都沒有監聽2888端口,說明這兩個幾點是follower節點;到此一個三節點的zookeeper集羣就搭建好了;
測試:使用zkServer.sh status查看當前節點狀態
提示:能夠看到node02是leader;
把node02的zk重啓,看看它是否仍是leader?
提示:能夠看到當node02重啓後,再次加入集羣就再也不是leader了;
使用zkCli.sh鏈接zk
[zk: localhost:2181(CONNECTED) 0] ? ZooKeeper -server host:port -client-configuration properties-file cmd args addWatch [-m mode] path # optional mode is one of [PERSISTENT, PERSISTENT_RECURSIVE] - default is PERSISTENT_RECURSIVE addauth scheme auth close config [-c] [-w] [-s] connect host:port create [-s] [-e] [-c] [-t ttl] path [data] [acl] delete [-v version] path deleteall path [-b batch size] delquota [-n|-b] path get [-s] [-w] path getAcl [-s] path getAllChildrenNumber path getEphemerals path history listquota path ls [-s] [-w] [-R] path printwatches on|off quit reconfig [-s] [-v version] [[-file path] | [-members serverID=host:port1:port2;port3[,...]*]] | [-add serverId=host:port1:port2;port3[,...]]* [-remove serverId[,...]*] redo cmdno removewatches path [-c|-d|-a] [-l] set [-s] [-v version] path data setAcl [-s] [-v version] [-R] path acl setquota -n|-b val path stat [-w] path sync path version Command not found: Command not found ? [zk: localhost:2181(CONNECTED) 1]
提示:在集羣任意一個節點使用zkCli.sh 便可鏈接當前節點的2181端口;鏈接之後會有一個zk的控制檯,咱們輸入一個不存在的命令,可打印在當前控制檯上所使用的命令有哪些;
查看數據節點
[zk: localhost:2181(CONNECTED) 1] ls ls [-s] [-w] [-R] path [zk: localhost:2181(CONNECTED) 2] ls / [zookeeper] [zk: localhost:2181(CONNECTED) 3]
提示:zk的數據節點相似Linux文件系統,它也是一顆倒置的樹狀結構;
建立一個數據節點,並給一個數據內容將其存入到建立的節點
[zk: localhost:2181(CONNECTED) 11] create /test "test01" Created /test [zk: localhost:2181(CONNECTED) 12] ls / [test, zookeeper] [zk: localhost:2181(CONNECTED) 13]
提示:默認不指定任何選項,建立的節點都是持久節點,即會話斷開對應節點不會自動刪除;若是須要建立一個臨時節點須要用到-e選項來明確指定建立一個臨時節點;
查看/test節點的數據
[zk: localhost:2181(CONNECTED) 13] get /test test01 [zk: localhost:2181(CONNECTED) 14]
修改/test節點的數據
[zk: localhost:2181(CONNECTED) 14] set /test "test data version 2" [zk: localhost:2181(CONNECTED) 15] get /test test data version 2 [zk: localhost:2181(CONNECTED) 16]
刪除/test節點
[zk: localhost:2181(CONNECTED) 16] delete /test [zk: localhost:2181(CONNECTED) 17] ls / [zookeeper] [zk: localhost:2181(CONNECTED) 18]
提示:delete是刪除一個下面沒有子節點的節點,若是對應節點下還有子節點,須要用到deleteall來刪除;
刪除帶有子節點的節點
[zk: localhost:2181(CONNECTED) 25] ls / [zookeeper] [zk: localhost:2181(CONNECTED) 26] create /test "test01" Created /test [zk: localhost:2181(CONNECTED) 27] ls / [test, zookeeper] [zk: localhost:2181(CONNECTED) 28] create /test/aa "test02" Created /test/aa [zk: localhost:2181(CONNECTED) 29] ls /test [aa] [zk: localhost:2181(CONNECTED) 30] ls -R /test /test /test/aa [zk: localhost:2181(CONNECTED) 31] delete /test Node not empty: /test [zk: localhost:2181(CONNECTED) 32] deleteall /test [zk: localhost:2181(CONNECTED) 33] ls / [zookeeper] [zk: localhost:2181(CONNECTED) 34]
提示:ls -R表示遞歸查看指定節點及其子節點;
查看集羣成員配置信息
[zk: localhost:2181(CONNECTED) 38] config server.1=192.168.0.41:2888:3888:participant server.2=192.168.0.42:2888:3888:participant server.3=192.168.0.43:2888:3888:participant version=0 [zk: localhost:2181(CONNECTED) 39]
查看指定節點的狀態信息
[zk: localhost:2181(CONNECTED) 40] stat stat [-w] path [zk: localhost:2181(CONNECTED) 41] stat / cZxid = 0x0 ctime = Thu Jan 01 08:00:00 CST 1970 mZxid = 0x0 mtime = Thu Jan 01 08:00:00 CST 1970 pZxid = 0x200000014 cversion = 9 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 0 numChildren = 1 [zk: localhost:2181(CONNECTED) 42
zk四字命令使用
查看生效的配置
[root@node01 ~]# echo conf |nc node01 2181 conf is not executed because it is not in the whitelist. [root@node01 ~]#
提示:默認zk沒有開啓四字命令;須要到配置文件中配置4lw.commands.whitelist=*,而後保存重啓zk便可支持四字命令;
重啓zk,再來使用conf命令查看生效配置信息
[root@node01 ~]# /usr/local/zookeeper/bin/zkServer.sh restart /usr/bin/java ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg /usr/bin/java ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg Stopping zookeeper ... STOPPED /usr/bin/java ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg Starting zookeeper ... STARTED [root@node01 ~]# echo conf |nc node01 2181 clientPort=2181 secureClientPort=-1 dataDir=/data/zookeeper/version-2 dataDirSize=134218360 dataLogDir=/data/zookeeper/version-2 dataLogSize=134218360 tickTime=2000 maxClientCnxns=60 minSessionTimeout=4000 maxSessionTimeout=40000 clientPortListenBacklog=-1 serverId=1 initLimit=10 syncLimit=5 electionAlg=3 electionPort=3888 quorumPort=2888 peerType=0 membership: server.1=192.168.0.41:2888:3888:participant server.2=192.168.0.42:2888:3888:participant server.3=192.168.0.43:2888:3888:participant version=0[root@node01 ~]#
查看當前server上的zk鏈接信息
[root@node01 ~]# echo cons | nc node01 2181 /192.168.0.41:58920[0](queued=0,recved=1,sent=0) [root@node01 ~]#
測試zk是否可以正常鏈接
[root@node01 ~]# echo ruok | nc node01 2181 imok[root@node01 ~]#
提示:返回imok表示zk節點上能夠正常鏈接的;
列出當前zkserver的版本信息、數據接收/發送量、鏈接數、節點模式、Node數、最大/平均/最小延遲數
[root@node01 ~]# echo srvr | nc node01 2181 Zookeeper version: 3.6.2--803c7f1a12f85978cb049af5e4ef23bd8b688715, built on 09/04/2020 12:44 GMT Latency min/avg/max: 0/0.0/0 Received: 6 Sent: 5 Connections: 1 Outstanding: 0 Zxid: 0x200000016 Mode: follower Node count: 5 [root@node01 ~]#
列出事件監聽器的鏈接數和總數
[root@node01 ~]# echo wchs |nc node01 2181 0 connections watching 0 paths Total watches:0 [root@node01 ~]#
列出當前zkserver的環境信息
[root@node01 ~]# echo envi| nc node01 2181 Environment: zookeeper.version=3.6.2--803c7f1a12f85978cb049af5e4ef23bd8b688715, built on 09/04/2020 12:44 GMT host.name=node01.test.org java.version=1.8.0_262 java.vendor=Oracle Corporation java.home=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64/jre java.class.path=/usr/local/zookeeper/bin/../zookeeper-server/target/classes:/usr/local/zookeeper/bin/../build/classes:/usr/local/zookeeper/bin/../zookeeper-server/target/lib/*.jar:/usr/local/zookeeper/bin/../build/lib/*.jar:/usr/local/zookeeper/bin/../lib/zookeeper-prometheus-metrics-3.6.2.jar:/usr/local/zookeeper/bin/../lib/zookeeper-jute-3.6.2.jar:/usr/local/zookeeper/bin/../lib/zookeeper-3.6.2.jar:/usr/local/zookeeper/bin/../lib/snappy-java-1.1.7.jar:/usr/local/zookeeper/bin/../lib/slf4j-log4j12-1.7.25.jar:/usr/local/zookeeper/bin/../lib/slf4j-api-1.7.25.jar:/usr/local/zookeeper/bin/../lib/simpleclient_servlet-0.6.0.jar:/usr/local/zookeeper/bin/../lib/simpleclient_hotspot-0.6.0.jar:/usr/local/zookeeper/bin/../lib/simpleclient_common-0.6.0.jar:/usr/local/zookeeper/bin/../lib/simpleclient-0.6.0.jar:/usr/local/zookeeper/bin/../lib/netty-transport-native-unix-common-4.1.50.Final.jar:/usr/local/zookeeper/bin/../lib/netty-transport-native-epoll-4.1.50.Final.jar:/usr/local/zookeeper/bin/../lib/netty-transport-4.1.50.Final.jar:/usr/local/zookeeper/bin/../lib/netty-resolver-4.1.50.Final.jar:/usr/local/zookeeper/bin/../lib/netty-handler-4.1.50.Final.jar:/usr/local/zookeeper/bin/../lib/netty-common-4.1.50.Final.jar:/usr/local/zookeeper/bin/../lib/netty-codec-4.1.50.Final.jar:/usr/local/zookeeper/bin/../lib/netty-buffer-4.1.50.Final.jar:/usr/local/zookeeper/bin/../lib/metrics-core-3.2.5.jar:/usr/local/zookeeper/bin/../lib/log4j-1.2.17.jar:/usr/local/zookeeper/bin/../lib/json-simple-1.1.1.jar:/usr/local/zookeeper/bin/../lib/jline-2.14.6.jar:/usr/local/zookeeper/bin/../lib/jetty-util-9.4.24.v20191120.jar:/usr/local/zookeeper/bin/../lib/jetty-servlet-9.4.24.v20191120.jar:/usr/local/zookeeper/bin/../lib/jetty-server-9.4.24.v20191120.jar:/usr/local/zookeeper/bin/../lib/jetty-security-9.4.24.v20191120.jar:/usr/local/zookeeper/bin/../lib/jetty-io-9.4.24.v20191120.jar:/usr/local/zookeeper/bin/../lib/jetty-http-9.4.24.v20191120.jar:/usr/local/zookeeper/bin/../lib/javax.servlet-api-3.1.0.jar:/usr/local/zookeeper/bin/../lib/jackson-databind-2.10.3.jar:/usr/local/zookeeper/bin/../lib/jackson-core-2.10.3.jar:/usr/local/zookeeper/bin/../lib/jackson-annotations-2.10.3.jar:/usr/local/zookeeper/bin/../lib/commons-lang-2.6.jar:/usr/local/zookeeper/bin/../lib/commons-cli-1.2.jar:/usr/local/zookeeper/bin/../lib/audience-annotations-0.5.0.jar:/usr/local/zookeeper/bin/../zookeeper-*.jar:/usr/local/zookeeper/bin/../zookeeper-server/src/main/resources/lib/*.jar:/usr/local/zookeeper/bin/../conf: java.library.path=/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib java.io.tmpdir=/tmp java.compiler=<NA> os.name=Linux os.arch=amd64 os.version=3.10.0-693.el7.x86_64 user.name=root user.home=/root user.dir=/root os.memory.free=26MB os.memory.max=889MB os.memory.total=37MB [root@node01 ~]#
好了,到此zk集羣搭建就完成了,一般zk集羣應用的場景不少,好比分佈式應用程序能夠基於它實現數據的發佈/訂閱、負載均衡、名稱服務、分佈式協調/通知、集羣管理、Master選舉、分佈式鎖和分佈式隊列;不少分佈式服務均可以藉助zk集羣作服務發現和服務註冊;