zookeeper 單機. 集群環境搭建


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,而且,它還會收到投票的處理結果,保證自己和其他機器是數據一致性,從而大大提高系統的吞吐量

Learner

和Leader一起同步狀態的節點的統稱,Observer和Follower統稱為Learner

Zookeeper的CPA

CP: 當集群中的節點僅僅剩下Leader Follower時, Leader掛了,就得重新選舉,選舉的過程中系統不可用

AP: Leader Follower Observer ,這三者組成的就群,實現了AP, 當Leader掛了,同樣進行選舉, 但是Observer可以繼續接受client的請求,只不過Observer中的數據可能不是最新的數據


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM