ZooKeeper shell
運(yùn)行?zkCli.sh?-server ip?進(jìn)入命令行工具。
輸入help,輸出zk shell提示
創(chuàng)建節(jié)點(diǎn)
create[-s] [-e]pathdata acl
其中,-s或**-e分別指定節(jié)點(diǎn)特性**,順序或臨時(shí)節(jié)點(diǎn),若不指定,則表示持久節(jié)點(diǎn)。
讀取節(jié)點(diǎn)
ls path[watch]get path[watch]ls2 path[watch]
**更新節(jié)點(diǎn) **
setpathdata
刪除節(jié)點(diǎn)
deletepathrmrpath
===================================================
ZooKeeper 的數(shù)據(jù)模型,采用樹形層次結(jié)構(gòu),ZooKeeper 樹中的每個(gè)節(jié)點(diǎn)被稱為— Znode。
Znode 節(jié)點(diǎn),既可以存數(shù)據(jù),又可以有子節(jié)點(diǎn)。
只要znode的路徑是一樣的,不管這個(gè)znode在哪臺(tái)機(jī)器上,znode上的數(shù)據(jù)都是一模一樣的。
Znode 存儲(chǔ)數(shù)據(jù)大小有限制。ZooKeeper的每個(gè)Znode的數(shù)據(jù)大小至多1M,當(dāng)時(shí)常規(guī)使用中應(yīng)該遠(yuǎn)小于此值。
Znode有兩種,分別為臨時(shí)節(jié)點(diǎn)和永久節(jié)點(diǎn)。
臨時(shí)節(jié)點(diǎn):?該節(jié)點(diǎn)的生命周期依賴于創(chuàng)建它們的會(huì)話。一旦會(huì)話結(jié)束,臨時(shí)節(jié)點(diǎn)將被自動(dòng)刪除,當(dāng)然可以也可以手動(dòng)刪除。臨時(shí)節(jié)點(diǎn)不允許擁有子節(jié)點(diǎn)。
永久節(jié)點(diǎn):?該節(jié)點(diǎn)的生命周期不依賴于會(huì)話,并且只有在客戶端顯示執(zhí)行刪除操作的時(shí)候,他們才能被刪除。
Znode還有一個(gè)序列化的特性,如果創(chuàng)建的時(shí)候指定的話,該Znode的名字后面會(huì)自動(dòng)追加一個(gè)不斷增加的序列號(hào)。序列號(hào)對(duì)于此節(jié)點(diǎn)的父節(jié)點(diǎn)來說是唯一的,這樣便會(huì)記錄每個(gè)子節(jié)點(diǎn)創(chuàng)建的先后順序。
======================================================
ZooKeeper 中,引入了Watcher機(jī)制來實(shí)現(xiàn)通知功能。 ZooKeeper允許客戶端向服務(wù)端注冊(cè)一個(gè)Watcher監(jiān)聽,當(dāng)服務(wù)端的一些事件觸發(fā)了這個(gè)Watcher,那么服務(wù)器就會(huì)向客戶端發(fā)送一個(gè)事件來實(shí)現(xiàn)分布式的通知功能。
觸發(fā)事件種類很多,如:節(jié)點(diǎn)創(chuàng)建,節(jié)點(diǎn)刪除,節(jié)點(diǎn)改變,子節(jié)點(diǎn)改變等。
**1.7.1、Watch 機(jī)制特點(diǎn) **?一次性觸發(fā)?事件發(fā)生觸發(fā)監(jiān)聽,一個(gè)watcher event就會(huì)被發(fā)送到設(shè)置監(jiān)聽的客戶端,這種效果是一次性的,后續(xù)再次發(fā)生同樣的事件,不會(huì)再次觸發(fā)。
事件封裝?ZooKeeper使用WatchedEvent對(duì)象來封裝服務(wù)端事件并傳遞。 WatchedEvent包含了每一個(gè)事件的三個(gè)基本屬性: 通知狀態(tài)(keeperState),事件類型(EventType)和節(jié)點(diǎn)路徑(path)
1.7.2、Shell 客戶端設(shè)置 watcher?設(shè)置節(jié)點(diǎn)數(shù)據(jù)變動(dòng)監(jiān)聽:
get/aaa00000001 watch helloallen
通過另一個(gè)客戶端更改節(jié)點(diǎn)數(shù)據(jù):
set/aaa00000001hello22
此時(shí)設(shè)置監(jiān)聽的節(jié)點(diǎn)收到通知
==============================================
1.8.1、數(shù)據(jù)發(fā)布與訂閱(配置中心)?發(fā)布與訂閱模型,即所謂的配置中心,顧名思義就是發(fā)布者將數(shù)據(jù)發(fā)布到ZK 節(jié)點(diǎn)上,供訂閱者動(dòng)態(tài)獲取數(shù)據(jù),實(shí)現(xiàn)配置信息的集中式管理和動(dòng)態(tài)更新。
應(yīng)用在啟動(dòng)的時(shí)候會(huì)主動(dòng)來獲取一次配置,同時(shí),在節(jié)點(diǎn)上注冊(cè)一Watcher,這樣一來,以后每次配置有更新的時(shí)候,都會(huì)實(shí)時(shí)通知到訂閱的客戶端,從來達(dá)到獲取最新配置信息的目的。
1.8.2、集群選主?在高可用的系統(tǒng)中,往往有一個(gè)active的節(jié)點(diǎn),多個(gè)standby節(jié)點(diǎn)。正常服務(wù)時(shí),由active節(jié)點(diǎn)對(duì)外服務(wù),standby節(jié)點(diǎn)作為備用節(jié)點(diǎn)。當(dāng)active節(jié)點(diǎn)down機(jī)時(shí),standby節(jié)點(diǎn)就接替active節(jié)點(diǎn),繼續(xù)對(duì)外服務(wù),從而實(shí)現(xiàn)了系統(tǒng)的高可用。
1.8.3、分布式鎖?所有客戶端都想要獲得執(zhí)行權(quán),那就必須都去/locked節(jié)點(diǎn)下,創(chuàng)建一個(gè)子節(jié)點(diǎn)(/locked/kkk),如果/locked/kkk節(jié)點(diǎn)已經(jīng)存在了,那么后面再創(chuàng)建是會(huì)創(chuàng)建不成功的,跟java的創(chuàng)建文件夾是一樣的道理,已存在則創(chuàng)建失敗。那么,最終只有一個(gè)客戶端可以成功創(chuàng)建這個(gè)節(jié)點(diǎn),也就是只有一個(gè)客戶端獲得這把鎖(獲得唯一的執(zhí)行權(quán))。當(dāng)客戶端應(yīng)用執(zhí)行完成后,只要?jiǎng)h除/locked/kkk節(jié)點(diǎn),就相當(dāng)于釋放了鎖,然后其他客戶端監(jiān)聽到節(jié)點(diǎn)被刪除,就能觸發(fā)事件,又開始搶著創(chuàng)建鎖節(jié)點(diǎn)了。
1.9、選舉機(jī)制?zookeeper默認(rèn)的算法是FastLeaderElection,采用投票數(shù)大于半數(shù)則勝出的邏輯。
假設(shè)目前有 5 臺(tái)服務(wù)器,每臺(tái)服務(wù)器均沒有數(shù)據(jù),它們的編號(hào)分別1,2,3,4,5,按編號(hào)依次啟動(dòng),它們的選舉過程如下:
服務(wù)器1啟動(dòng),給自己投票,然后發(fā)投票信息,由于其它機(jī)器還沒有啟動(dòng)所以它收不到反饋信息,服務(wù)器1的狀態(tài)一直屬于Looking。
服務(wù)器2啟動(dòng),給自己投票,同時(shí)與之前啟動(dòng)的服務(wù)器1交換結(jié)果,由于服務(wù)器2的編號(hào)大所以服務(wù)器2勝出,但此時(shí)投票數(shù)沒有大于半數(shù),所以兩個(gè)服務(wù)器的狀態(tài)依然是LOOKING。
服務(wù)器3啟動(dòng),給自己投票,同時(shí)與之前啟動(dòng)的服務(wù)器1,2交換信息,由于服務(wù)器3的編號(hào)最大所以服務(wù)器3勝出,此時(shí)投票數(shù)正好大于半數(shù),所以服務(wù)器3成為領(lǐng)導(dǎo)者,服務(wù)器1,2成為小弟。
服務(wù)器4啟動(dòng),給自己投票,同時(shí)與之前啟動(dòng)的服務(wù)器1,2,3交換信息,盡管服務(wù)器4的編號(hào)大,但之前服務(wù)器3已經(jīng)勝出,所以服務(wù)器4只能成為小弟。