2 ZooKeeper
2.1 ZooKeeper使用場景
ZooKeeper是一個(gè)分布式服務(wù)框架, 它主要是用來解決分布式應(yīng)用中經(jīng)常遇到的一些數(shù)據(jù)管理問題, 如: 命名服務(wù), 狀態(tài)同步, 配置中心, 集群管理等
- 命名服務(wù): 命令服務(wù)是分布式系統(tǒng)中比較常見的一類場景. 命名服務(wù)是分布式系統(tǒng)最基本的公共服務(wù)之一. 在分布式系統(tǒng)中, 被命名的實(shí)體通澈蛑罚可以是集群中的機(jī)器, 提供的服務(wù)地址或遠(yuǎn)程對(duì)象等. 這些我們都可以統(tǒng)稱為名字, 其中較為常見的就是一些分布式服務(wù)框架(如 RPC, RMI)中的服務(wù)地址列表, 通過使用命名服務(wù), 客戶端應(yīng)用能夠根據(jù)指定名字來獲取資源的實(shí)體, 服務(wù)地址和提供者的信息等.
-
狀態(tài)同步: 解決微服務(wù)場景下, 服務(wù)動(dòng)態(tài)擴(kuò)容或者縮容時(shí), 服務(wù)動(dòng)態(tài)發(fā)現(xiàn)的問題. 不同的服務(wù)會(huì)將自己注冊(cè)到ZooKeeper, 消費(fèi)者通過連接ZooKeeper去獲得服務(wù)的地址. 無論是微服務(wù)擴(kuò)容還是服務(wù)宕機(jī), ZooKeeper都會(huì)同步給消費(fèi)者, 保證消費(fèi)者連接的都是可用的最新的服務(wù)地址
每個(gè)節(jié)點(diǎn)除了存儲(chǔ)數(shù)據(jù)內(nèi)容和node節(jié)點(diǎn)狀態(tài)信息之外, 還存儲(chǔ)了已經(jīng)注冊(cè)的APP狀態(tài)信息, 當(dāng)有些節(jié)點(diǎn)或APP不可用, 就將當(dāng)前狀態(tài)同步給其他服務(wù).
配置中心: 現(xiàn)在我們大多數(shù)應(yīng)用都是采用的是分布式開發(fā)的應(yīng)用, 搭建到不同的服務(wù)器上, 對(duì)于配置文件, 同一個(gè)應(yīng)用程序的配置文件一樣, 還有就是多個(gè)程序存在相同的配置, 當(dāng)我們配置文件中有個(gè)配置屬性需要改變, 我們需要改變每個(gè)程序的配置屬性, 這樣會(huì)很麻煩的去修改配置, 那么可以使用ZooKeeper來實(shí)現(xiàn)配置中心. ZooKeeper采用的是推拉相結(jié)合的方式: 客戶端向服務(wù)端注冊(cè)自己需要關(guān)注的節(jié)點(diǎn), 一旦該節(jié)點(diǎn)的數(shù)據(jù)發(fā)生變更, 那么服務(wù)端就會(huì)向相應(yīng)的客戶端發(fā)送Watcher事件通知, 客戶端接收到這個(gè)消息通知后, 需要主動(dòng)到服務(wù)端獲取最新的數(shù)據(jù)
集群管理: 所謂的集群管理, 包括集群監(jiān)控與集群控制兩大塊, 前者側(cè)重對(duì)集群運(yùn)行時(shí)狀態(tài)的收集, 后者則是對(duì)集群進(jìn)行操作和控制, 在日常開發(fā)和運(yùn)維過程中, 我們經(jīng)常會(huì)有類似于如下的需求:
希望知道當(dāng)前集群中究竟有多少機(jī)器在工作
對(duì)集群中每臺(tái)機(jī)器的運(yùn)行時(shí)狀態(tài)進(jìn)行數(shù)據(jù)收集
對(duì)集群中機(jī)器進(jìn)行上下線操作
ZooKeeper具有以下兩大特性
- 客戶端如果對(duì)ZooKeeper的一個(gè)數(shù)據(jù)節(jié)點(diǎn)注冊(cè)Watcher監(jiān)聽, 那么當(dāng)該數(shù)據(jù)節(jié)點(diǎn)的內(nèi)容或是其子節(jié)點(diǎn)列表發(fā)生變更時(shí), ZooKeeper服務(wù)器就會(huì)向訂閱的客戶端發(fā)送變更通知. 對(duì)在ZooKeeper上創(chuàng)建的臨時(shí)節(jié)點(diǎn), 一旦客戶端與服務(wù)器之間的會(huì)話失效, 那么該臨時(shí)節(jié)點(diǎn)也就會(huì)被自動(dòng)清除
- Watcher(事件監(jiān)聽器), 是ZooKeeper中的一個(gè)很重要的特性. ZooKeeper允許用戶在指定節(jié)點(diǎn)上注冊(cè)一些Watcher,. 并且在一些特定事件觸發(fā)的時(shí)候, ZooKeeper服務(wù)端會(huì)將事件通知到感興趣的客戶端上去, 該機(jī)制是ZooKeeper實(shí)現(xiàn)分布式協(xié)調(diào)服務(wù)的重要特性
0 生產(chǎn)者啟動(dòng)
1 生產(chǎn)者注冊(cè)至ZooKeeper
2 消費(fèi)者啟動(dòng)并訂閱頻道
3 ZooKeeper通知消費(fèi)者事件
4 消費(fèi)者調(diào)用生產(chǎn)者
5 監(jiān)控中心負(fù)責(zé)統(tǒng)計(jì)和監(jiān)控服務(wù)狀態(tài)
2.2 ZooKeeper單機(jī)安裝
單機(jī)版的ZooKeeper安裝
10.0.0.209
2.2.1 配置Java環(huán)境
官方依賴介紹: https://zookeeper.apache.org/doc/r3.4.14/zookeeperAdmin.html#sc_requiredSoftware
root@zookeeper:~# apt install openjdk-8-jdk -y
2.2.2 部署ZooKeeper-3.5.8
下載二進(jìn)制包: https://archive.apache.org/dist/zookeeper/zookeeper-3.5.8/
root@zookeeper:~# mkdir /apps
root@zookeeper:~# cd /apps
root@zookeeper:/apps# rz -E
rz waiting to receive.
root@zookeeper:/apps# ls
apache-zookeeper-3.5.8-bin.tar.gz
root@zookeeper:/apps# tar xvf apache-zookeeper-3.5.8-bin.tar.gz
root@zookeeper:/apps# cd apache-zookeeper-3.5.8-bin/bin
root@zookeeper:/apps/apache-zookeeper-3.5.8-bin/bin# ll
total 64
drwxr-xr-x 2 root root 4096 May 4 2020 ./
drwxr-xr-x 6 root root 4096 Dec 15 15:54 ../
-rwxr-xr-x 1 root root 232 May 4 2020 README.txt*
-rwxr-xr-x 1 root root 2067 May 4 2020 zkCleanup.sh*
-rwxr-xr-x 1 root root 1158 May 4 2020 zkCli.cmd*
-rwxr-xr-x 1 root root 1621 May 4 2020 zkCli.sh* #Linux客戶端腳本, 可以連接到ZooKeeper服務(wù)器執(zhí)行操作
-rwxr-xr-x 1 root root 1766 May 4 2020 zkEnv.cmd*
-rwxr-xr-x 1 root root 3690 May 4 2020 zkEnv.sh*
-rwxr-xr-x 1 root root 1286 May 4 2020 zkServer.cmd*
-rwxr-xr-x 1 root root 4573 May 4 2020 zkServer-initialize.sh*
-rwxr-xr-x 1 root root 9386 May 4 2020 zkServer.sh* #Linux服務(wù)啟動(dòng)腳本
-rwxr-xr-x 1 root root 996 May 4 2020 zkTxnLogToolkit.cmd*
-rwxr-xr-x 1 root root 1385 May 4 2020 zkTxnLogToolkit.sh*
2.2.3 編輯配置文件
root@zookeeper:/apps/apache-zookeeper-3.5.8-bin/conf# ll
total 20
drwxr-xr-x 2 root root 4096 May 4 2020 ./
drwxr-xr-x 6 root root 4096 Dec 15 15:54 ../
-rw-r--r-- 1 root root 535 May 4 2020 configuration.xsl
-rw-r--r-- 1 root root 2712 May 4 2020 log4j.properties
-rw-r--r-- 1 root root 922 May 4 2020 zoo_sample.cfg #模板配置文件
root@zookeeper:/apps/apache-zookeeper-3.5.8-bin/conf# cp zoo_sample.cfg zoo.cfg
root@zookeeper:/apps/apache-zookeeper-3.5.8-bin/conf# vim zoo.cfg
# The number of milliseconds of each tick
tickTime=2000 #集群中, 定義每次選舉的時(shí)間
# The number of ticks that the initial
# synchronization phase can take
initLimit=10 #集群中, 定義初始化次數(shù)的超時(shí)時(shí)間
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5 #集群中, 數(shù)據(jù)同步成功的超時(shí)次數(shù)
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
# dataDir=/tmp/zookeeper #ZooKeeper數(shù)據(jù)目錄的保存位置
dataDir=/apps/apache-zookeeper-3.5.8-bin/data
# 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
2.2.4 啟動(dòng)ZooKeeper
root@zookeeper:/apps/apache-zookeeper-3.5.8-bin/bin# ./zkServer.sh start
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /apps/apache-zookeeper-3.5.8-bin/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
2.2.5 驗(yàn)證ZooKeeper進(jìn)程
root@zookeeper:/apps/apache-zookeeper-3.5.8-bin/bin# ./zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /apps/apache-zookeeper-3.5.8-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: standalone #單機(jī)模式
root@zookeeper:/apps/apache-zookeeper-3.5.8-bin/bin# ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 127.0.0.53%lo:53 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 50 *:8080 *:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 50 *:46813 *:*
LISTEN 0 50 *:2181 #ZooKeeper監(jiān)聽2181端口 *:*
2.2.6 測試數(shù)據(jù)寫入
#!/usr/bin/env python
def myzk():
from kazoo.client import KazooClient
zk = KazooClient(hosts='10.0.0.209:2181')
zk.start()
zk.create('/zoo/data',makepath=True) #makepath=True 遞歸創(chuàng)建目錄
ret=zk.set('/zoo/data',"Hello World")
data=zk.get("/zoo/data")
print(data)
zk.stop()
myzk()
2.2.7 利用客戶端腳本, 操作ZooKeeper
root@zookeeper:/apps/apache-zookeeper-3.5.8-bin/bin# ./zkCli.sh
...
[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper] #zookeeper相當(dāng)于/下的一個(gè)目錄
[zk: localhost:2181(CONNECTED) 1] ls /zookeeper
[config, quota] #config, quota相當(dāng)于zookeeper目錄里的key
[zk: localhost:2181(CONNECTED) 6] get /zookeeper/quota #get命令查看一個(gè)key的值, 這里quota默認(rèn)沒有value
還原虛擬機(jī)準(zhǔn)備集群搭建
2.3 ZooKeeper集群
ZooKeeper集群用于解決單點(diǎn)和單機(jī)性能及數(shù)據(jù)高可用等問題
ZooKeeper是復(fù)制集群, 數(shù)據(jù)在每個(gè)節(jié)點(diǎn)都是相同的
通過選舉, 選出一個(gè)唯一的leader, 數(shù)據(jù)的寫入只通過leader寫入, 因?yàn)槿绻ㄟ^其他節(jié)點(diǎn)寫入, 無法保證數(shù)據(jù)一致性
客戶端連接到follower后寫入數(shù)據(jù), follower會(huì)把數(shù)據(jù)路由給leader, 由leader完成數(shù)據(jù)寫入, leader完成寫入后, 會(huì)把數(shù)據(jù)同步到其他follower節(jié)點(diǎn). 消費(fèi)者可以連接到任意節(jié)點(diǎn)去消費(fèi)數(shù)據(jù). 如果leader宕機(jī), 剩余節(jié)點(diǎn)會(huì)再次選舉出一個(gè)leader
ZooKeeper特性1:
寫操作的"過半寫成功策略": 用來判斷數(shù)據(jù)何時(shí)被認(rèn)為寫入完畢
舉例. 當(dāng)有五個(gè)節(jié)點(diǎn), 其中一個(gè)Leader節(jié)點(diǎn), 四個(gè)Follower節(jié)點(diǎn)時(shí)
客戶端發(fā)起數(shù)據(jù)寫入操作, 會(huì)由連接的follower把數(shù)據(jù)路由給leader, 由leader完成數(shù)據(jù)寫入, 再由leader同步給其他的follower節(jié)點(diǎn). 過半寫成功策略就規(guī)定了, 集群中, 有半數(shù)以上完成了數(shù)據(jù)寫入, 就認(rèn)為數(shù)據(jù)寫入完畢, 返回給客戶端數(shù)據(jù)寫入完畢, 之后再由leader把數(shù)據(jù)同步到其余未完成數(shù)據(jù)寫入的節(jié)點(diǎn), 有助于寫入性能提供
2.4 集群部署
zookeeper 集群特性:整個(gè)集群中只要有超過集群數(shù)量一半的 zookeeper 工作是正常的胁澳,那么整個(gè)集群對(duì)外就是可用的桨武,假如有 2 臺(tái)服務(wù)器做了一個(gè) zookeeper集群车酣,只要有任何一臺(tái)故障或宕機(jī),那么這個(gè)zookeeper 集群就不可用了醒陆,因?yàn)槭O碌囊慌_(tái)沒有超過集群一半的數(shù)量躏吊,但是假如有三臺(tái) zookeeper 組成一個(gè)集群普舆,那么損壞一臺(tái)就還剩兩臺(tái),大于 3 臺(tái)的一半表悬,所以損壞一臺(tái)還是可以正常運(yùn)行的弥锄,但是再損壞一臺(tái)就只剩一臺(tái)集群就不可用了。那么要是 4 臺(tái)組成一個(gè)zookeeper 集群,損壞一臺(tái)集群肯定是正常的籽暇,那么損壞兩臺(tái)就還剩兩臺(tái)温治,那么2 臺(tái)不大于集群數(shù)量的一半,所以 3 臺(tái)的 zookeeper 集群和 4 臺(tái)的 zookeeper 集群損壞兩臺(tái)的結(jié)果都是集群不可用戒悠,以此類推 5 臺(tái)和 6 臺(tái)以及 7 臺(tái)和 8 臺(tái)都是同理熬荆,所以這也就是為什么集群一般都是奇數(shù)的原因。
集群環(huán)境
Zoo1 - 10.0.0.209
Zoo2 - 10.0.0.199
Zoo3 - 10.0.0.189
- 三臺(tái)ZooKeeper安裝jdk
apt install openjdk-8-jdk -y
- 將ZooKeeper二進(jìn)制包上傳到/apps并解壓
mkdir /apps
cd /apps
tar xvf apache-zookeeper-3.5.8-bin.tar.gz
- 創(chuàng)建軟連接
ln -sv apache-zookeeper-3.5.8-bin/ /apps/zookeeper
- 創(chuàng)建ZooKeeper數(shù)據(jù)目錄
mkdir /apps/zookeeper/data
- 配置文件修改
拷貝模板文件
cp /apps/zookeeper/conf/zoo_sample.cfg /apps/zookeeper/conf/zoo.cfg
三個(gè)服務(wù)器的配置文件相同
vim /apps/zookeeper/conf/zoo.cfg
...
dataDir=/apps/zookeeper/data
...
maxClientCnxns=128 #單個(gè)客戶端IP可以和ZooKeeper保持的連接數(shù)
autopurge.snapRetainCount=16
autopurge.purgeInterval=6
server.1=10.0.0.209:2888:3888
server.2=10.0.0.199:2888:3888
server.3=10.0.0.189:2888:3888
tickTime=2000 #服務(wù)器與服務(wù)器之間的單次心跳檢測時(shí)間間隔绸狐,單位為毫秒
initLimit=10 #集群中 leader 服務(wù)器與 follower 服務(wù)器初始連接心跳次數(shù)卤恳,即多少個(gè) 2000 毫秒
syncLimit=5 # leader 與 follower 之間連接完成之后,后期檢測發(fā)送和應(yīng)答的心跳次數(shù)寒矿,如果該 follower 在設(shè)置的時(shí)間內(nèi)(5*2000)不能與 leader 進(jìn)行通信突琳,那么此 follower 將被視為不可用。
dataDir=/usr/local/zookeeper/data #自定義的 zookeeper 保存數(shù)據(jù)的目錄
clientPort=2181 #客戶端連接 Zookeeper 服務(wù)器的端口符相,Zookeeper 會(huì)監(jiān)聽這個(gè)端口拆融,接受客戶端的訪問請(qǐng)求
maxClientCnxns=128 #單個(gè)客戶端 IP 可以和 zookeeper 保持的連接數(shù)
autopurge.snapRetainCount=3 #3.4.0 中的新增功能:啟用后,ZooKeeper 自動(dòng)清除功能會(huì)將autopurge.snapRetainCount 最新快照和相應(yīng)的事務(wù)日志分別保留在 dataDir 和 dataLogDir 中啊终,并刪除其余部分镜豹,默認(rèn)值為 3。最小值為 3孕索。就是保存快照的數(shù)量.
autopurge.purgeInterval=1 # 3.4.0 及之后版本逛艰,ZK 提供了自動(dòng)清理日志和快照文件的功能,這個(gè)參數(shù)指定了清理頻率搞旭,單位是小時(shí)散怖,需要配置一個(gè) 1 或更大的整數(shù),默認(rèn)是 0肄渗,表示不開啟自動(dòng)清理功能
server.1=172.18.0.101:2888:3888 # server.服務(wù)器編號(hào)=服務(wù)器 IP:LF 數(shù)據(jù)同步端口:LF 選舉端口
server.2=172.18.0.102:2888:3888 # leader監(jiān)聽2888
server.3=172.18.0.103:2888:3888 # leader和follower都會(huì)監(jiān)聽3888
三個(gè)節(jié)點(diǎn)分別生成自己的myid文件
root@zoo1:~# echo "1" > /apps/zookeeper/data/myid
root@zoo2:~# echo "2" > /apps/zookeeper/data/myid
root@zoo3:~# echo "3" > /apps/zookeeper/data/myid
- 分別啟動(dòng)ZooKeeper
/apps/zookeeper/bin/zkServer.sh start
- 查看集群狀態(tài)
此時(shí)可以觀察到10.0.0.189被選舉為leader
root@Zoo1:/apps/zookeeper/data# /apps/zookeeper/bin/zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /apps/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follower
root@Zoo2:/apps/zookeeper/data# /apps/zookeeper/bin/zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /apps/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follower
root@Zoo3:/apps/zookeeper/data# /apps/zookeeper/bin/zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /apps/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: leader
root@Zoo1:~# ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 127.0.0.53%lo:53 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 50 *:2181 *:*
LISTEN 0 50 *:37935 *:*
LISTEN 0 50 [::ffff:10.0.0.209]:3888 *:*
LISTEN 0 50 *:8080 *:*
root@Zoo2:~# ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 127.0.0.53%lo:53 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 50 *:2181 *:*
LISTEN 0 50 *:35531 *:*
LISTEN 0 50 [::ffff:10.0.0.199]:3888 *:*
LISTEN 0 50 *:8080 *:*
LISTEN 0 128 [::]:22 [::]:*
root@Zoo3:~# ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 127.0.0.53%lo:53 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 50 *:2181 *:*
LISTEN 0 50 [::ffff:10.0.0.189]:2888 *:*
LISTEN 0 50 *:35053 *:*
LISTEN 0 50 [::ffff:10.0.0.189]:3888 *:*
LISTEN 0 50 *:8080 *:*
- 選舉過程
- 節(jié)點(diǎn)角色狀態(tài)
LOOKING:尋找 Leader 狀態(tài)镇眷,處于該狀態(tài)需要進(jìn)入選舉流程
LEADING:領(lǐng)導(dǎo)者狀態(tài),處于該狀態(tài)的節(jié)點(diǎn)說明是角色已經(jīng)是 Leader
FOLLOWING:跟隨者狀態(tài)翎嫡,表示 Leader 已經(jīng)選舉出來欠动,當(dāng)前節(jié)點(diǎn)角色是follower
OBSERVER:觀察者狀態(tài),表明當(dāng)前節(jié)點(diǎn)角色是 observer
- 選舉id
ZXID(zookeeper transaction id):每個(gè)改變 Zookeeper 狀態(tài)的操作都會(huì)形成一個(gè)對(duì)應(yīng)的 zxid惑申。
myid:服務(wù)器的唯一標(biāo)識(shí)(SID)具伍,通過配置 myid 文件指定,集群中唯一圈驼。
- 選舉過程
當(dāng)集群中的 zookeeper 節(jié)點(diǎn)啟動(dòng)以后人芽,會(huì)根據(jù)配置文件中指定的 zookeeper 節(jié)點(diǎn)地址進(jìn)行 leader 選擇操作,過程如下:
- 每個(gè) zookeeper 都會(huì)發(fā)出投票绩脆,由于是第一次選舉 leader萤厅,因此每個(gè)節(jié)點(diǎn)都會(huì)把自己當(dāng)做 leader 角色進(jìn)行選舉橄抹,每個(gè) zookeeper 的投票中都會(huì)包含自己的 myid 和 zxid,此時(shí) zookeeper 1 的投票為 myid 為 1惕味,初始 zxid 有一個(gè)初始值楼誓,后期會(huì)隨著數(shù)據(jù)更新而自動(dòng)變化,zookeeper2 的投票為 myid 為 2名挥,初
始 zxid 為初始生成的值疟羹。 - 每個(gè)節(jié)點(diǎn)接受并檢查對(duì)方的投票信息,比如投票時(shí)間躺同、是否狀態(tài)為 LOOKING狀態(tài)的投票阁猜。
- 對(duì)比投票,優(yōu)先檢查 zxid蹋艺,如果 zxid不一樣則 zxid大的為 leader剃袍,如果 zxid相同則繼續(xù)對(duì)比 myid,myid 大的一方為 leader
成為 Leader 的必要條件: Leader 要具有最高的 zxid捎谨;當(dāng)集群的規(guī)模是 n 時(shí)民效,
集群中大多數(shù)的機(jī)器(至少 n/2+1)得到響應(yīng)并 follow 選出的 Leader。
心跳機(jī)制:Leader 與 Follower 利用 PING 來感知對(duì)方的是否存活涛救,當(dāng) Leader 無
法響應(yīng) PING 時(shí)畏邢,將重新發(fā)起 Leader 選舉。
新集群, 由于沒有數(shù)據(jù), zxid在各個(gè)節(jié)點(diǎn)相同, 因此, 一般會(huì)比較myid, 集群運(yùn)行后, zxid會(huì)隨著數(shù)據(jù)的插入而發(fā)生變化, 哪個(gè)節(jié)點(diǎn)的數(shù)據(jù)越新, zxid值就會(huì)越大, 就會(huì)被選舉為leader
- 各節(jié)點(diǎn)的選擇日志
cat /apps/zookeeper/logs/zookeeper-root-server-Zoo3.out
- 測試數(shù)據(jù)同步
分別在三臺(tái)節(jié)點(diǎn), 通過命令行工具連接到本地ZooKeeper
/apps/zookeeper/bin/zkCli.sh
zoo1上創(chuàng)建數(shù)據(jù)
[zk: localhost:2181(CONNECTED) 0] create /test "hello" # 通過命令行是無法遞歸創(chuàng)建目錄的
Created /test
zoo2查看
[zk: localhost:2181(CONNECTED) 0] get /test
hello
zoo3查看
[zk: localhost:2181(CONNECTED) 0] get /test
hello
- ZooKeeper數(shù)據(jù)存放
ZooKeeper數(shù)據(jù)存放在配置文件中定義的數(shù)據(jù)目錄下的version-x/log文件里, 因此要對(duì)數(shù)據(jù)目錄做定期備份
由于三個(gè)服務(wù)器的數(shù)據(jù)都是相同的, 因此備份一個(gè)客戶端的即可
cat /apps/zookeeper/data/version-2/log.100000001
ZKLG"$*,pvf|?????N=$V8Pvf§C@?????|c $ ??vf§H??u0B&
R*,pvf?A/testhelloworldanyoneB
- ZooKeeper監(jiān)控
- Zabbix監(jiān)控各個(gè)節(jié)點(diǎn)的各個(gè)端口
- 執(zhí)行客戶端zkCli.sh命令, 進(jìn)入ZooKeeper,再退出, 檢查命令是否執(zhí)行成功
- Zookeeper客戶端在Linux平臺(tái)使用
- 客戶端編譯
root@zooinsepect:~# apt install git maven openjdk-8-jdk -y
root@zooinsepect:~# git clone https://github.com/zzhang5/zooinspector.git
root@zooinsepect:~# cd /zooinspector
root@zooinsepect:~/zooinspector# mvn clean package
- 客戶端使用
root@Zoo1:~/zooinspector# chmod +x target/zooinspector-pkg/bin/zooinspector.sh
root@Zoo1:~/zooinspector# export DISPLAY=10.0.0.1:0.0
Windows開啟Xmanager
修改xshell配置
root@Zoo1:~/zooinspector# target/zooinspector-pkg/bin/zooinspector.sh