4. ZooKeeper

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ù)地址和提供者的信息等.
image.png
  • 狀態(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ù)的重要特性
image.png
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集群

圖片.png

圖片.png

圖片.png
圖片.png

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
  1. 三臺(tái)ZooKeeper安裝jdk
apt install openjdk-8-jdk -y
  1. 將ZooKeeper二進(jìn)制包上傳到/apps并解壓
mkdir /apps
cd /apps
tar xvf apache-zookeeper-3.5.8-bin.tar.gz
  1. 創(chuàng)建軟連接
ln -sv apache-zookeeper-3.5.8-bin/ /apps/zookeeper
  1. 創(chuàng)建ZooKeeper數(shù)據(jù)目錄
mkdir /apps/zookeeper/data
  1. 配置文件修改

拷貝模板文件

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
  1. 分別啟動(dòng)ZooKeeper
/apps/zookeeper/bin/zkServer.sh start
  1. 查看集群狀態(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                                             *:* 
  1. 選舉過程
  • 節(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 選擇操作,過程如下:

  1. 每個(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 為初始生成的值疟羹。
  2. 每個(gè)節(jié)點(diǎn)接受并檢查對(duì)方的投票信息,比如投票時(shí)間躺同、是否狀態(tài)為 LOOKING狀態(tài)的投票阁猜。
  3. 對(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

  1. 各節(jié)點(diǎn)的選擇日志
cat /apps/zookeeper/logs/zookeeper-root-server-Zoo3.out
  1. 測試數(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
  1. 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 

  1. ZooKeeper監(jiān)控
  • Zabbix監(jiān)控各個(gè)節(jié)點(diǎn)的各個(gè)端口
  • 執(zhí)行客戶端zkCli.sh命令, 進(jìn)入ZooKeeper,再退出, 檢查命令是否執(zhí)行成功
  1. 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
圖片.png
  • 客戶端使用
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配置

圖片.png
root@Zoo1:~/zooinspector# target/zooinspector-pkg/bin/zooinspector.sh
圖片.png
圖片.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末检吆,一起剝皮案震驚了整個(gè)濱河市舒萎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蹭沛,老刑警劉巖臂寝,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異摊灭,居然都是意外死亡咆贬,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門帚呼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掏缎,“玉大人,你說我怎么就攤上這事煤杀【祢冢” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵沈自,是天一觀的道長端蛆。 經(jīng)常有香客問我,道長酥泛,這世上最難降的妖魔是什么今豆? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮柔袁,結(jié)果婚禮上呆躲,老公的妹妹穿的比我還像新娘。我一直安慰自己捶索,他們只是感情好插掂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著腥例,像睡著了一般辅甥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上燎竖,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天璃弄,我揣著相機(jī)與錄音,去河邊找鬼构回。 笑死夏块,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的纤掸。 我是一名探鬼主播脐供,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼借跪!你這毒婦竟也來了政己?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤掏愁,失蹤者是張志新(化名)和其女友劉穎歇由,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體托猩,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡印蓖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了京腥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赦肃。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖公浪,靈堂內(nèi)的尸體忽然破棺而出他宛,到底是詐尸還是另有隱情,我是刑警寧澤欠气,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布厅各,位于F島的核電站,受9級(jí)特大地震影響预柒,放射性物質(zhì)發(fā)生泄漏队塘。R本人自食惡果不足惜袁梗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望憔古。 院中可真熱鬧遮怜,春花似錦、人聲如沸鸿市。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽焰情。三九已至陌凳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間内舟,已是汗流浹背合敦。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谒获,地道東北人蛤肌。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像批狱,于是被迫代替她去往敵國和親裸准。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 來源: https://zhuanlan.zhihu.com/p/30024403 一赔硫、ZooKeeper 基本概...
    光小月閱讀 615評(píng)論 0 1
  • Zookeeper 原理 Zookeeper的基本概念 角色 Zookeeper中的角色主要有以下三類炒俱,如下表所示...
    史路比閱讀 838評(píng)論 0 7
  • 1.Zookeeper簡介 1.1 分布式系統(tǒng)面臨的問題 分布式系統(tǒng)就是將一個(gè)獨(dú)立的系統(tǒng)拆分成很多個(gè)模塊,每個(gè)子模...
    HelloWorld打斷點(diǎn)閱讀 508評(píng)論 0 0
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月爪膊,有人笑有人哭权悟,有人歡樂有人憂愁,有人驚喜有人失落推盛,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,536評(píng)論 28 53
  • 信任包括信任自己和信任他人 很多時(shí)候峦阁,很多事情,失敗耘成、遺憾榔昔、錯(cuò)過,源于不自信瘪菌,不信任他人 覺得自己做不成撒会,別人做不...
    吳氵晃閱讀 6,190評(píng)論 4 8