Zookeeper高級(jí)教程 | 袁庭新老師帶你快速搭建Zookeeper集群項(xiàng)目實(shí)戰(zhàn)
Zookeeper是一個(gè)開(kāi)源的分布式應(yīng)用程序協(xié)調(diào)服務(wù),它可以提供高可用性、可靠性和數(shù)據(jù)一致性。在分布式系統(tǒng)中,Zookeeper常被用作協(xié)調(diào)服務(wù)來(lái)管理集群節(jié)點(diǎn)之間的狀態(tài),配置信息,以及各種元數(shù)據(jù)信息。

為了搭建一個(gè)高可用的程序,我們需要對(duì)Zookeeper進(jìn)行集群操作。這樣當(dāng)單個(gè)Zookeeper節(jié)點(diǎn)出現(xiàn)故障或宕機(jī)時(shí),集群中的其他節(jié)點(diǎn)可以接替其職責(zé)并繼續(xù)提供服務(wù)。這對(duì)于一些需要24/7不間斷運(yùn)行的服務(wù)非常重要,例如金融交易所、在線游戲等。下面就請(qǐng)大家跟著袁老師的節(jié)奏,來(lái)完成一個(gè)Zookeeper集群環(huán)境的搭建吧。
01?Zookeeper集群環(huán)境搭建
1.1?產(chǎn)品特點(diǎn)分布式安裝部署
Zookeeper集群思路:先配置一臺(tái)Zookeeper服務(wù)器,再克隆出兩臺(tái),最終形成Zookeeper集群。分布式環(huán)境搭建之前,需要先安裝Zookeeper。Zookeeper的安裝請(qǐng)參考袁老師往期所發(fā)送的文章。
1.2?產(chǎn)品特點(diǎn)配置服務(wù)器編號(hào)
在/opt/zookeeper/zkData目錄下新建myid文件。
在文件中添加與server對(duì)應(yīng)的編號(hào):1;其余兩臺(tái)服務(wù)器將來(lái)分別配置為2和3。
1.3?產(chǎn)品特點(diǎn)配置zoo.cfg文件
打開(kāi)conf目錄下的zoo.cfg文件,增加如下配置。
配置參數(shù)解讀server.A=B:C:D。

1.4 產(chǎn)品特點(diǎn)配置其余兩臺(tái)服務(wù)器
在虛擬機(jī)數(shù)據(jù)目錄vms下(vms存放虛擬機(jī)的目錄),創(chuàng)建zk02文件夾。
進(jìn)入zk02系統(tǒng)后,修改Linux中的IP的配置。使用root用戶打開(kāi)/etc/sysconfig/network-scripts/ifcfg-eno160文件(文件名不一定是這個(gè)),添加內(nèi)容如下:
配置文件生效,使用命令使得配置文件生效:
修改zko2系統(tǒng)的/opt/zookeeper/zkData/myid中的數(shù)值為2。
第三臺(tái)服務(wù)器zk03,重復(fù)上面的步驟。將zk03系統(tǒng)的IP設(shè)置為192.168.230.133,并修改myid文件中的數(shù)值為3。? ??
1.5?產(chǎn)品特點(diǎn)集群操作
關(guān)閉每臺(tái)Zookeeper服務(wù)器的防火墻。
關(guān)于防火墻的操作常見(jiàn)命令見(jiàn)下:
systemctl stop firewalld.service:停止firewall,只是臨時(shí)關(guān)閉了防火墻,當(dāng)重啟操作系統(tǒng)后,防火墻服務(wù)還是會(huì)再次啟動(dòng)
systemctl disable firewalld:禁止firewall開(kāi)機(jī)啟動(dòng)(禁用防火墻服務(wù))。
查看防火墻狀態(tài)。
啟動(dòng)第1臺(tái)Zookeeper服務(wù)器。
查看Zookeeper狀態(tài)。
注意:因?yàn)闆](méi)有超過(guò)半數(shù)以上的服務(wù)器被啟動(dòng),所以第一臺(tái)服務(wù)器啟動(dòng)后查看服務(wù)狀態(tài),發(fā)現(xiàn)集群失敗 ?(如果防火墻沒(méi)有關(guān)閉,也會(huì)導(dǎo)致集群失敗)。
使用同樣的方式啟動(dòng)第2臺(tái)和第3臺(tái)Zookeeper服務(wù)器。
查看第1臺(tái)的狀態(tài):Mode: follower
查看第2臺(tái)的狀態(tài):Mode: leader
查看第3臺(tái)的狀態(tài):Mode: follower
02?ZK客戶端命令行操作
2.1?產(chǎn)品特點(diǎn)客戶端命令
啟動(dòng)客戶端。
顯示所有操作命令。
查看當(dāng)前ZNode中所包含的內(nèi)容。
查看當(dāng)前節(jié)點(diǎn)詳細(xì)數(shù)據(jù)。
當(dāng)前節(jié)點(diǎn)參數(shù)的介紹見(jiàn)下:

2.2?點(diǎn)節(jié)點(diǎn)操作
在根目錄下,創(chuàng)建中國(guó)和美國(guó)兩個(gè)節(jié)點(diǎn)。
在根目錄下,創(chuàng)建俄羅斯節(jié)點(diǎn),并保存“普京”數(shù)據(jù)到節(jié)點(diǎn)上。
獲得節(jié)點(diǎn)的值。
多級(jí)創(chuàng)建節(jié)點(diǎn)。在日本節(jié)點(diǎn)下,創(chuàng)建東京節(jié)點(diǎn)并保存數(shù)據(jù)“熱”。jp必須提前創(chuàng)建好,否則將報(bào)錯(cuò)“節(jié)點(diǎn)不存在”。
創(chuàng)建短暫節(jié)點(diǎn)。短暫節(jié)點(diǎn)創(chuàng)建成功后, 使用quit命令退出客戶端,然后再重新連接到客戶端,發(fā)現(xiàn)短暫節(jié)點(diǎn)自動(dòng)消失。
創(chuàng)建帶序號(hào)的節(jié)點(diǎn)。
在中國(guó)cn下,創(chuàng)建3個(gè)city順序編號(hào)的節(jié)點(diǎn)。
如果原來(lái)沒(méi)有序號(hào)節(jié)點(diǎn),序號(hào)從0開(kāi)始遞增。
如果原節(jié)點(diǎn)下已有2個(gè)節(jié)點(diǎn),則再排序時(shí)從2開(kāi)始,以此類(lèi)推。
修改節(jié)點(diǎn)數(shù)據(jù)值。
2.3?節(jié)點(diǎn)監(jiān)聽(tīng)
監(jiān)聽(tīng)節(jié)點(diǎn)的值變化或子節(jié)點(diǎn)變化(路徑變化)。
1.在server3主機(jī)上注冊(cè)監(jiān)聽(tīng)/us節(jié)點(diǎn)的數(shù)據(jù)變化。
2.在Server1主機(jī)上修改/us的數(shù)據(jù)。
3.Server3會(huì)立刻響應(yīng)。
4.如果在Server1的/us下面創(chuàng)建子節(jié)點(diǎn)NewYork。
5.Server3會(huì)立刻響應(yīng)。
2.4?刪除節(jié)點(diǎn)
1.刪除節(jié)點(diǎn)。
2.遞歸刪除節(jié)點(diǎn)(非空節(jié)點(diǎn),節(jié)點(diǎn)下有子節(jié)點(diǎn))。
說(shuō)明:不僅刪除/cn,而且/cn下的所有子節(jié)點(diǎn)也隨之刪除。
03?Zookeeper集群實(shí)戰(zhàn)
3.1?項(xiàng)目環(huán)境搭建
1.使用IDEA創(chuàng)建一個(gè)項(xiàng)目名稱為【test_zookeeper】的Maven工程。

2.在項(xiàng)目的pom.xml文件中添加依賴。
3.在resources下創(chuàng)建log4j.properties。
3.2?創(chuàng)建Zookeeper客戶端
在項(xiàng)目的src/test/java目錄下創(chuàng)建com.cy.test包,并在該包下創(chuàng)建ZooKeeperTests測(cè)試類(lèi)。
3.3?創(chuàng)建節(jié)點(diǎn)
3.3.1 ACL對(duì)象介紹
一個(gè)ACL對(duì)象就是一個(gè)Id和permission對(duì)。
1.表示哪個(gè)/哪些范圍的Id(Who)在通過(guò)了怎樣的鑒權(quán)(How)之后,就允許進(jìn)行那些操作(What)。即Who How What。
2.permission(What)就是一個(gè)int表示的位碼,每一位代表一個(gè)對(duì)應(yīng)操作的允許狀態(tài)。
3.類(lèi)似Linux的文件權(quán)限,不同的是共有5種操作:CREATE、READ、WRITE、DELETE、ADMIN(對(duì)應(yīng)更改ACL的權(quán)限)。
對(duì)于ACL的參數(shù)詳細(xì)介紹見(jiàn)下表:

3.3.2 創(chuàng)建節(jié)點(diǎn)實(shí)現(xiàn)
在ZooKeeperTests測(cè)試類(lèi)中添加創(chuàng)建節(jié)點(diǎn)的createNode()方法。
運(yùn)行createNode()方法將看到如下的日志輸入。
3.3.3 Session超時(shí)異常
如果createNode()方法在運(yùn)行的時(shí)候出現(xiàn)異常,拋出ClientCnxn$SessionTimeoutException類(lèi)型錯(cuò)誤。
針對(duì)Session超時(shí)異常問(wèn)題,解決方案見(jiàn)下:
增加連接時(shí)間
檢查集群IP是否編寫(xiě)正確
關(guān)閉防火墻:systemctl stop firewalld
3.4?查詢節(jié)點(diǎn)的值
在ZooKeeperTests測(cè)試類(lèi)中添加查詢節(jié)點(diǎn)的值find()方法。
3.5?ZK節(jié)點(diǎn)增刪改查操作
1.更新節(jié)點(diǎn)操作。在ZooKeeperTests測(cè)試類(lèi)中添加更新節(jié)點(diǎn)的值update()方法。
2.刪除節(jié)點(diǎn)。在ZooKeeperTests測(cè)試類(lèi)中添加刪除節(jié)點(diǎn)的delete()方法。
3.獲取子節(jié)點(diǎn)。在ZooKeeperTests測(cè)試類(lèi)中添加獲取子節(jié)點(diǎn)的getChildNodes()方法。
4.監(jiān)聽(tīng)子節(jié)點(diǎn)的變化。在ZooKeeperTests測(cè)試類(lèi)中添加監(jiān)聽(tīng)子節(jié)點(diǎn)變化的listenChildNodes()方法。
運(yùn)行l(wèi)istenChildNodes()方法后,程序在運(yùn)行的過(guò)程中,去zk01節(jié)點(diǎn)的Zookeeper的根目錄下,創(chuàng)建"/yuanxin"子節(jié)點(diǎn)。
一旦監(jiān)聽(tīng)到子節(jié)點(diǎn)的變化,在IDEA控制臺(tái)將打印process()方法的內(nèi)容。
5.判斷Znode是否存在。在ZooKeeperTests測(cè)試類(lèi)中添加判斷子節(jié)點(diǎn)是否存在的exist()方法。
04?回顧總結(jié)
今天袁老師主要是帶大家搭建了Zookeeper集群開(kāi)發(fā)環(huán)境,以及集群環(huán)境下命令行的相關(guān)操作。然后我們又學(xué)習(xí)了Zookeeper的常用API,主要學(xué)習(xí)了通過(guò)API來(lái)創(chuàng)建節(jié)點(diǎn)、查詢節(jié)點(diǎn)、修改節(jié)點(diǎn)、刪除節(jié)點(diǎn)、獲取子節(jié)點(diǎn)、監(jiān)聽(tīng)子節(jié)點(diǎn)等相關(guān)的內(nèi)容。
今天的內(nèi)容就給大家介紹到這里了,現(xiàn)在你學(xué)會(huì)了嗎?關(guān)注「袁庭新」,干貨天天都不斷!
