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

添加觀察者

  1. 和前三個一樣,在tmp目錄創建哨兵使用的目錄 分別是 zoo_data_4 zoo_logs_4
  2. 在zoo_data_4目錄下創建它myid文件,寫入4
  3. 更改前三個節點的配置文件
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
  1. 添加觀察者的配置文件
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中的數據可能不是最新的數據