一分鐘讀懂zookeeper
zookeeper經(jīng)常被稱作基礎(chǔ)設(shè)施,kafka與dubbo這些都需要安裝zookeeper的前提下才能運行,業(yè)務(wù)開發(fā)中也經(jīng)常作為分布式鎖的解決方案被應(yīng)用,今天我們就來了解下zookeeper。
1.Zookeeper=文件系統(tǒng)+監(jiān)聽通知機制?
zookeeper與Unix文件系統(tǒng)類似,其中每個節(jié)點稱為“數(shù)據(jù)節(jié)點”或ZNode,每個znode可以存儲數(shù)據(jù),還可以掛載子節(jié)點,因此可以稱之為“樹”。znode節(jié)點(目錄節(jié)點)如圖中的 NameService ,和文件系統(tǒng)一樣,我們能夠自由的增加、刪除znode,在一個znode下增加、刪除子znode,唯一的不同在于znode是可以存儲數(shù)據(jù)的。

znode的四種類型:
PERSISTENT-持久化目錄節(jié)點客戶端與zookeeper斷開連接后,該節(jié)點依舊存在
PERSISTENT_SEQUENTIAL-持久化順序編號目錄節(jié)點客戶端與zookeeper斷開連接后,該節(jié)點依舊存在,只是Zookeeper給該節(jié)點名稱進(jìn)行順序編號
EPHEMERAL-臨時目錄節(jié)點客戶端與zookeeper斷開連接后,該節(jié)點被刪除
EPHEMERAL_SEQUENTIAL-臨時順序編號目錄節(jié)點客戶端與zookeeper斷開連接后,該節(jié)點被刪除,只是Zookeeper給該節(jié)點名稱進(jìn)行順序編號
客戶端注冊監(jiān)聽它關(guān)心的目錄節(jié)點,當(dāng)目錄節(jié)點發(fā)生變化(數(shù)據(jù)改變、被刪除、子目錄節(jié)點增加刪除)時,zookeeper會通知客戶端。
2.zookeeper集群模式
zookeeper集群共有3種角色,分別是follower、leader、Observer:


leader:主節(jié)點,負(fù)責(zé)數(shù)據(jù)的寫,也能進(jìn)行讀操作
? ? ? ? ? ? ?? 1.事務(wù)請求(寫數(shù)據(jù))的唯一調(diào)度和處理者,保證集群事務(wù)處理的順序性
? ? ? ? ? ? ?? 2. 集群內(nèi)部個服務(wù)器的調(diào)度者(管理follower,數(shù)據(jù)同步)
Follower主要有四個功能:
? ? ? ? ? ? ? ? 1. 處理非事務(wù)請求(讀數(shù)據(jù)),轉(zhuǎn)發(fā)事務(wù)請求(寫數(shù)據(jù))給leader
? 2 .參與事務(wù)請求proposal投票(每個事務(wù)請求都需要過半機器投票才能被真正應(yīng)用到ZK的內(nèi)存數(shù)據(jù)庫 中,這個投票+統(tǒng)計過程被稱為Proposal流程)
? 3 .參與leader選舉投票
Observer:觀察者,只負(fù)責(zé)數(shù)據(jù)的讀,且不參加leader的選舉與事務(wù)請求。
3.分布式鎖方案比較

zookeeper實現(xiàn)分布式鎖方法:
1.利用節(jié)點名稱的唯一性來實現(xiàn)分布式鎖
跟文件系統(tǒng)類似,多個客戶端創(chuàng)建同一個目錄,只會有一個成功。剩下的客戶端陷入等待,一旦得到鎖的客戶端,刪除節(jié)點,其余客戶端開始新一輪競爭鎖。會產(chǎn)生饑餓現(xiàn)象,可能導(dǎo)致有個線程,一直搶不到鎖。但是對于防重復(fù)提交,可以使用。
2.利用臨時順序節(jié)點來加鎖
每次去加鎖,按照順序創(chuàng)建順序節(jié)點