分布式協調服務之Zookeeper集群部署


  一、分布式系統概念

  在聊Zookeeper之前,我們先來聊聊什么是分布式系統;所謂分布式系統就是一個系統的軟件或硬件組件分布在網絡中的不同計算機之上,彼此間通過消息傳遞進行通信和協作的系統;簡單講就是一個系統的組件分布在不同網絡中的各主機上,彼此通過消息傳遞通信和協作,我們把這樣的系統就叫做分布式系統;

  二、分布式系統的特征

  1、分布性:所謂分布性就是指我們在上面描述的各組件分布在不同的網絡中的不同計算機上;

  2、對等性:所謂對等性是指不同計算節點上的組件沒有主從之分,所有組件的角色身份都是平等的;

  3、並發性:指集群中的各節點同時對一些資源進行並發訪問;各節點同時並發訪問一些資源,如何協調這些節點對同一資源的訪問是一個分布式系統面臨的一個問題;  

  4、缺乏全局時鍾:集群各節點組件沒有一個全局時鍾;

  5、故障必然會發生:這個是說一個分布式系統中的各個節點一定會故障發生;

  三、分布式系統常見的故障

  1、通信異常:集群各節點都是通過網絡通信,如果因各網絡設備故障或異常,或者網絡線路故障都可導致通信異常;

  2、網絡分區:在發生通信異常后,各節點間通信延遲變得越來越高,最終會導致一個分布式系統的所有節點中,一部分能夠正常通信,一部分不能正常通信,我們把這種現象叫做網絡發生了分區;比如,兩台server組成的集群,當其中一台server不能夠正常的聯系到另一台server,這個時候我們就說網絡發生了分區;對於網絡分區,如何界定哪台server的網絡故障就先得尤為重要;

  3、三態:指在分布式系統中各組件間的每一次請求和應答狀態;如果能夠正常響應請求我們就說本次請求成功被響應;反之,我們就說本次請求失敗;除了這兩種狀態外,還有第三種,在分布式系統中網絡是不可靠因素,因此各組件間調用就很有可能存在超時;所謂超時是指在一定時間范圍內請求一直沒有得到響應;

  4、節點故障:指分布式系統中各節點因各種原因導致節點故障;比如節點斷電宕機,人為操作不當等等;

  四、CAP理論和BASE理論

  CAP理論指一個分布式系統中,一致性(Consistency)、可用性(Availability)、分區容錯性(Partition tolerance);這三個要素最多只能同時滿足兩個;這樣一來我們的系統要么滿足一致性和可用性,要么滿足一致性和分區容錯性,要么滿足可用性和分區容錯性;我們知道一個分布式系統各組件間傳遞消息來通信,所以網絡分區容錯性應該必須滿足;這樣一來我們的系統就必須在一致性和可用性之間做權衡;

  BASE理論:BA表示基本可用,S表示軟狀態,E表示最終一致性;它主要是對CAP理論中的一致性和可用性進行權衡的結果;意思是說一個分布式系統應該滿足系統基本可用(允許部分節點不可用),在一定時間窗口內我們允許各節點之間數據不一致,但要保證最終一致;

  五、zookeeper簡介

  zookeeper是一個開源的分布式協調服務,由知名互聯網公司Yahoo創建,它是Chubby的開源實現;換句話講,zookeeper是一個典型的分布式數據一致性解決方案,分布式應用程序可以基於它實現數據的發布/訂閱、負載均衡、名稱服務、分布式協調/通知、集群管理、Master選舉、分布式鎖和分布式隊列;

  zookeeper集群中的相關概念

  集群角色:Leader、Follower、Observer;一個zookeeper(簡稱zk)集群,是由一個leader,多個Follower和Observer角色組成;其中Leader是由follower和observer選舉產生,提供讀寫服務;Follower參與選舉,能夠被選舉,提供讀服務;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集群觸發一次新的選舉,都會經過上述狀態的轉換;

  六、zookeeper集群部署

  環境說明

主機名 ip地址
node01 192.168.0.41
node02 192.168.0.42
node03 192.168.0.43

 

  

 

 

 

 

  1、集群各節點安裝jdk

[root@node01 ~]# yum install -y java-1.8.0-openjdk-devel

  提示:各節點的時間同步、selinux、iptables和firewalld服務的配置都要提前做好;

  驗證:在各節點執行java -version看看對應java的版本是不是我們安裝的版本?

  提示:只要在各節點上能夠看到對應版本的java信息出現,並且是我們指定的版本,說明java環境沒有問題;

  2、下載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]# 

  解壓二進制包,並把解壓后的目錄做軟鏈接

  提示:其他兩個節點都要做相同的操作;

  3、配置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字節;
                autopurge.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算法一種;        
View Code

  復制配置文件到集群各節點,創建數據目錄並在其數據目錄下各自創建用於保存節點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上3888、2181、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集群做服務發現和服務注冊;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM