ZooKeeper是一個分佈式的、開源的分佈式應用程序協調服務,能夠在分佈 式環境中實現應用配置管理、統一命名服務、狀態同步服務等功能。
ZooKeeper是一種爲分佈式應用所設計的高可用、高性能的開源協調服務,它提供了一項基本服務:分佈式鎖 服務。因爲ZooKeeper開源的特性,在其分佈式鎖實現的基礎上,又被摸索出了其它的功用,譬如:配置維 護、組服務、分佈式消息隊列等等。 ZooKeeper維護了一個相似文件系統的數據結構,其內部每一個子目錄都被 稱做znode(目錄節點),與文件系統同樣,咱們能夠自由的增刪改查znode。ZooKeeper集羣適合搭建在奇數 臺機器上。只要集羣中半數以上主機處於存活,那麼服務就是可用的。 ZooKeeper在配置文件中並無指定 master和slave,可是,ZooKeeper在工做時,只有一個節點爲leader,其他節點爲follower,leader是經過內部 的選舉機制臨時產生的。html
ZooKeeper特色
一、順序一致性:以zxid來保證事務的順序性。
二、原子性:以zab保證原子操做,要麼成功,要麼失敗。
三、單一視圖:客戶獲取到的數據始終是一致的。
四、可靠:以版本實現"寫入校驗",保證了數據寫入的正確性。java
ZooKeeper有三種安裝方式:單機模式 & 僞集羣模式 & 集羣模式
單機模式:ZooKeeper以單實例的形式運 行在一臺服務器上,適合測試環境。
僞集羣模式:在一臺服務器上跑多個ZooKeeper實例。
集羣模式: ZooKeeper運行在多臺服務器上,適合生產環境。
所需軟件包(提取碼:mqtp )node
一、單機安裝Zookeeperlinux
#安裝JDK環境 [root@zookeeper ~]# tar zxf jdk-8u211-linux-x64.tar.gz -C /usr/local/ [root@zookeeper ~]# vim /etc/profile # 編輯Java變量 .......................... export JAVA_HOME=/usr/local/jdk1.8.0_211 export JRE_HOME=/usr/local/jdk1.8.0_211/jre export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH [root@zookeeper ~]# source /etc/profile # 執行使配置生效 [root@zookeeper ~]# java -version # 查看是否安裝成功 java version "1.8.0_211" Java(TM) SE Runtime Environment (build 1.8.0_211-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode)
#安裝zookeeper [root@zookeeper ~]# tar zxf zookeeper-3.4.14.tar.gz -C /usr/local/ [root@zookeeper ~]# vim /etc/profile export ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.14 export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$ZOOKEEPER_HOME/bin:$PATH # 加入Java配置的PATH中 [root@zookeeper ~]# source /etc/profile [root@zookeeper ~]# cd /usr/local/zookeeper-3.4.14/conf/ [root@zookeeper conf]# cp zoo_sample.cfg zoo.cfg [root@zookeeper conf]# mkdir -p /usr/local/zookeeper-3.4.14/data # 建立數據目錄 [root@zookeeper conf]# sed -i "s/dataDir=\/tmp\/zookeeper/dataDir=\/usr\/local\/zookeeper-3.4.14\/data/g" zoo.cfg [root@zookeeper conf]# zkServer.sh start # 啓動服務 [root@zookeeper conf]# netstat -anput | grep 2181 # 肯定端口在監聽 tcp6 0 0 :::2181 :::* LISTEN 4903/java
1)客戶端命令操做apache
[root@zookeeper ~]# zkCli.sh # 後面不加任何參數默認鏈接localhost本機的2181端口 Connecting to localhost:2181 [zk: localhost:2181(CONNECTED) 0] help # 顯示客戶端支持的命令 [zk: localhost:2181(CONNECTED) 1] ls / # 查看當前zk中所包含的內容 [zookeeper] [zk: localhost:2181(CONNECTED) 2] ls2 / # 查看當前zk中的內容及詳情 [zookeeper] cZxid = 0x0 ctime = Thu Jan 01 08:00:00 CST 1970 mZxid = 0x0 mtime = Thu Jan 01 08:00:00 CST 1970 pZxid = 0x0 cversion = -1 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 0 numChildren = 1 [zk: localhost:2181(CONNECTED) 3] create /test1 neirong # 建立一個節點 Created /test1 [zk: localhost:2181(CONNECTED) 4] ls / # 能夠看到已經多了一個test1 [zookeeper, test1] [zk: localhost:2181(CONNECTED) 5] get /test1 # huo獲取節點信息,需寫絕對路徑 neirong # 節點數據信息 cZxid = 0x2 # 節點建立時額zxid ctime = Sat Apr 04 16:15:30 CST 2020 # 節點建立的時間 mZxid = 0x2 mtime = Sat Apr 04 16:15:30 CST 2020 # 節點最近一次更新的時間 pZxid = 0x2 cversion = 0 # 子結點數據更新次數 dataVersion = 0 # 本節點數據更新次數 aclVersion = 0 # 節點ACL的更新次數 ephemeralOwner = 0x0 dataLength = 7 # 節點數據長度 numChildren = 0 # 子結點的數量 [zk: localhost:2181(CONNECTED) 6] set /test1 "gengxin" # 更新節點數據 [zk: localhost:2181(CONNECTED) 7] get /test1 # 能夠看到已經更改成新的數據 gengxin [zk: localhost:2181(CONNECTED) 8] history # 列出zui最近所使用的命令 0 - help 1 - ls / 2 - ls2 / 3 - create /test1 neirong 4 - ls / 5 - get /test1 6 - set /test1 "gengxin" 7 - get /test1 8 - history [zk: localhost:2181(CONNECTED) 9] delete /test1 # 刪除節點,可是沒法刪除擁有子節點的 節點 [zk: localhost:2181(CONNECTED) 11] rmr /test1 # rmrk能夠刪除帶有子節點的節點
關於zoo.cfg配置參數說明可參考官方文檔
二、zookeeper單機僞集羣部署
在一臺主機上跑多個zk實例,每一個zk實例對應一個獨立的配置文件;可是每一個配置文件的clientPort & dataDir & dataLogDir絕對不能相同,還須要在dataDir中建立myid文件來指定該dataDir對應的zk實例。
環境以下:
這裏在一臺物理服務器上,部署3個zk實例
1)安裝zookeepervim
#安裝好JDK,可參考以前單機安裝 [root@zookeeper ~]# java -version java version "1.8.0_211" Java(TM) SE Runtime Environment (build 1.8.0_211-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode)
#安裝zookeeper [root@zookeeper ~]# tar zxf zookeeper-3.4.14.tar.gz -C /usr/local/ [root@zookeeper ~]# vim /etc/profile export ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.14 export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$ZOOKEEPER_HOME/bin:$PATH [root@zookeeper ~]# source /etc/profile
#建立數據目錄 [root@zookeeper ~]# mkdir -p /usr/local/zookeeper-3.4.14/{data_0,data_1,data_2} #建立myid文件,並填入ID值 [root@zookeeper ~]# echo 0 > /usr/local/zookeeper-3.4.14/data_0/myid [root@zookeeper ~]# echo 1 > /usr/local/zookeeper-3.4.14/data_1/myid [root@zookeeper ~]# echo 2 > /usr/local/zookeeper-3.4.14/data_2/myid #建立事務日誌目錄,官方創建儘可能給事務日誌做單獨的磁盤或掛載點,這會極大的提升zk性能 [root@zookeeper ~]# mkdir -p /usr/local/zookeeper-3.4.14/{logs_0,logs_1,logs_2} #配置server0 [root@zookeeper ~]# cd /usr/local/zookeeper-3.4.14/conf/ [root@zookeeper conf]# cp zoo_sample.cfg zoo_0.cfg [root@zookeeper conf]# egrep -v "^$|^#" zoo_0.cfg # 修改配置文件爲以下 tickTime=2000 initLimit=10 syncLimit=5 dataDir=/usr/local/zookeeper-3.4.14/data_0/ clientPort=2180 dataLogDir=/usr/local/zookeeper-3.4.14/logs_0/ server.0=127.0.0.1:2287:3387 server.1=127.0.0.1:2288:3388 server.2=127.0.0.1:2289:3389 #配置server1 [root@zookeeper conf]# cp zoo_0.cfg zoo_1.cfg # 複製以前的配置文件,修改個別參數 [root@zookeeper conf]# vim zoo_1.cfg dataDir=/usr/local/zookeeper-3.4.14/data_1/ clientPort=2181 dataLogDir=/usr/local/zookeeper-3.4.14/logs_1/ #配置server2 [root@zookeeper conf]# cp zoo_0.cfg zoo_2.cfg [root@zookeeper conf]# vim zoo_2.cfg dataDir=/usr/local/zookeeper-3.4.14/data_2/ clientPort=2182 dataLogDir=/usr/local/zookeeper-3.4.14/logs_2/ [root@zookeeper conf]# zkServer.sh start zoo_0.cfg # 我這裏是在conf目錄下,因此後面直接接着配置文件,若是不在conf下,則需寫全路徑 #啓動各實例 [root@zookeeper conf]# zkServer.sh start zoo_1.cfg [root@zookeeper conf]# zkServer.sh start zoo_2.cfg [root@zookeeper conf]# netstat -anput | grep java tcp6 0 0 :::2180 :::* LISTEN 9251/java tcp6 0 0 :::2181 :::* LISTEN 9291/java tcp6 0 0 :::2182 :::* LISTEN 9334/java #列出JVM [root@zookeeper conf]# jps 9377 Jps 9251 QuorumPeerMain 9334 QuorumPeerMain 9291 QuorumPeerMain #各實例都啓動以後就可使用客戶端進行鏈接了 [root@zookeeper conf]# zkCli.sh -server 127.0.0.1:2180 # 例
關於多個server的配置說明: 這些server表單服務器的條目。列出組成ZooKeeper服務的服務器。當服務器啓動 時,它經過在數據目錄中查找文件myid來知道它是哪一個服務器。該文件包含服務器號。 最後,注意每一個服務器 名後面的兩個端口號:「2287」和「3387」。對等點使用前一個端口鏈接到其餘對等點。這樣的鏈接是必要的,以便 對等點能夠通訊,例如,就更新的順序達成一致。更具體地說,ZooKeeper服務器使用這個端口將追隨者鏈接 到leader。當一個新的領導者出現時,追隨者使用這個端口打開一個TCP鏈接到領導者。因爲默認的領導人選舉 也使用TCP,咱們目前須要另外一個端口的領導人選舉。這是服務器條目中的第二個端口。
三、 ZooKeeper多機集羣部署
爲了得到可靠的zk服務,應該在多臺服務器上部署多個zk,只要集羣中大多數的zk服務啓動了,那麼總的zk服 務將是可用的。 在多臺主機上搭建ZooKeeper集羣的方式,與僞集羣幾乎是差很少的。
環境以下:
三臺服務器上都須要執行以下操做服務器
#安裝好JDK [root@zookeeper01 ~]# java -version java version "1.8.0_211" Java(TM) SE Runtime Environment (build 1.8.0_211-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode) #安裝好zookeeper [root@zookeeper01 ~]# tar zxf zookeeper-3.4.14.tar.gz -C /usr/local/ [root@zookeeper01 ~]# vim /etc/profile export ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.14 export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$ZOOKEEPER_HOME/bin:$PATH # 加入Java配置的PATH中 [root@zookeeper01 ~]# source /etc/profile
server0配置數據結構
[root@zookeeper01 ~]# mkdir -p /usr/local/zookeeper-3.4.14/{data,logs} [root@zookeeper01 ~]# echo 0 > /usr/local/zookeeper-3.4.14/data/myid [root@zookeeper01 ~]# cd /usr/local/zookeeper-3.4.14/conf/ [root@zookeeper01 conf]# cp zoo_sample.cfg zoo.cfg [root@zookeeper01 conf]# egrep -v "^$|^#" zoo.cfg # 修改配置文件爲以下 tickTime=2000 initLimit=10 syncLimit=5 dataDir=/usr/local/zookeeper-3.4.14/data/ clientPort=2181 dataLogDir=/usr/local/zookeeper-3.4.14/logs server.0=192.168.171.134:2288:3388 server.1=192.168.171.135:2288:3388 server.2=192.168.171.140:2288:3388 [root@zookeeper01 conf]# zkServer.sh start # 啓動實例 [root@zookeeper01 conf]# netstat -anput | grep java # 肯定端口在監聽 tcp6 0 0 :::43542 :::* LISTEN 40355/java tcp6 0 0 192.168.171.134:3388 :::* LISTEN 40355/java tcp6 0 0 :::2181 :::* LISTEN 40355/java
server1配置tcp
[root@zookeeper02 ~]# mkdir -p /usr/local/zookeeper-3.4.14/{data,logs} [root@zookeeper02 ~]# echo 1 > /usr/local/zookeeper-3.4.14/data/myid [root@zookeeper02 ~]# cd /usr/local/zookeeper-3.4.14/conf/ [root@zookeeper02 conf]# scp root@192.168.171.134:/usr/local/zookeeper-3.4.14/conf/zoo.cfg ./ [root@zookeeper02 conf]# zkServer.sh start [root@zookeeper02 conf]# netstat -anput | grep java tcp6 0 0 192.168.171.135:3388 :::* LISTEN 40608/java tcp6 0 0 :::2181 :::* LISTEN 40608/java
server2配置分佈式
[root@zookeeper03 ~]# mkdir -p /usr/local/zookeeper-3.4.14/{data,logs} [root@zookeeper03 ~]# echo 2 > /usr/local/zookeeper-3.4.14/data/myid [root@zookeeper03 ~]# cd /usr/local/zookeeper-3.4.14/conf/ [root@zookeeper03 conf]# scp root@192.168.171.134:/usr/local/zookeeper-3.4.14/conf/zoo.cfg ./ [root@zookeeper03 conf]# zkServer.sh start [root@zookeeper03 conf]# netstat -anput | grep java tcp6 0 0 192.168.171.140:3388 :::* LISTEN 12769/java tcp6 0 0 :::2181 :::* LISTEN 12769/java
查看各zk節點的狀態
[root@zookeeper01 /]# zkServer.sh status ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper-3.4.14/bin/../conf/zoo.cfg Mode: follower [root@zookeeper02 /]# zkServer.sh status # 02服務器爲leader ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper-3.4.14/bin/../conf/zoo.cfg Mode: leader [root@zookeeper03 /]# zkServer.sh status ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper-3.4.14/bin/../conf/zoo.cfg Mode: follower