zookeeper 單機. 集群環境搭建
- 2019 年 10 月 3 日
- 筆記
zookeeper分散式系統中面臨的很多問題, 如分散式鎖,統一的命名服務,配置中心,集群的管理Leader的選舉等
環境準備
分散式系統中各個節點之間通訊,Zookeeper保證了這個過程中 數據的唯一性,安全可靠
- 修改配置文件
將/conf/zoo_sample.cfg 修改成 zoo.cfg
配置文件解讀
# zookeeper 伺服器和客戶端之間維持心跳的時間間隔,即每個ticktime發送一個心跳包,單位是毫秒 # zookeeper 中session過期的時間是 ticktime*2 tickTime=2000 # Leader 允許Follower在initLimit時間內完成從Leader身上同步全部數據的工作, 隨機集群的不斷擴大,Follower從Leader上同步數據的時間就會變成,此時有必要,默認是0 initLimit=10 # Leader會和集群中的其他機器進行通訊,在syncLimit時間內,都沒有從Follower上獲取返回數據,就認為這個節點掛了 syncLimit=5 # 存儲快照文件的目錄,默認情況下事務日誌也在這裡了,下面單獨配置,因為因為日誌的寫性能影響zookeeper的性能 dataDir=E:\zookeeper\zookeeper-3.4.14\data dataLogDir=E:\zookeeper\zookeeper-3.4.14\log # the port at which the clients will connect # 客戶端連接的埠 clientPort=2181 # the maximum number of client connections. # increase this if you need to handle more clients #maxClientCnxns=60 # # Be sure to read the maintenance section of the # administrator guide before turning on autopurge. # # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance # # The number of snapshots to retain in dataDir #autopurge.snapRetainCount=3 # Purge task interval in hours # Set to "0" to disable auto purge feature #autopurge.purgeInterval=1
- 啟動
啟動的腳本在 /bin/目錄下
linux啟動 ./zkCli.sh -server localhost:2181
****
啟動成功,進入客戶端控制台
# 默認的節點叫zookeeper [zk: localhost:2181(CONNECTED) 1] ls / [zookeeper] # 創建一個節點 [zk: localhost:2181(CONNECTED) 11] create /changwu1 "num1" Created /changwu1 # 重新查看 [zk: localhost:2181(CONNECTED) 14] ls / [zookeeper, changwu1] # 獲取節點的內容 [zk: localhost:2181(CONNECTED) 17] get /changwu1 num1 cZxid = 0x2 ctime = Mon Sep 16 15:56:27 CST 2019 mZxid = 0x2 mtime = Mon Sep 16 15:56:27 CST 2019 pZxid = 0x2 cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 4 numChildren = 0 # 退出 quit # 刪除一個節點 [zk: localhost:2181(CONNECTED) 32] delete /changwu1 [zk: localhost:2181(CONNECTED) 33] ls / [zookeeper] # 遞歸刪除節點 rmr /path1/path2 這個path1 和 path2 其實是兩個節點 # 修改節點數據 set /path "value" # 節點的狀態 [zk: localhost:2181(CONNECTED) 50] stat /z1 cZxid = 0x5 ctime = Mon Sep 16 16:04:35 CST 2019 mZxid = 0x7 mtime = Mon Sep 16 16:06:31 CST 2019 pZxid = 0x6 cversion = 1 dataVersion = 1 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 8 numChildren = 1 # 創建永久有序節點 create -s /path
創建節點的形式,和我們mkdir,創建一個目錄結構是相似的
集群搭建
- 將zoo.cfg複製三份,並修改配置文件

