不知道怎麼安裝zk的能夠閱讀本博客文章<安裝Zookeeper到Linux>html
Zookeeper集羣是由一個leader(負責人)主機和多個follower(追隨者)或observer(觀察者)主機組成。
構建一個Zookeeper集羣須要有一個leader和一個folloer或observer,共兩臺主機組成,建議最少三臺,當一臺leader故障時,集羣還能夠選舉出新的leader,保證集羣正常工做。java
leader負責接受寫請求並通知follower/observer同步數據。
全部客戶端的寫請求都會轉發到leader(就算是客戶端鏈接的是follower/observer),leader會進行原子廣播(atomic broadcast)通知follower/observer從leader的複製數據庫(replicated database)中同步數據,集羣中全部的follower/observer都更新成功或失敗後返回響應給客戶端。
原子廣播:原子性,所有都更新成功或者失敗。linux
leader,領導者,接受全部寫請求,存儲並廣播集羣中的follower/observer同步數據;事務請求的惟一調度者和處理者,保證集羣事務處理的順序性。
follower,追隨者,接受客戶端全部請求,讀請求就本身處理,寫請求就轉發給leader處理;參與事務請求提議的投票(客戶端的一個事務請求,須要半數服務器投票經過之後才能通知leader提交,以保證集羣中全部主機中數據實時同步);當leader故障時,參與leader選舉投票,有可能成爲新的leader。
observer,觀察者,接受客戶端全部請求,讀請求就本身處理。寫請求就轉發給leader處理;不參與投票,不會被選舉爲leader。若是一個集羣是由一個leader,一個follower,一個observer組成的話,當leader故障時,集羣則不可用(一個可用集羣須要有兩臺可用服務器參與投票)。可是當擴展了足夠數量的主機節點時,若參與投票節點的數量過多,致使寫入性能降低的時候,則能夠考慮將主機節點設置爲該類型,能夠減小投票參與者數量。數據庫
(1)根據zxid選舉leader,zxid越大則約優先,若全部服務器上的zxid都相同則根據(2)。
(2)根據myid選舉leader,myid越大則越優先。apache
說明:
zxid:事務ID,服務器中存放的最新的數據ID,zxid越大說明數據最新。
myid:服務器ID,在集羣中服務器的惟一標識。ubuntu
舉例:
由A,B,C三臺主機組成集羣,三臺主機都是新建的,數據都爲空,它們的zxid都是相同的。
A的myid=1,B的myid=2,C的myid=3。
則按順位A,B,C啓動服務,則A和B對比時,B的myid大,則B會被選舉爲leader。
在使用過程當中,B(leader)故障,又會從新選舉leader,若C的數據最新,zxid大則會被選舉爲新的leader,若A,C數據都相同,即zxid相同,則C會被選舉爲新的leader,由於它myid最大。vim
在3.5.0版本發佈以前,Zookeeper 的成員身份和全部其餘配置參數都是靜態的,在啓動期間加載,在運行時是不可變。運維人員使用"滾動重啓"方法來擴展或減小集羣中主機節點的數量,這是一種手動密集型且容易出錯的方法來更改致使數據丟失和生產不一致的配置(若是不中止Zk集羣擴展或減小主機節點,則可能會出現沒法恢復的異常問題)。
從3.5.0版本開始,Zookeeper徹底支持自動配置的更改,Zookeeper支持動態的修改配置信息(增長或減小主機節點),無需服務中斷,同時保持數據一致性。
從新配置"reconfig"只須要在集羣中的任意一臺主機上操做,集羣中全部主機都會同步配置信息。
官方文檔:https://zookeeper.apache.org/doc/r3.5.4-beta/zookeeperReconfig.html
在3.5.0~3版本,任意客戶端均可以動態的使用"reconfig"來修改集羣的配置信息,這可能會有服務器被攻破的惡意客戶端隨意的篡改配置信息,因此在3.5.3以後的版本Zookeeper引入了權限驗證機制,要使用"reconfig"從新配置功能則客戶端須要先使用"addauth"進行身份驗證。服務器
Zk集羣的構建很是簡單,本次只是爲了實驗,因此我將在一臺主機上建立不一樣的Zk程序構建成集羣,如果在生產環境下,建議在不一樣的主機上運行Zk程序。
注:角色有participant和observer,這邊將主機標記爲participant即表示服務器爲參與者,可經過選舉投票成爲leader或follower。運維
程序名稱 | myid | 主機地址 | 客戶端端口 | API端口 | 集羣通信端口 | 集羣選舉端口 | 角色 |
---|---|---|---|---|---|---|---|
zk01 | 1 | 127.0.0.1 | 1888 | 1889 | 2181 | 8081 | participant |
zk02 | 2 | 127.0.0.1 | 2888 | 2889 | 2182 | 8082 | participant |
zk03 | 3 | 127.0.0.1 | 3888 | 3889 | 2183 | 8083 | participant |
Zookeeper須要JDK的支持。
注:須要先去JDK官網下載安裝包。分佈式
root@ubuntu:~# mkdir /usr/local/jdk # 建立程序安裝目錄 root@ubuntu:~# tar -xvzf jdk-8u211-linux-x64.tar.gz -C /usr/local/jdk/ # 解壓安裝包 root@ubuntu:~# vim /etc/profile # 配置環境變量 # jdk export JAVA_HOME="/usr/local/jdk/jdk1.8.0_211/" export PATH="$JAVA_HOME/bin:$PATH" root@ubuntu:~# source /etc/profile # 使系統環境變量當即生效 root@ubuntu:~# java -version # 查看java版本以驗證jdk安裝成功 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)
root@ubuntu:~# mkdir /opt/zk-cluster root@ubuntu:~# mkdir -p /opt/zk-cluster/zk01 root@ubuntu:~# mkdir -p /opt/zk-cluster/zk02 root@ubuntu:~# mkdir -p /opt/zk-cluster/zk03
root@ubuntu:~# wget http://mirror.bit.edu.cn/apache/zookeeper/stable/apache-zookeeper-3.5.8-bin.tar.gz root@ubuntu:~# tar xzvf apache-zookeeper-3.5.8-bin.tar.gz -C /opt/zk-cluster/zk01/ root@ubuntu:~# tar xzvf apache-zookeeper-3.5.8-bin.tar.gz -C /opt/zk-cluster/zk02/ root@ubuntu:~# tar xzvf apache-zookeeper-3.5.8-bin.tar.gz -C /opt/zk-cluster/zk03/
root@ubuntu:~# mkdir /opt/zk-cluster/zk01/apache-zookeeper-3.5.8-bin/data root@ubuntu:~# mkdir /opt/zk-cluster/zk02/apache-zookeeper-3.5.8-bin/data root@ubuntu:~# mkdir /opt/zk-cluster/zk03/apache-zookeeper-3.5.8-bin/data root@ubuntu:~# echo 1 > /opt/zk-cluster/zk01/apache-zookeeper-3.5.8-bin/data/myid root@ubuntu:~# echo 2 > /opt/zk-cluster/zk02/apache-zookeeper-3.5.8-bin/data/myid root@ubuntu:~# echo 3 > /opt/zk-cluster/zk03/apache-zookeeper-3.5.8-bin/data/myid
root@ubuntu:~# vim /opt/zk-cluster/zk01/apache-zookeeper-3.5.8-bin/conf/zoo.cfg # zk01-主配置 tickTime=2000 # 心跳超時時間,單位爲毫秒。客戶端與服務端,服務端與服務端之間的通訊超時時間。 initLimit=10 # 集羣初始化時,follower服務器和leader服務器之間超時鏈接次數(tickTime超時屢次)。 syncLimit=5 # 集羣同步數據時,follower服務器和leader服務器之間超時鏈接次數(tickTime超時屢次)。 dataDir=/opt/zk-cluster/zk01/apache-zookeeper-3.5.8-bin/data # 數據存儲目錄。 # clientPort=2181 # 客戶端鏈接所使用的端口。支持舊版本使用的配置,建議在獨立的動態配置文件的主機節點配置條目中綁定客戶端 # 地址和端口。 maxClientCnxns=100 # 容許接受的最大客戶端鏈接數。 admin.serverPort=8081 # API監聽端口。 ### zk 集羣 ### standaloneEnabled=false # 禁用以獨立的方式啓動Zk。將此項值設置爲"false"則表示以集羣分佈式模式(Distributed)啓用Zk。要禁用此項 # 的前提須要集羣節點主機數量是大於>2。 # 默認狀況下,standaloneEnabled=true,若是一開始就有多個服務器,則它將不容許縮減到包含少於兩個參與者 # (participant)。 reconfigEnabled=true # 啓用從新配置功能,容許使用"reconfig"指令動態配置集羣,動態的增長和減小主機節點,啓用此功能後,配置將 # 由Zk集羣託管,配置會發生重寫,集羣的配置會獨立到一個單獨的動態文件中,由配置項"dynamicConfigFile"關 # 聯。使用"reconfig"指令須要啓用權限驗證功能"- # Dzookeeper.DigestAuthenticationProvider.superDigest=su:gACzJ4L2A0F2ygTno5HQnfabuik="。 # 注:此功能在3.5.3版本後加入的新功能,若是是以前的版本則不支持。 dynamicConfigFile=/opt/zk-cluster/zk01/apache-zookeeper-3.5.8-bin/conf/zoo.cfg.dynamic # 關聯動態配置文件,獨立的集羣主機節點配置文件。 root@ubuntu:~# vim /opt/zk-cluster/zk01/apache-zookeeper-3.5.8-bin/conf/zoo.cfg.dynamic # zk01-動態配置 # 配置格式: # server.myid=主機地址:集羣通訊端口:集羣選舉端口:角色{參與者(participant)或觀察者(observer)};客 # 戶端監聽地址:監聽端口。 server.1=127.0.0.1:1888:1889:participant;2181 server.2=127.0.0.1:2888:2889:participant;2182 server.3=127.0.0.1:3888:3889:participant;2183 ------------------------------------------------------------------------------------------------------- root@ubuntu:~# vim /opt/zk-cluster/zk02/apache-zookeeper-3.5.8-bin/conf/zoo.cfg # zk02-主配置 tickTime=2000 initLimit=10 syncLimit=5 dataDir=/opt/zk-cluster/zk02/apache-zookeeper-3.5.8-bin/data maxClientCnxns=100 admin.serverPort=8082 standaloneEnabled=false reconfigEnabled=true dynamicConfigFile=/opt/zk-cluster/zk02/apache-zookeeper-3.5.8-bin/conf/zoo.cfg.dynamic root@ubuntu:~# vim /opt/zk-cluster/zk02/apache-zookeeper-3.5.8-bin/conf/zoo.cfg.dynamic # zk02-動態配置 server.1=127.0.0.1:1888:1889:participant;2181 server.2=127.0.0.1:2888:2889:participant;2182 server.3=127.0.0.1:3888:3889:participant;2183 ------------------------------------------------------------------------------------------------------- root@ubuntu:~# vim /opt/zk-cluster/zk03/apache-zookeeper-3.5.8-bin/conf/zoo.cfg # zk03-主配置 tickTime=2000 initLimit=10 syncLimit=5 dataDir=/opt/zk-cluster/zk03/apache-zookeeper-3.5.8-bin/data maxClientCnxns=100 admin.serverPort=8083 standaloneEnabled=false reconfigEnabled=true dynamicConfigFile=/opt/zk-cluster/zk03/apache-zookeeper-3.5.8-bin/conf/zoo.cfg.dynamic root@ubuntu:~# vim /opt/zk-cluster/zk03/apache-zookeeper-3.5.8-bin/conf/zoo.cfg.dynamic # zk03-動態配置 server.1=127.0.0.1:1888:1889:participant;2181 server.2=127.0.0.1:2888:2889:participant;2182 server.3=127.0.0.1:3888:3889:participant;2183
將集羣中的服務配置成快捷指令,這就會操做更便捷。
root@ubuntu:~# vim /etc/profile.d/alias_zk_cluster.sh alias zkclient='/opt/zk-cluster/zk01/apache-zookeeper-3.5.8-bin/bin/zkCli.sh' alias zkserver01='/opt/zk-cluster/zk01/apache-zookeeper-3.5.8-bin/bin/zkServer.sh' alias zkserver02='/opt/zk-cluster/zk02/apache-zookeeper-3.5.8-bin/bin/zkServer.sh' alias zkserver03='/opt/zk-cluster/zk03/apache-zookeeper-3.5.8-bin/bin/zkServer.sh' root@ubuntu:~# source /etc/profile
Zk採用插件的方式控制一些特殊功能的啓用,因此只須要在啓動的命令中添加如下參數便可。
"-Dzookeeper.4lw.commands.whitelist=*"表示啓用全部四字指令。 "-Dzookeeper.DigestAuthenticationProvider.superDigest=zk:MsjFltVWzlTGMoDYclrWdyEQ9KU="表示設置超級管理員的帳號密碼,使用動態配置功能須要擁有超級管理員的權限。 root@ubuntu:~# echo -n zk:123|openssl dgst -binary -sha1 |openssl base64 # 基於用戶名和密碼組合生成密文密碼(sha1加密+base64編碼後的密碼) MsjFltVWzlTGMoDYclrWdyEQ9KU= root@ubuntu:~# vim /opt/zk-cluster/zk01/apache-zookeeper-3.5.8-bin/bin/zkServer.sh start) # 省略... nohup "$JAVA" $ZOO_DATADIR_AUTOCREATE "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" \ "-Dzookeeper.4lw.commands.whitelist=*" "-Dzookeeper.DigestAuthenticationProvider.superDigest=zk:MsjFltVWzlTGMoDYclrWdyEQ9KU=" \ "-Dzookeeper.log.file=${ZOO_LOG_FILE}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \ -XX:+HeapDumpOnOutOfMemoryError -XX:OnOutOfMemoryError='kill -9 %p' \ -cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" > "$_ZOO_DAEMON_OUT" 2>&1 < /dev/null & root@ubuntu:~# vim /opt/zk-cluster/zk02/apache-zookeeper-3.5.8-bin/bin/zkServer.sh # 同上 root@ubuntu:~# vim /opt/zk-cluster/zk03/apache-zookeeper-3.5.8-bin/bin/zkServer.sh # 同上
root@ubuntu:~# zkserver01 start root@ubuntu:~# zkserver02 start root@ubuntu:~# zkserver03 start
root@ubuntu:~# zkserver01 status Mode: follower root@ubuntu:~# echo conf | nc 127.0.0.1 2181 # 使用四字指令 root@ubuntu:~# echo stat| nc 127.0.0.1 2181 root@ubuntu:~# zkserver02 status Mode: leader root@ubuntu:~# echo conf | nc 127.0.0.1 2181 # 使用四字指令 root@ubuntu:~# echo stat| nc 127.0.0.1 2181 root@ubuntu:~# zkserver03 status Mode: follower root@ubuntu:~# echo stat| nc 127.0.0.1 2181 # 使用四字指令 root@ubuntu:~# echo conf | nc 127.0.0.1 2181
在Zk01上建立/test,在zk0二、zk03上查看。
root@ubuntu:~# zkclient -server 127.0.0.1:2181 create /test 'hello world'
Created /test
root@ubuntu:~# zkclient -server 127.0.0.1:2182 get /test
hello world
root@ubuntu:~# zkclient -server 127.0.0.1:2183 get /test
hello world
Zookeeper3.5.0版本之後支持動態的擴展和減小主機節點(動態配置功能),新的主機節點加入到集羣中,無需整個集羣中止。
我這邊在以前構建的Zk集羣的基礎上擴展一個主機節點zk04。
root@ubuntu:~# mkdir -p /opt/zk-cluster/zk04 # 建立程序工做目錄
root@ubuntu:~# tar xzvf apache-zookeeper-3.5.8-bin.tar.gz -C /opt/zk-cluster/zk04 # 解壓安裝包
root@ubuntu:~# mkdir /opt/zk-cluster/zk04/apache-zookeeper-3.5.8-bin/data # 建立數據目錄 root@ubuntu:~# echo 4 > /opt/zk-cluster/zk04/apache-zookeeper-3.5.8-bin/data/myid # 建立myid文件
root@ubuntu:~# vim /opt/zk-cluster/zk04/apache-zookeeper-3.5.8-bin/conf/zoo.cfg # zk04主配置 tickTime=2000 initLimit=10 syncLimit=5 dataDir=/opt/zk-cluster/zk04/apache-zookeeper-3.5.8-bin/data maxClientCnxns=100 admin.serverPort=8084 standaloneEnabled=false reconfigEnabled=true dynamicConfigFile=/opt/zk-cluster/zk04/apache-zookeeper-3.5.8-bin/conf/zoo.cfg.dynamic root@ubuntu:~# vim /opt/zk-cluster/zk04/apache-zookeeper-3.5.8-bin/conf/zoo.cfg.dynamic # zk04動態配置 server.1=127.0.0.1:1888:1889:participant;2181 server.2=127.0.0.1:2888:2889:participant;2182 server.3=127.0.0.1:3888:3889:participant;2183 # 添加如下配置只是爲了成功啓動服務,當服務加入到集羣中,動態配置會自動同步,與集羣中其餘節點配置信息保 # 持一致。 server.4=127.0.0.1:4888:4889:participant;2184
Zk採用插件的方式控制一些特殊功能的啓用,因此只須要在啓動的命令中添加如下參數便可。
"-Dzookeeper.4lw.commands.whitelist=*"表示啓用全部四字指令。 "-Dzookeeper.DigestAuthenticationProvider.superDigest=zk:MsjFltVWzlTGMoDYclrWdyEQ9KU="表示設置超級管理員的帳號密碼,使用動態配置功能須要擁有超級管理員的權限。 root@ubuntu:~# echo -n zk:123|openssl dgst -binary -sha1 |openssl base64 # 基於用戶名和密碼組合生成密文密碼(sha1加密+base64編碼後的密碼) MsjFltVWzlTGMoDYclrWdyEQ9KU= root@ubuntu:~# vim /opt/zk-cluster/zk04/apache-zookeeper-3.5.8-bin/bin/zkServer.sh # 開啓四字指令和動態配置功能 start) # 省略... nohup "$JAVA" $ZOO_DATADIR_AUTOCREATE "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" \ "-Dzookeeper.4lw.commands.whitelist=*" "-Dzookeeper.DigestAuthenticationProvider.superDigest=zk:MsjFltVWzlTGMoDYclrWdyEQ9KU=" \ "-Dzookeeper.log.file=${ZOO_LOG_FILE}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \ -XX:+HeapDumpOnOutOfMemoryError -XX:OnOutOfMemoryError='kill -9 %p' \ -cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" > "$_ZOO_DAEMON_OUT" 2>&1 < /dev/null &
root@ubuntu:~# vim /etc/profile.d/alias_zk_cluster.sh # 添加快捷命令 alias zkclient='/opt/zk-cluster/zk01/apache-zookeeper-3.5.8-bin/bin/zkCli.sh' # 省略... alias zkserver04='/opt/zk-cluster/zk04/apache-zookeeper-3.5.8-bin/bin/zkServer.sh'
root@ubuntu:~# zkserver04 start # 啓動服務
經過四字指令"stat"查看運行狀態,看到新節點的運行模式爲"follower",說明新主機節點已經成功加入集羣。
經過四字指令"conf"查看配置信息,發現配置已自動同步集羣配置,與集羣中其餘主機節點配置信息保持一致性。
root@ubuntu:~# echo stat | nc 127.0.0.1 2184 Mode: follower root@ubuntu:~# echo conf | nc 127.0.0.1 2184 # 省略... membership: server.1=127.0.0.1:1888:1889:participant;0.0.0.0:2181 server.2=127.0.0.1:2888:2889:participant;0.0.0.0:2182 server.3=127.0.0.1:3888:3889:participant;0.0.0.0:2183 version=100000000
只須要使用客戶端鏈接集羣中任意主機節點,動態添加新的主機節點便可,全部主機節點中的配置信息會自動同步。
root@ubuntu:~# zkclient -server 127.0.0.1:2181 [zk: 127.0.0.1:2181(CONNECTED) 0] addauth digest zk:123 # 使用超級管理員登陸Zk [zk: 127.0.0.1:2181(CONNECTED) 1] reconfig -add server.4=127.0.0.1:4888:4889:participant;2184 # 添加新的主機節點 [zk: 127.0.0.1:2181(CONNECTED) 2] config # 查看當前主機節點配置信息 server.1=127.0.0.1:1888:1889:participant;0.0.0.0:2181 server.2=127.0.0.1:2888:2889:participant;0.0.0.0:2182 server.3=127.0.0.1:3888:3889:participant;0.0.0.0:2183 server.4=127.0.0.1:4888:4889:participant;0.0.0.0:2184 version=200000002 [zk: 127.0.0.1:2181(CONNECTED) 3] quit
依次查看集羣中各個主機節點配置信息,查看是否一致。
若都一致則說明新的主機節點已成功加入到集羣中!
root@ubuntu:~# echo conf | nc 127.0.0.1 2181 # 省略... membership: server.1=127.0.0.1:1888:1889:participant;0.0.0.0:2181 server.2=127.0.0.1:2888:2889:participant;0.0.0.0:2182 server.3=127.0.0.1:3888:3889:participant;0.0.0.0:2183 server.4=127.0.0.1:4888:4889:participant;0.0.0.0:2184 version=200000002 root@ubuntu:~# echo conf | nc 127.0.0.1 2182 # 同上 root@ubuntu:~# echo conf | nc 127.0.0.1 2183 # 同上 root@ubuntu:~# echo conf | nc 127.0.0.1 2184 # 同上
Zookeeper3.5.0版本之後支持動態的擴展和減小主機節點(動態配置功能),減小集羣中的主機節點,只須要從集羣的配置中移除該節點便可,操做很是簡單。
執行移除操做須要超級管理員操做,超級管理員帳號密碼是"zk:123",超級管理員用戶名和密碼設置請查看"構建Zk集羣"。
使用客戶端鏈接任意主機節點,從新配置集羣,移除主機節點便可。
root@ubuntu:~# zkclient -server 127.0.0.1:2181 [zk: 127.0.0.1:2181(CONNECTED) 1] config # 查看集羣配置 server.1=127.0.0.1:1888:1889:participant;0.0.0.0:2181 server.2=127.0.0.1:2888:2889:participant;0.0.0.0:2182 server.3=127.0.0.1:3888:3889:participant;0.0.0.0:2183 server.4=127.0.0.1:4888:4889:participant;0.0.0.0:2184 version=200000002 [zk: 127.0.0.1:2181(CONNECTED) 2] addauth digest zk:123 # 使用超級管理員身份登陸Zk [zk: 127.0.0.1:2181(CONNECTED) 4] reconfig -remove 4 # 移除myid=4的主機節點 Committed new configuration: server.1=127.0.0.1:1888:1889:participant;0.0.0.0:2181 server.2=127.0.0.1:2888:2889:participant;0.0.0.0:2182 server.3=127.0.0.1:3888:3889:participant;0.0.0.0:2183 version=200000006 [zk: 127.0.0.1:2181(CONNECTED) 5] quit
root@ubuntu:~# zkserver04 stop