1、Zookeeper入門
1.1 概述
Zookeeper是一個開源的分布式的,為分布式框架提供協(xié)調(diào)服務(wù)的Apache項目。
1、Zookeeper工作機(jī)制
Zookeeper從設(shè)置模式角度來理解:是一個基于觀察者模式設(shè)計的分布式服務(wù)管理框架,它負(fù)責(zé)儲存和管理大家都關(guān)心的數(shù)據(jù),然后接受觀察者的注冊,一旦這些數(shù)據(jù)的狀態(tài)發(fā)生變化,Zookeeper就將負(fù)責(zé)通知已經(jīng)在Zookeeper上注冊的那些觀察者做出相應(yīng)的反應(yīng)。
1.2 特點
1、Zookeeper:一個領(lǐng)導(dǎo)者(Leader),多個跟隨者(Follower)組成的集群。
2、集群中只要有半數(shù)以上節(jié)點存活,Zookeeper集群就能正常服務(wù)。所以Zookeeper適合安裝奇數(shù)臺服務(wù)器。
3、全局?jǐn)?shù)據(jù)一致,每個Server保存一份相同的數(shù)據(jù)副本,Client無論連接到哪個Server,數(shù)據(jù)都是一致的。
4、更新請求順序執(zhí)行,來著同一個Client的更新請求按其發(fā)送順序依次執(zhí)行。
5、數(shù)據(jù)更新原子性,一次數(shù)據(jù)更新要么成功,要么失敗。
6、實時性,在一定時間范圍內(nèi),Client能讀取到最新數(shù)據(jù)
1.3 數(shù)據(jù)結(jié)構(gòu)
Zookeeper數(shù)據(jù)模型的結(jié)構(gòu)與Unix文件系統(tǒng)很類似,整體上可以看作是一棵樹,每個節(jié)點稱做一個ZNode。每一個ZNode默認(rèn)能儲存1MB的數(shù)據(jù),每個ZNode都可以通過其路徑唯一標(biāo)識。
1.4 應(yīng)用場景
提供的服務(wù)包括:統(tǒng)一命名服務(wù)、統(tǒng)一配置管理、統(tǒng)一集群管理、服務(wù)器節(jié)點動態(tài)上下線、軟負(fù)載均衡等。
1、統(tǒng)一命名服務(wù)
2、統(tǒng)一配置管理
(1)分布式環(huán)境系,配置文件同步非常常見
(a)一般要求一個集群中,所有節(jié)點的配置信息是一致的,比如kafka集群。
(b)對配置文件修改后,希望能夠快速同步到各個節(jié)點上。
(2)配置管理可交由Zookeeper實現(xiàn)
(a)可將配置信息寫入Zookeeper上的一個ZNode
(b)各個客戶端服務(wù)器監(jiān)聽這個ZNode
(c)一旦ZNode中的數(shù)據(jù)被修改,Zookeeper將通知各個客戶端服務(wù)器
3、統(tǒng)一集群管理
(1)分布式環(huán)境中,實時掌握每個節(jié)點的狀態(tài)是必要的
(a)可根據(jù)節(jié)點實時狀態(tài)做出一些調(diào)整
(2)Zookeeper可以實現(xiàn)實時監(jiān)控節(jié)點狀態(tài)變化
(a)可將節(jié)點信息寫入Zookeeper上的一個ZNode節(jié)點
(b)監(jiān)聽這個ZNode可獲取它的實時狀態(tài)變化。
4、服務(wù)器動態(tài)上下線
5、軟負(fù)載均衡
2、Zookeeper本地安裝
Zookeeper文件獲取
鏈接:https://pan.baidu.com/s/1kVisN2YWXH119vX8mVa_uQ
提取碼:zhm6
2.1 本地模式安裝
1、安裝前準(zhǔn)備
(1)安裝JDK
(2)拷貝Zookeeper安裝包到Linux系統(tǒng)下
(3)解壓到指定目錄
tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz -C /opt/module/
2、配置修改
(1)將/opt/module/zookeeper-3.5.7/conf 這個路徑下的 zoo_sample.cfg 修改為 zoo.cfg;
mv zoo_sample.cfg zoo.cfg
(2)打開 zoo.cfg 文件,修改 dataDir 路徑
vim zoo.cfg
修改以下內(nèi)容
dataDir=/opt/module/zookeeper-3.5.7/zkData
(3)在/opt/module/zookeeper-3.5.7/這個目錄上創(chuàng)建 zkData 文件夾
mkdir zkData
3、操作Zookeeper
(1)啟動Zookeeper
bin/zkServer.sh start
(2)查看進(jìn)程是否啟動
jps
(3)查看狀態(tài)
bin/zkServer.sh status
(4)啟動客戶端
bin/zkCli.sh
(5)退出客戶端
quit
(6)停止 Zookeeper
bin/zkServer.sh stop
2.2 配置參數(shù)解讀
1、tickTime = 2000;通信心跳時間,Zookeeper服務(wù)器與客戶端心跳時間,單位毫秒
2、initLimit=10:LF初始通信時限
Leader和Follower初始連接時能容忍的最多心跳數(shù)(tickTime的數(shù)量)
3、syncLimit=5:LF同步通信時限
Leader和Follower之間通信時間如果超過syncLimit*tickTime,Leader認(rèn)為Follower死掉,從服務(wù)器列表中刪除掉Follower。
4、dataDir:保存Zookeeper中的數(shù)據(jù)
注意:默認(rèn)的tmp目錄,容易被Linux系統(tǒng)定期刪除,所以一般不用默認(rèn)的tmp目錄。
5、clientPort=2181:客戶端連接端口,通常不做修改
3、Zookeeper集群操作
3.1 集群操作
3.1.1 集群安裝
1、集群規(guī)劃
在hadoop102、hadoop103、hadoop104三個節(jié)點上都部署Zookeeper。
2、解壓安裝(和上面一樣)
3、配置服務(wù)器編號
(1)在/opt/module/zookeeper-3.5.7/這個目錄下創(chuàng)建 zkData
(2)在/opt/module/zookeeper-3.5.7/zkData 目錄下創(chuàng)建一個 myid 的文件。在文件中添加與 server 對應(yīng)的編號(注意:上下不要有空行,左右不要有空格)
(3)拷貝配置好的 zookeeper 到其他機(jī)器上。并分別在 hadoop103、hadoop104 上修改 myid 文件中內(nèi)容為 3、4。
4、配置zoo.cfg文件
(1)重命名/opt/module/zookeeper-3.5.7/conf 這個目錄下的 zoo_sample.cfg 為 zoo.cfg
(2)打開zoo.cfg文件
(a)修改數(shù)據(jù)儲存路徑配置
(b)增加如下配置
(3)配置參數(shù)解讀
server.A=B:C:D
A是一個數(shù)字,表示這個是第幾號服務(wù)器;
集群模式下配置一個文件myid,這個文件在datadir目錄下,這個文件里面有一個數(shù)據(jù)就是A的值,Zookeeper啟動時讀取此文件,拿到里面的數(shù)據(jù)與zoo.cfg里面的配置信息比較從而判斷到底是哪個Server。
B是這個服務(wù)器的地址。
C是這個服務(wù)器Follower與集群中Leader服務(wù)器交換信息的端口。
D是萬一集群中的Leader的服務(wù)掛了,需要一個端口來重新選舉,選舉出一個新的Leader,而這個端口就是用來執(zhí)行選舉時服務(wù)器互相通信的端口。
(4)同步zoo.cfg配置文件。
5、集群操作
zk.sh腳本
#!/bin/bash
case $1 in
"start") {
for i in hadoop102 hadoop103 hadoop104
do
echo ---------------zookeeper $i 啟動-----------------
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)一鍵啟動Zookeeper集群
(2)查看狀態(tài)
3.1.2 選舉機(jī)制
Zookeeper選舉機(jī)制—第一次啟動
SID:服務(wù)器ID。用來唯一標(biāo)識一臺Zookeeper集群中的機(jī)器,每臺機(jī)器不能重復(fù),和myid一致。
ZXID:事務(wù)ID。ZXID是一個事務(wù)ID,用來標(biāo)識一次服務(wù)器狀態(tài)的變更。在某一時刻,集群中的每臺機(jī)器的ZXID值不一定完全一致。這和Zookeeper服務(wù)器對于客戶端“更新請求”的處理邏輯有關(guān)。
EPOCH:每個Leader任期的代號。沒有Leader時同一輪投票過程中的邏輯時鐘值是相同的。每投完一次票這個數(shù)據(jù)就會增加。
1、服務(wù)器1啟動,發(fā)起一次選舉。服務(wù)器1投自己一票。此時服務(wù)器1票數(shù)一票,不夠半數(shù)以上(3票),選舉無法完成,服務(wù)器1狀態(tài)保持為
LOOKING;
2、服務(wù)器2啟動,再發(fā)起一次選舉。服務(wù)器1和2分別投自己一票并交換選票信息:此時服務(wù)器1發(fā)現(xiàn)服務(wù)器2的myid比自己目前投票推舉的(服務(wù)器1)大,更改選票為推舉服務(wù)器2。此時服務(wù)器1票數(shù)0票,服務(wù)器2票數(shù)2票,沒有半數(shù)以上結(jié)果,選舉無法完成,服務(wù)器1,2狀態(tài)保持LOOKING。
3、服務(wù)器3啟動,發(fā)起一次選舉。此時服務(wù)器1和2都會更改選票為服務(wù)器3。此次投票結(jié)果:服務(wù)器1為0票,服務(wù)器2為0票,服務(wù)器3為3票。此時服務(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啟動,發(fā)起一次選舉。此時服務(wù)器1,2,3已經(jīng)不是LOOKING狀態(tài),不會更改選票信息。交換選票信息結(jié)果:服務(wù)器3為3票,服務(wù)器4為1票。此時服務(wù)器4服從多數(shù),更改選票信息為服務(wù)器3,并更改狀態(tài)為FOLLOWING;
5、服務(wù)器5啟動,同4一樣當(dāng)小弟。
Zookeeper選舉機(jī)制—非第一次啟動
(1)當(dāng)Zookeeper集群中的一臺服務(wù)器出現(xiàn)以下兩種情況之一時,就會開始進(jìn)入Leader選舉:
(a)服務(wù)器初始化啟動
(b)服務(wù)器運行期間無法和Leader保持連接
(2)而當(dāng)一臺機(jī)器進(jìn)入Leader選舉流程時,當(dāng)前集群也可能會處于以下兩種狀態(tài):
(a)集群中本來就已經(jīng)存在一個Leader
對于這種情況,機(jī)器視圖去選舉Leader時,會被告知當(dāng)前服務(wù)器的Leader信息,對于該機(jī)器來說,僅僅需要和Leader機(jī)器建立連接,并進(jìn)行狀態(tài)同步即可。
(b)集群中確實不存在Leader
假設(shè)ZooKeeper由5臺服務(wù)器組成,SID分別為1、2、3、4、5,ZXID分別為8、8、8、7、7,并且此時SID為3的服務(wù)器是Leader。某一時刻,
3和5服務(wù)器出現(xiàn)故障,因此開始進(jìn)行Leader選舉。
3.2 客戶端命令行操作
3.2.1 命令行語法
命令基本語法 | 功能描述 |
---|---|
help | 顯示所有操作命令 |
ls path | 使用 ls 命令來查看當(dāng)前 znode 的子節(jié)點 [可監(jiān)聽] -w 監(jiān)聽子節(jié)點變化 -s 附加次級信息 |
create | 普通創(chuàng)建 -s 含有序列 -e 臨時(重啟或者超時消失) |
get path | 獲得節(jié)點的值 [可監(jiān)聽] -w 監(jiān)聽節(jié)點內(nèi)容變化 -s 附加次級信息 |
set | 設(shè)置節(jié)點的具體值 |
stat | 查看節(jié)點狀態(tài) |
delete | 刪除節(jié)點 |
deleteall | 遞歸刪除節(jié)點 |
1、啟動客戶端
bin/zkCli.sh
2、顯示所有操作命令
3.2.2 ZNode節(jié)點數(shù)據(jù)信息
1、查看當(dāng)前ZNode所包含的信息
ls /
2、查看當(dāng)前節(jié)點詳細(xì)數(shù)據(jù)
ls -s /
(1)czxid:創(chuàng)建節(jié)點的事務(wù)zxid
每次修改 ZooKeeper 狀態(tài)都會產(chǎn)生一個 ZooKeeper 事務(wù) ID。事務(wù) ID 是 ZooKeeper 中所有修改總的次序。每次修改都有唯一的 zxid,如果 zxid1 小于 zxid2,那么 zxid1 在 zxid2 之前發(fā)生。
(2)ctime:ZNode被創(chuàng)建的毫秒數(shù)(從 1970 年開始)
(3)mzxid:znode 最后更新的事務(wù) zxid
(4)mtime:znode 最后修改的毫秒數(shù)(從 1970 年開始)
(5)pZxid:znode 最后更新的子節(jié)點 zxid
(6)cversion:znode 子節(jié)點變化號,znode 子節(jié)點修改次數(shù)
(7)dataversion:znode 數(shù)據(jù)變化號
(8)aclVersion:znode 訪問控制列表的變化號
(9)ephemeralOwner:如果是臨時節(jié)點,這個是 znode 擁有者的 session id。如果不是臨時節(jié)點則是 0。
(10)dataLength:znode 的數(shù)據(jù)長度
(11)numChildren:znode 子節(jié)點數(shù)量
3.2.3 節(jié)點類型(持久/短暫/有序號/無序號)
持久(Persistent):客戶端和服務(wù)器端斷開連接后,創(chuàng)建的節(jié)點不刪除
短暫(Ephemeral):客戶端和服務(wù)器端斷開連接后,創(chuàng)建的節(jié)點自己刪除。
(1)持久化目錄節(jié)點
客戶端與Zookeeper斷開連接后,該節(jié)點依舊存在
(2)持久化順序編號目錄節(jié)點
客戶端與Zookeeper斷開連接后,該節(jié)點依舊存在,只是Zookeeper給該節(jié)點名稱進(jìn)行順序編號
(3)臨時目錄節(jié)點
客戶端與Zookeeper斷開連接后,該節(jié)點被刪除
(4)臨時順序編號目錄節(jié)點
客戶端與 Zookeeper 斷開連接后 , 該 節(jié) 點 被 刪 除 , 只 是
Zookeeper給該節(jié)點名稱進(jìn)行順序編號。
說明:創(chuàng)建znode時設(shè)置順序標(biāo)識,znode名稱后會附加一個值,順序號是一個單調(diào)遞增的計數(shù)器,由父節(jié)點維護(hù)。
注意:在分布式系統(tǒng)中,順序號可以被用于為所有的事件進(jìn)行全局排序,這樣客戶端可以通過順序號推斷事件的順序。
1、分別創(chuàng)建2個普通節(jié)點(永久節(jié)點 + 不帶序號)
注意:在創(chuàng)建節(jié)點是要賦值
2、獲得節(jié)點的值
3、創(chuàng)建帶序號的節(jié)點(永久節(jié)點 + 帶序號)
(1)先創(chuàng)建一個普通的根節(jié)點/sanguo/weiguo
(2)創(chuàng)建帶序號的節(jié)點
如果原來沒有序號節(jié)點,序號從 0 開始依次遞增。如果原節(jié)點下已有 2 個節(jié)點,則再排序時從 2 開始,以此類推。
4、創(chuàng)建短暫節(jié)點(短暫節(jié)點 + 不帶序號 or 帶序號)
(1)創(chuàng)建短暫的不帶序號的節(jié)點
(2)創(chuàng)建短暫的帶序號的節(jié)點
(3)在當(dāng)前客戶端是能查看到的
(4)退出當(dāng)前客戶端然后再重啟客戶端,再次查看根目錄下短暫節(jié)點已經(jīng)刪除
5、修改節(jié)點數(shù)據(jù)值
3.2.4 監(jiān)聽器原理
客戶端注冊監(jiān)聽它關(guān)心的目錄節(jié)點,當(dāng)目錄節(jié)點發(fā)生變化(數(shù)據(jù)改變、節(jié)點刪除、子目錄節(jié)點增加刪除)時,Zookeeper會通知客戶端。監(jiān)聽機(jī)制保證Zookeeper保存的任何的數(shù)據(jù)的任何變化都能快速的響應(yīng)到監(jiān)聽了該節(jié)點的應(yīng)用程序。
1、監(jiān)聽器詳解
(1)首先要有一個main()線程
(2)在main線程中創(chuàng)建Zookeeper客戶端,這時就會創(chuàng)建兩個線程,一個負(fù)責(zé)網(wǎng)絡(luò)通信(connect),一個負(fù)責(zé)監(jiān)聽(listener)。
(3)通過connect線程將注冊的監(jiān)聽事件發(fā)送給Zookeeper。
(4)在Zookeeper的注冊監(jiān)聽器列表中將注冊的監(jiān)聽事件添加到列表中。
(5)Zookeeper監(jiān)聽到所以數(shù)據(jù)或路徑發(fā)生變化,就會將這個消息發(fā)送給listener線程。
(6)listener線程內(nèi)部調(diào)用了process()方法。
2、常見的監(jiān)聽
(1)監(jiān)聽節(jié)點數(shù)據(jù)的變化
get path [watch]
(2)監(jiān)聽子節(jié)點增減的變化
ls path [watch]
1、節(jié)點的值變化監(jiān)聽
(1)在 hadoop104 主機(jī)上注冊監(jiān)聽/sanguo 節(jié)點數(shù)據(jù)變化
(2)在 hadoop103 主機(jī)上修改/sanguo 節(jié)點的數(shù)據(jù)
(3)觀察 hadoop104 主機(jī)收到數(shù)據(jù)變化的監(jiān)聽
注意:在hadoop103再多次修改/sanguo的值,hadoop104上不會再收到監(jiān)聽。因為注冊監(jiān)聽一次,只能監(jiān)聽一次。想再次監(jiān)聽,需要再次注冊。
2、節(jié)點的子節(jié)點變化監(jiān)聽(路徑變化)
(1)在 hadoop104 主機(jī)上注冊監(jiān)聽/sanguo 節(jié)點的子節(jié)點變化
(2)在 hadoop103 主機(jī)/sanguo 節(jié)點上創(chuàng)建子節(jié)點
(3)觀察 hadoop104 主機(jī)收到子節(jié)點變化的監(jiān)聽
注意:節(jié)點的路徑變化,也是注冊一次,生效一次。想多次生效,就需要多次注冊。文章來源:http://www.zghlxwxcb.cn/news/detail-843956.html
3.2.5 節(jié)點刪除與查看
1、刪除節(jié)點
2、遞歸刪除節(jié)點
3、查看節(jié)點狀態(tài)文章來源地址http://www.zghlxwxcb.cn/news/detail-843956.html
到了這里,關(guān)于Zookeeper快速入門(Zookeeper概述、安裝、集群安裝、選舉機(jī)制、命令行操作、節(jié)點類型、監(jiān)聽器原理)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!