第二個埠2887,用來同步Leader 和 Follower之間的數據, 第三個埠選舉新的Leader使用
- 在tmp目錄創建六個目錄 分別是 zoo_data_1-3 zoo_logs_1-3
- 創建myid文件
[root@139 tmp]# echo 1 > zoo_data_1/myid [root@139 tmp]# echo 2 > zoo_data_2/myid [root@139 tmp]# echo 3 > zoo_data_3/myid
啟動集群服務端
[root@139 bin]# ./zkServer.sh start ../conf/zoo1.cfg ZooKeeper JMX enabled by default Using config: ../conf/zoo1.cfg Starting zookeeper ... STARTED [root@139 bin]# ./zkServer.sh start ../conf/zoo2.cfg ZooKeeper JMX enabled by default Using config: ../conf/zoo2.cfg Starting zookeeper ... STARTED [root@139 bin]# ./zkServer.sh start ../conf/zoo3.cfg ZooKeeper JMX enabled by default Using config: ../conf/zoo3.cfg Starting zookeeper ... STARTED
分別查看各個節點的狀態
[root@139 bin]# ./zkServer.sh status ../conf/zoo3.cfg ZooKeeper JMX enabled by default Using config: ../conf/zoo3.cfg Mode: follower [root@139 bin]# ./zkServer.sh status ../conf/zoo1.cfg ZooKeeper JMX enabled by default Using config: ../conf/zoo1.cfg Mode: leader [root@139 bin]# ./zkServer.sh status ../conf/zoo2.cfg ZooKeeper JMX enabled by default Using config: ../conf/zoo2.cfg Mode: follower
連接客戶端
./zkCli -server localhost:服務端的埠號 zkCli.sh -server localhost:2181 zkCli.sh -server localhost:2182 zkCli.sh -server localhost:2183
添加觀察者
- 和前三個一樣,在tmp目錄創建哨兵使用的目錄 分別是 zoo_data_4 zoo_logs_4
- 在zoo_data_4目錄下創建它myid文件,寫入4
- 更改前三個節點的配置文件
tickTime=2000 initLimit=10 syncLimit=5 dataDir=/tmp/zoo_data_1 dataLogDir=/tmp/zoo_logs_1 clientPort=2181 # 第一個端用於Leader和Leanner之間同步, 第二個埠,用戶選舉過程中的投票通訊 server.1=localhost:2887:3887 server.2=localhost:2888:3888 server.3=localhost:2889:3889 server.4=localhost:2890:3890:observer
- 添加觀察者的配置文件
tickTime=2000 initLimit=10 syncLimit=5 dataDir=/tmp/zoo_data_4 dataLogDir=/tmp/zoo_logs_4 # 觀察者的配置 peerType=observer clientPort=2184 # 第一個端用於Leader和Leanner之間同步, 第二個埠,用戶選舉過程中的投票通訊 server.1=localhost:2887:3887 server.2=localhost:2888:3888 server.3=localhost:2889:3889 server.4=localhost:2890:3890:observer
集群中的角色
Leader
發起投票和決議,已經更新最終狀態
Follower
接收處理客戶端的請求,參與Leader發起的決議
Observer
接受客戶端的連接,將請求轉發給Leader位元組,但是它不參加投票,而僅僅同步Leader的狀態,它的zookeeper拓展的方式
為什麼會添加Observer呢? 這和zookeeper的工作方式息息相關:
一個zookeeper集群由多個Server組成,每一個Server都可以去處理多個client的請求, 如果是讀請求,用當前的Server的本地資料庫分本直接相應,但是,如果請求是改變zookeeper狀態的寫請求,就變得麻煩起來, zookeeper的leader節點會發起投票這個機制就是zab協議,超過半數的節點同意時,才會把這個操作載入到記憶體中,並對client進行回復
在這個過程中,zookeeper擔任兩個職能,一方面接受客戶端的連接,另一方面又得去發起投票決議, 這兩個功能限制了zookeeper的擴展想支援更多的客戶端連接,就得添加server,但是server越來越多每次發起投票就變的沉重,於是Observer應運而生
Observer,不會參加投票,在其他節點處於投票階段時,Observer接收client的連接,把連接轉發的leader,而且,它還會收到投票的處理結果,從而大大提高系統的吞吐量
Leaner
和Leader一起同步狀態的節點的統稱,Observer和Follower統稱為Leaner
Zookeeper的CPA
CP: 當集群中的節點僅僅剩下Leader Follower時, Leader掛了,就得重新選舉,選舉的過程中系統不可用
AP: Leader Follower Observer ,這三者組成的就群,實現了AP, 當Leader掛了,同樣進行選舉, 但是Observer可以繼續接受client的請求,只不過Observer中的數據可能不是最新的數據
