分散式協調服務之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選舉產生,提供讀寫服務;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叢集觸發一次新的選舉,都會經過上述狀態的轉換;
六、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配置引數說明
除了以上配置,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演算法一種;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叢集啟動不了;
在各節點啟動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叢集做服務發現和服務注