ZooKeeper shell
運行?zkCli.sh?-server ip?進(jìn)入命令行工具类垦。
輸入help蚤认,輸出zk shell提示
創(chuàng)建節(jié)點
create[-s] [-e]pathdata acl
其中,-s或**-e分別指定節(jié)點特性**氯析,順序或臨時節(jié)點掩缓,若不指定遵岩,則表示持久節(jié)點尘执。
讀取節(jié)點
ls path[watch]get path[watch]ls2 path[watch]
**更新節(jié)點 **
setpathdata
刪除節(jié)點
deletepathrmrpath
===================================================
ZooKeeper 的數(shù)據(jù)模型表悬,采用樹形層次結(jié)構(gòu)蟆沫,ZooKeeper 樹中的每個節(jié)點被稱為— Znode温治。
Znode 節(jié)點,既可以存數(shù)據(jù)舟山,又可以有子節(jié)點累盗。
只要znode的路徑是一樣的,不管這個znode在哪臺機(jī)器上劫窒,znode上的數(shù)據(jù)都是一模一樣的主巍。
Znode 存儲數(shù)據(jù)大小有限制挪凑。ZooKeeper的每個Znode的數(shù)據(jù)大小至多1M,當(dāng)時常規(guī)使用中應(yīng)該遠(yuǎn)小于此值搞旭。
Znode有兩種咬最,分別為臨時節(jié)點和永久節(jié)點。
臨時節(jié)點:?該節(jié)點的生命周期依賴于創(chuàng)建它們的會話惑申。一旦會話結(jié)束圈驼,臨時節(jié)點將被自動刪除望几,當(dāng)然可以也可以手動刪除。臨時節(jié)點不允許擁有子節(jié)點衙伶。
永久節(jié)點:?該節(jié)點的生命周期不依賴于會話害碾,并且只有在客戶端顯示執(zhí)行刪除操作的時候慌随,他們才能被刪除阁猜。
Znode還有一個序列化的特性,如果創(chuàng)建的時候指定的話黄刚,該Znode的名字后面會自動追加一個不斷增加的序列號民效。序列號對于此節(jié)點的父節(jié)點來說是唯一的,這樣便會記錄每個子節(jié)點創(chuàng)建的先后順序业扒。
======================================================
ZooKeeper 中臂寝,引入了Watcher機(jī)制來實現(xiàn)通知功能咆贬。 ZooKeeper允許客戶端向服務(wù)端注冊一個Watcher監(jiān)聽,當(dāng)服務(wù)端的一些事件觸發(fā)了這個Watcher集嵌,那么服務(wù)器就會向客戶端發(fā)送一個事件來實現(xiàn)分布式的通知功能御毅。
觸發(fā)事件種類很多端蛆,如:節(jié)點創(chuàng)建,節(jié)點刪除嫌拣,節(jié)點改變呆躲,子節(jié)點改變等插掂。
**1.7.1腥例、Watch 機(jī)制特點 **?一次性觸發(fā)?事件發(fā)生觸發(fā)監(jiān)聽燎竖,一個watcher event就會被發(fā)送到設(shè)置監(jiān)聽的客戶端要销,這種效果是一次性的疏咐,后續(xù)再次發(fā)生同樣的事件,不會再次觸發(fā)茁肠。
事件封裝?ZooKeeper使用WatchedEvent對象來封裝服務(wù)端事件并傳遞缩举。 WatchedEvent包含了每一個事件的三個基本屬性: 通知狀態(tài)(keeperState)仅孩,事件類型(EventType)和節(jié)點路徑(path)
1.7.2、Shell 客戶端設(shè)置 watcher?設(shè)置節(jié)點數(shù)據(jù)變動監(jiān)聽:
get/aaa00000001 watch helloallen
通過另一個客戶端更改節(jié)點數(shù)據(jù):
set/aaa00000001hello22
此時設(shè)置監(jiān)聽的節(jié)點收到通知
==============================================
1.8.1公浪、數(shù)據(jù)發(fā)布與訂閱(配置中心)?發(fā)布與訂閱模型船侧,即所謂的配置中心,顧名思義就是發(fā)布者將數(shù)據(jù)發(fā)布到ZK 節(jié)點上预柒,供訂閱者動態(tài)獲取數(shù)據(jù)宜鸯,實現(xiàn)配置信息的集中式管理和動態(tài)更新遮怜。
應(yīng)用在啟動的時候會主動來獲取一次配置,同時适贸,在節(jié)點上注冊一Watcher拜姿,這樣一來冯遂,以后每次配置有更新的時候,都會實時通知到訂閱的客戶端壁却,從來達(dá)到獲取最新配置信息的目的展东。
1.8.2炒俱、集群選主?在高可用的系統(tǒng)中,往往有一個active的節(jié)點砸王,多個standby節(jié)點峦阁。正常服務(wù)時,由active節(jié)點對外服務(wù)驹闰,standby節(jié)點作為備用節(jié)點撒会。當(dāng)active節(jié)點down機(jī)時茧彤,standby節(jié)點就接替active節(jié)點,繼續(xù)對外服務(wù)曾掂,從而實現(xiàn)了系統(tǒng)的高可用。
1.8.3溜歪、分布式鎖?所有客戶端都想要獲得執(zhí)行權(quán)许蓖,那就必須都去/locked節(jié)點下调衰,創(chuàng)建一個子節(jié)點(/locked/kkk)嚎莉,如果/locked/kkk節(jié)點已經(jīng)存在了趋箩,那么后面再創(chuàng)建是會創(chuàng)建不成功的加派,跟java的創(chuàng)建文件夾是一樣的道理,已存在則創(chuàng)建失敗竹勉。那么娄琉,最終只有一個客戶端可以成功創(chuàng)建這個節(jié)點,也就是只有一個客戶端獲得這把鎖(獲得唯一的執(zhí)行權(quán))车胡。當(dāng)客戶端應(yīng)用執(zhí)行完成后,只要刪除/locked/kkk節(jié)點丧慈,就相當(dāng)于釋放了鎖逃默,然后其他客戶端監(jiān)聽到節(jié)點被刪除簇搅,就能觸發(fā)事件,又開始搶著創(chuàng)建鎖節(jié)點了吟税。
1.9姿现、選舉機(jī)制?zookeeper默認(rèn)的算法是FastLeaderElection备典,采用投票數(shù)大于半數(shù)則勝出的邏輯。
假設(shè)目前有 5 臺服務(wù)器提佣,每臺服務(wù)器均沒有數(shù)據(jù),它們的編號分別1,2,3,4,5,按編號依次啟動潮针,它們的選舉過程如下:
服務(wù)器1啟動然低,給自己投票务唐,然后發(fā)投票信息,由于其它機(jī)器還沒有啟動所以它收不到反饋信息吨灭,服務(wù)器1的狀態(tài)一直屬于Looking刑巧。
服務(wù)器2啟動,給自己投票吠冤,同時與之前啟動的服務(wù)器1交換結(jié)果,由于服務(wù)器2的編號大所以服務(wù)器2勝出拯辙,但此時投票數(shù)沒有大于半數(shù)涯保,所以兩個服務(wù)器的狀態(tài)依然是LOOKING周伦。
服務(wù)器3啟動,給自己投票专挪,同時與之前啟動的服務(wù)器1,2交換信息,由于服務(wù)器3的編號最大所以服務(wù)器3勝出困肩,此時投票數(shù)正好大于半數(shù)脆侮,所以服務(wù)器3成為領(lǐng)導(dǎo)者靖避,服務(wù)器1,2成為小弟比默。
服務(wù)器4啟動命咐,給自己投票醋奠,同時與之前啟動的服務(wù)器1,2,3交換信息伊佃,盡管服務(wù)器4的編號大航揉,但之前服務(wù)器3已經(jīng)勝出,所以服務(wù)器4只能成為小弟议薪。