一、簡介
1、工作機(jī)制
官方地址:https://zookeeper.apache.org/
Zookeeper是一個(gè)開源的分布式的,為分布式框架提供協(xié)調(diào)服務(wù)的Apache項(xiàng)目。
- Zookeeper從設(shè)計(jì)模式角度來理解:是一個(gè)基于觀察者模式設(shè)計(jì)的分布式服務(wù)管理框架,它負(fù)責(zé)存儲(chǔ)和管理大家都關(guān)心的數(shù)據(jù),然后接受觀察者的注冊,一旦這些數(shù)據(jù)的狀態(tài)發(fā)生變化,Zookeeper就將負(fù)責(zé)通知已經(jīng)在Zookeeper上注冊的那些觀察者做出相應(yīng)的反應(yīng)。
2、特點(diǎn)
- Zookeeper:一個(gè)領(lǐng)導(dǎo)者(Leader),多個(gè)跟隨者(Follower)組成的集群。
- 集群中只要有半數(shù)以上節(jié)點(diǎn)存活,Zookeeper集群就能正常服務(wù)。所以Zookeeper適合安裝奇數(shù)臺(tái)服務(wù)器。
- 全局?jǐn)?shù)據(jù)一致:每個(gè)Server保存一份相同的數(shù)據(jù)副本,Client無論連接到哪個(gè)Server,數(shù)據(jù)都是一致的。
- 更新請求順序執(zhí)行,來自同一個(gè)Client的更新請求按其發(fā)送順序依次執(zhí)行。
- 數(shù)據(jù)更新原子性,一次數(shù)據(jù)更新要么成功,要么失敗。
- 實(shí)時(shí)性,在一定時(shí)間范圍內(nèi),Client能讀到最新數(shù)據(jù)。
3、數(shù)據(jù)結(jié)構(gòu)
- ZooKeeper數(shù)據(jù)模型的結(jié)構(gòu)與Unix文件系統(tǒng)很類似。
- 整體上可以看作是一棵樹,每個(gè)節(jié)點(diǎn)稱做一個(gè)ZNode。
- 每一個(gè)ZNode默認(rèn)能夠存儲(chǔ)1MB的數(shù)據(jù),每個(gè)ZNode都可以通過其路徑唯一標(biāo)識(shí)。
4、應(yīng)用場景
提供的服務(wù)包括:統(tǒng)一命名服務(wù)、統(tǒng)一配置管理、統(tǒng)一集群管理、服務(wù)器節(jié)點(diǎn)動(dòng)態(tài)上下線、軟負(fù)載均衡等。
- 統(tǒng)一命名服務(wù)
- 統(tǒng)一配置管理
- 統(tǒng)一集群管理
- 服務(wù)器節(jié)點(diǎn)動(dòng)態(tài)上下線
- 軟負(fù)載均衡等
統(tǒng)一命名服務(wù)
- 在分布式環(huán)境下,經(jīng)常需要對應(yīng)用/服務(wù)進(jìn)行統(tǒng)一命名,便于識(shí)別。例如:IP不容易記住,而域名容易記住。
統(tǒng)一配置管理
-
分布式環(huán)境下,配置文件同步非常常見。
- 一般要求一個(gè)集群中,所有節(jié)點(diǎn)的配置信息是一致的,比如 Kafka 集群。
- 對配置文件修改后,希望能夠快速同步到各個(gè)節(jié)點(diǎn)上。
-
配置管理可交由ZooKeeper實(shí)現(xiàn)。
- 可將配置信息寫入ZooKeeper上的一個(gè)Znode。
- 各個(gè)客戶端服務(wù)器監(jiān)聽這個(gè)Znode。
- 一旦Znode中的數(shù)據(jù)被修改,ZooKeeper將通知各個(gè)客戶端服務(wù)器。
統(tǒng)一集群管理
- 分布式環(huán)境中,實(shí)時(shí)掌握每個(gè)節(jié)點(diǎn)的狀態(tài)是必要的。
- 可根據(jù)節(jié)點(diǎn)實(shí)時(shí)狀態(tài)做出一些調(diào)整。
- ZooKeeper可以實(shí)現(xiàn)實(shí)時(shí)監(jiān)控節(jié)點(diǎn)狀態(tài)變化。
- 可將節(jié)點(diǎn)信息寫入ZooKeeper上的一個(gè)ZNode。
- 監(jiān)聽這個(gè)ZNode可獲取它的實(shí)時(shí)狀態(tài)變化。
服務(wù)器動(dòng)態(tài)上下線
軟負(fù)載均衡
- 在Zookeeper中記錄每臺(tái)服務(wù)器的訪問數(shù),讓訪問數(shù)最少的服務(wù)器去處理最新的客戶端請求。
5、選舉機(jī)制
首次啟動(dòng)
- 1)服務(wù)器1啟動(dòng),發(fā)起一次選舉。服務(wù)器1投自己一票。此時(shí)服務(wù)器1票數(shù)一票,不夠半數(shù)以上(3票),選舉無法完成,服務(wù)器1狀態(tài)保持為LOOKING;
- 2)服務(wù)器2啟動(dòng),再發(fā)起一次選舉。服務(wù)器1和2分別投自己一票并交換選票信息:此時(shí)服務(wù)器1發(fā)現(xiàn)服務(wù)器2的myid比自己目前投票推舉的(服務(wù)器1)大,更改選票為推舉服務(wù)器2。此時(shí)服務(wù)器1票數(shù)0票,服務(wù)器2票數(shù)2票,沒有半數(shù)以上結(jié)果,選舉無法完成,服務(wù)器1,2狀態(tài)保持LOOKING。
- 3)服務(wù)器3啟動(dòng),發(fā)起一次選舉。此時(shí)服務(wù)器1和2都會(huì)更改選票為服務(wù)器3。此次投票結(jié)果:服務(wù)器1為0票,服務(wù)器2為0票,服務(wù)器3為3票。此時(shí)服務(wù)器3的票數(shù)已經(jīng)超過半數(shù),服務(wù)器3當(dāng)選Leader。服務(wù)器1,2更改狀態(tài)為FOLLOWING,服務(wù)器3更改狀態(tài)為LEADING;
- 4)服務(wù)器4啟動(dòng),發(fā)起一次選舉。此時(shí)服務(wù)器1,2,3已經(jīng)不是LOOKING狀態(tài),不會(huì)更改選票信息。交換選票信息結(jié)果:服務(wù)器3為3票,服務(wù)器4為1票。此時(shí)服務(wù)器4服從多數(shù),更改選票信息為服務(wù)器3,并更改狀態(tài)為FOLLOWING;
- 5)服務(wù)器5啟動(dòng),同4一樣當(dāng)小弟。
非第一次啟動(dòng)
二、軟件安裝
# The number of milliseconds of each tick
# 通信心跳時(shí)間,Zookeeper服務(wù)器與客戶端心跳時(shí)間,單位毫秒
tickTime=2000d
# The number of ticks that the initial
# synchronization phase can take
# LF初始通信時(shí)限
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
# LF同步通信時(shí)限
syncLimit=5
# 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=/opt/module/zookeeper-3.5.7/zkData
# the port at which the clients will connect
#客戶端連接端口,通常不做修改
clientPort=2181
1、單機(jī)版安裝
安裝JDK(首先需要安裝JDK)
yum install java-1.8.0-openjdk-devel.x86_64
創(chuàng)建文件/opt/module
mkdir /opt/module
cd /opt/module
下載文件
wget https://archive.apache.org/dist/zookeeper/zookeeper-3.5.7/apache-zookeeper-3.5.7-bin.tar.gz
解壓文件
tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz -C /opt/module
修改安裝目錄名
mv apache-zookeeper-3.5.7-bin zookeeper-3.5.7
配置環(huán)境變量
vim /etc/profile.d/my_env.sh
# ZOOKEEPER_HOME
export ZOOKEEPER_HOME=/opt/module/zookeeper-3.5.7
export PATH=$PATH:$ZOOKEEPER_HOME/bin
加載環(huán)境變量
source /etc/profile
添加配置文件
cd /opt/module/zookeeper-3.5.7/conf/
mv zoo_sample.cfg zoo.cfg
修改配置文件
vim zoo.cfg
# 修改數(shù)據(jù)所在文件
dataDir=/opt/module/zookeeper-3.5.7/zkData
創(chuàng)建日志目錄
mkdir /opt/module/zookeeper-3.5.7/zkData
啟動(dòng)zookeeper
bin/zkServer.sh start
查詢啟動(dòng)狀態(tài)
# 查看進(jìn)程
jps
# 查看狀態(tài)
bin/zkServer.sh status
啟動(dòng)客戶端
bin/zkCli.sh
退出客戶端
quit
停止zookeeper
bin/zkServer.sh stop
2、集群安裝
安裝JDK(首先需要安裝JDK)
yum install java-1.8.0-openjdk-devel.x86_64
創(chuàng)建文件/opt/module
mkdir /opt/module
cd /opt/module
下載文件
wget https://archive.apache.org/dist/zookeeper/zookeeper-3.5.7/apache-zookeeper-3.5.7-bin.tar.gz
解壓文件
tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz -C /opt/module
修改安裝目錄名
cd /opt/module
mv apache-zookeeper-3.5.7-bin zookeeper-3.5.7
創(chuàng)建數(shù)據(jù)存儲(chǔ)目錄
cd /opt/module/zookeeper-3.5.7/
mkdir zkData
在/opt/module/zookeeper-3.5.7/zkData
目錄下創(chuàng)建一個(gè)myid的文件
在文件中添加與server對應(yīng)的編號(注意:上下不要有空行,左右不要有空格)
cd /opt/module/zookeeper-3.5.7/zkData
vim myid
# 服務(wù)器編號,每臺(tái)服務(wù)器要不同
1
配置zoo.cfg配置文件
cd /opt/module/zookeeper-3.5.7/conf
mv zoo_sample.cfg zoo.cfg
修改配置文件
vim /opt/module/zookeeper-3.5.7/conf/zoo.cfg
# 修改數(shù)據(jù)存儲(chǔ)位置
dataDir=/opt/module/zookeeper-3.5.7/zkData
# 增加集群配置
#######################cluster##########################
server.1=hadoop101:2888:3888
server.2=hadoop102:2888:3888
server.3=hadoop103:2888:3888
啟動(dòng)集群(3臺(tái)都要啟動(dòng))
cd /opt/module/zookeeper-3.5.7
bin/zkServer.sh start
查看狀態(tài)
bin/zkServer.sh status
3、配置參數(shù)解讀(zoo.cfg)
Zookeeper中的配置文件zoo.cfg中參數(shù)含義解讀如下:
# 通信心跳時(shí)間
tickTime=2000
# LF初始通信時(shí)限
initLimit=10
# LF同步通信時(shí)限
syncLimit=5
# 保存Zookeeper中的數(shù)據(jù)
dataDir=/tmp/zookeeper
# 客戶端連接端口,通常不做修改
clientPort=2181
- tickTime = 2000:通信心跳時(shí)間,Zookeeper服務(wù)器與客戶端心跳時(shí)間,單位毫秒
- initLimit = 10:LF初始通信時(shí)限
Leader和Follower初始連接時(shí)能容忍的最多心跳數(shù)(tickTime的數(shù)量)
- syncLimit = 5:LF同步通信時(shí)限
Leader和Follower之間通信時(shí)間如果超過syncLimit * tickTime
,Leader認(rèn)為Follwer死掉,從服務(wù)器列表中刪除Follwer。
- dataDir:保存Zookeeper中的數(shù)據(jù)
注意:默認(rèn)的tmp目錄,容易被Linux系統(tǒng)定期刪除,所以一般不用默認(rèn)的tmp目錄。
- clientPort = 2181:客戶端連接端口,通常不做修改。
4、ZK集群啟動(dòng)腳本
#!/bin/bash
case $1 in
"start"){
for i in hadoop102 hadoop103 hadoop104
do
echo ---------- zookeeper $i 啟動(dòng) ------------
ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh start"
done
};;
"stop"){
for i in hadoop102 hadoop103 hadoop104
do
echo ---------- zookeeper $i 停止 ------------
ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh stop"
done
};;
"status"){
for i in hadoop102 hadoop103 hadoop104
do
echo ---------- zookeeper $i 狀態(tài) ------------
ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh status"
done
};;
esac
三、命令行操作
1、語法
命令基本語法 | 功能描述 |
---|---|
help | 顯示所有操作命令 |
ls path | 使用 ls 命令來查看當(dāng)前znode的子節(jié)點(diǎn) [可監(jiān)聽]-w 監(jiān)聽子節(jié)點(diǎn)變化-s 附加次級信息 |
create | 普通創(chuàng)建-s 含有序列-e 臨時(shí)(重啟或者超時(shí)消失) |
get path | 獲得節(jié)點(diǎn)的值 [可監(jiān)聽]-w 監(jiān)聽節(jié)點(diǎn)內(nèi)容變化-s 附加次級信息 |
set | 設(shè)置節(jié)點(diǎn)的具體值 |
stat | 查看節(jié)點(diǎn)狀態(tài) |
delete | 刪除節(jié)點(diǎn) |
deleteall | 遞歸刪除節(jié)點(diǎn) |
2、使用
啟動(dòng)客戶端
bin/zkCli.sh -server hadoop101:2181
顯示所有操作命令
help
查看當(dāng)前znode中所包含的內(nèi)容
ls /
查看當(dāng)前節(jié)點(diǎn)詳細(xì)數(shù)據(jù)
ls -s /
-
czxid
:創(chuàng)建節(jié)點(diǎn)的事務(wù)zxid- 每次修改ZooKeeper狀態(tài)都會(huì)產(chǎn)生一個(gè)ZooKeeper事務(wù)ID。事務(wù)ID是ZooKeeper中所有修改總的次序。每次修改都有唯一的zxid,如果zxid1小于zxid2,那么zxid1在zxid2之前發(fā)生。
-
ctime
:znode被創(chuàng)建的毫秒數(shù)(從1970年開始) -
mzxid
:znode最后更新的事務(wù)zxid -
mtime
:znode最后修改的毫秒數(shù)(從1970年開始) -
pZxid
:znode最后更新的子節(jié)點(diǎn)zxid -
cversion
:znode子節(jié)點(diǎn)變化號,znode子節(jié)點(diǎn)修改次數(shù) -
dataversion
:znode數(shù)據(jù)變化號 -
aclVersion
:znode訪問控制列表的變化號 -
ephemeralOwner
:如果是臨時(shí)節(jié)點(diǎn),這個(gè)是znode擁有者的session id。如果不是臨時(shí)節(jié)點(diǎn)則是0。 -
dataLength
:znode的數(shù)據(jù)長度 -
numChildren
:znode子節(jié)點(diǎn)數(shù)量
3、節(jié)點(diǎn)相關(guān)
節(jié)點(diǎn)可以分為持久節(jié)點(diǎn)、短暫節(jié)點(diǎn)。
-
持久(Persistent)
:客戶端和服務(wù)器端斷開連接后,創(chuàng)建的節(jié)點(diǎn)不刪除。- 持久化目錄節(jié)點(diǎn)客戶端與Zookeeper斷開連接后,該節(jié)點(diǎn)依舊存在
- 持久化順序編號目錄節(jié)點(diǎn)客戶端與Zookeeper斷開連接后,該節(jié)點(diǎn)依舊存在,只是Zookeeper給該節(jié)點(diǎn)名稱進(jìn)行順序編號
-
短暫(Ephemeral)
:客戶端和服務(wù)器端斷開連接后,創(chuàng)建的節(jié)點(diǎn)自己刪除。- 臨時(shí)目錄節(jié)點(diǎn)客戶端與Zookeeper斷開連接后,該節(jié)點(diǎn)被刪除。
- 臨時(shí)順序編號目錄節(jié)點(diǎn)客戶端與Zookeeper斷開連接后,該節(jié)點(diǎn)被刪除,只是Zookeeper給該節(jié)點(diǎn)名稱進(jìn)行順序編號。
說明:創(chuàng)建znode時(shí)設(shè)置順序標(biāo)識(shí),znode名稱后會(huì)附加一個(gè)值,順序號是一個(gè)單調(diào)遞增的計(jì)數(shù)器,由父節(jié)點(diǎn)維護(hù)。
注意:在分布式系統(tǒng)中,順序號可以被用于為所有的事件進(jìn)行全局排序,這樣客戶端可以通過順序號推斷事件的順序。
分別創(chuàng)建2個(gè)普通節(jié)點(diǎn)(創(chuàng)建節(jié)點(diǎn)時(shí),要賦值)
create /sanguo "diaochan"
create /sanguo/shuguo "liubei"
獲取子節(jié)點(diǎn)
ls /sanguo
獲取sanguo
的值
get -s /sanguo
- 普通節(jié)點(diǎn):
create /test/test1 "zhansan01"
- 帶序號節(jié)點(diǎn):
create -s /test/test1 "zhansan01"
:創(chuàng)建的節(jié)點(diǎn)帶序號test1000001
- 短暫節(jié)點(diǎn):
create -e /test/test1 "zhansan01"
:關(guān)閉客戶端后會(huì)消失(臨時(shí))
創(chuàng)建普通節(jié)點(diǎn)
create /test/test1 "zhansan01"
創(chuàng)建帶序號節(jié)點(diǎn)
create -s /test/test2/test21 "zhansan02"
create -s /test/test2/test22 "lisi02"
create -s /test/test2/test23 "wangwu02"
創(chuàng)建短暫節(jié)點(diǎn)(關(guān)閉客戶端后消失)
create -e /test/test3 "zhansan03"
# 創(chuàng)建短暫的帶序號的節(jié)點(diǎn)
create -e -s /test/test3 "lisi03"
修改節(jié)點(diǎn)的值
set /test/test3 "wangwu03"
4、監(jiān)聽器原理
客戶端注冊監(jiān)聽它關(guān)心的目錄節(jié)點(diǎn),當(dāng)目錄節(jié)點(diǎn)發(fā)生變化(數(shù)據(jù)改變、節(jié)點(diǎn)刪除、子目錄節(jié)點(diǎn)增加刪除)時(shí),ZooKeeper會(huì)通知客戶端。監(jiān)聽機(jī)制保證ZooKeeper保存的任何的數(shù)據(jù)的任何改變都能快速的響應(yīng)到監(jiān)聽了該節(jié)點(diǎn)的應(yīng)用程序。
監(jiān)聽原理
- 1)首先要有一個(gè)main()線程
- 2)在main線程中創(chuàng)建Zookeeper客戶端,這時(shí)就會(huì)創(chuàng)建兩個(gè)線程,一個(gè)負(fù)責(zé)網(wǎng)絡(luò)連接通信(connet),一個(gè)負(fù)責(zé)監(jiān)聽(listener)。
- 3)通過connect線程將注冊的監(jiān)聽事件發(fā)送給Zookeeper。
- 4)在Zookeeper的注冊監(jiān)聽器列表中將注冊的監(jiān)聽事件添加到列表中。
- 5)Zookeeper監(jiān)聽到有數(shù)據(jù)或路徑變化,就會(huì)將這個(gè)消息發(fā)送給listener線程。
- 6)listener線程內(nèi)部調(diào)用了process()方法。
常見的監(jiān)聽
#監(jiān)聽節(jié)點(diǎn)數(shù)據(jù)的變化
get path [watch]
# 監(jiān)聽子節(jié)點(diǎn)增減的變化
ls path [watch]
監(jiān)控/test
值變化
get -w /test
# 更新/test值
set /test "zhangsan"
注意:在hadoop103再多次修改/sanguo的值,hadoop104上不會(huì)再收到監(jiān)聽。因?yàn)樽砸淮?,只能監(jiān)聽一次。想再次監(jiān)聽,需要再次注冊。
監(jiān)控子目錄變化
ls -w /test
# 新建子目錄值
create /test/test4 "zhangsan04"
注意:節(jié)點(diǎn)的路徑變化,也是注冊一次,生效一次。想多次生效,就需要多次注冊。
5、節(jié)點(diǎn)刪除與查看
刪除節(jié)點(diǎn)
delete /test/test4
遞歸刪除節(jié)點(diǎn)
deleteall /test/test2
查看節(jié)點(diǎn)狀態(tài)
stat /test
文章來源:http://www.zghlxwxcb.cn/news/detail-755988.html
三、寫數(shù)據(jù)流程
文章來源地址http://www.zghlxwxcb.cn/news/detail-755988.html
到了這里,關(guān)于zookeeper最基礎(chǔ)教程的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!