溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

分布式利器Zookeeper(一)

發(fā)布時(shí)間:2020-06-03 07:39:03 來(lái)源:網(wǎng)絡(luò) 閱讀:5397 作者:zfz_linux_boy 欄目:建站服務(wù)器

Zookeeper不論是在實(shí)際項(xiàng)目中,還是在各種分布式開(kāi)源項(xiàng)目中都得到了廣泛應(yīng)用,從本篇博客開(kāi)始,將為大家?guī)?lái)我對(duì)Zookeeper的認(rèn)識(shí)。這個(gè)系列將會(huì)涵蓋Zookeeper的介紹、環(huán)境搭建、配置說(shuō)明、Java操作Zookeeper(原生API方式)、zkclient操作Zookeeper方式、Zookeeper的典型應(yīng)用場(chǎng)景分析以及Curator框架等。

Hello,Zookeeper

Zookeeper是一個(gè)高可用的分布式管理與協(xié)調(diào)框架,基于ZAB算法(原子消息廣播協(xié)議)實(shí)現(xiàn)。ZK能夠很好的保證分布式環(huán)境下的數(shù)據(jù)一致性,這一特性使得ZK是處理分布式一致性問(wèn)題的利器!這個(gè)利器有哪些特性呢,看看下面你就了解了。

可靠性:一旦Zookeeper成功的應(yīng)用了一個(gè)事務(wù),并完成對(duì)client的響應(yīng),那么Zookeeper內(nèi)部集群的所有服務(wù)器的狀態(tài)都會(huì)是一致的保留下來(lái)。

單一視圖:由于上面可靠性的保證,使得無(wú)論client連接的是ZK集群中的哪個(gè)服務(wù)器,所看到的數(shù)據(jù)都是一致的。

順序一致性:從一個(gè)client發(fā)起的請(qǐng)求,最終會(huì)嚴(yán)格的按照發(fā)起的順序被應(yīng)用到Zookeeper中去?!緦?shí)質(zhì)上,ZK會(huì)對(duì)每一個(gè)client的每一個(gè)請(qǐng)求,進(jìn)行編號(hào),說(shuō)白了,就是分配一個(gè)全局唯一的遞增編號(hào),這個(gè)編號(hào)反映了所有事務(wù)操作的先后順序?!?/span>

實(shí)時(shí)性:通常意義下的實(shí)時(shí)性是指一旦事務(wù)被成功應(yīng)用,那么client會(huì)立刻從服務(wù)器端獲取到變更后的新數(shù)據(jù)。ZK僅僅能夠保證在一定時(shí)間內(nèi),client最終一定會(huì)能從服務(wù)器上獲取到最新的數(shù)據(jù)。

高可用:在ZK集群內(nèi)部,會(huì)有一個(gè)Leader,多個(gè)Follower。一旦Leader掛掉,那么ZK會(huì)通過(guò)Paxos算法選舉出新的Leader,只要ZK集群內(nèi)部的服務(wù)器有一半以上正常工作,那么ZK就能對(duì)外正常提供服務(wù)!

簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu):類似于Linux文件系統(tǒng)的樹(shù)形結(jié)構(gòu),簡(jiǎn)單,實(shí)用?。?shù)形層次空間)

高性能:性能有多高呢,舉個(gè)栗子,比如我們經(jīng)常通過(guò)創(chuàng)建臨時(shí)節(jié)點(diǎn)來(lái)處理分布式鎖,要知道臨時(shí)節(jié)點(diǎn)是存儲(chǔ)在內(nèi)存中的,在讀場(chǎng)景壓力測(cè)試下,QPS高達(dá)10W+!也就是說(shuō)ZK在讀場(chǎng)景下,性能非常突出!


初步認(rèn)識(shí)Zookeeper的數(shù)據(jù)模型

分布式利器Zookeeper(一)


每一個(gè)節(jié)點(diǎn)被稱為znode,znode可以有子節(jié)點(diǎn)目錄,并且每個(gè)znode可以存儲(chǔ)數(shù)據(jù)(特別需要注意的是臨時(shí)節(jié)點(diǎn)不可以有子節(jié)點(diǎn))

znode如果是臨時(shí)節(jié)點(diǎn),意味著創(chuàng)建這個(gè)znode的client一旦與ZK集群失去聯(lián)系,這個(gè)臨時(shí)的znode將被自動(dòng)刪除。(事實(shí)上,client與ZK通信是采用長(zhǎng)連接方式,并通過(guò)心跳的方式保持連接,這種狀態(tài)就是session,一旦session失效,就是連接斷開(kāi),臨時(shí)節(jié)點(diǎn)會(huì)被刪除掉)

znode是可以被監(jiān)控的,不論是znode本身的數(shù)據(jù)變化,還是該znode下的子節(jié)點(diǎn)的變化,都可以進(jìn)行監(jiān)控,這也是ZK的核心特性。(很多應(yīng)用場(chǎng)景就是基于這個(gè)特性,后續(xù)進(jìn)行詳細(xì)介紹)


初步認(rèn)識(shí)Zookeeper的角色組成

分布式利器Zookeeper(一)


這里,我們先了解下ZK Server的身份特性:

Leader:負(fù)責(zé)客戶端的write類型的請(qǐng)求

Follower:負(fù)責(zé)客戶端的read類型請(qǐng)求,并可以參與Leader的選舉

watcher:后文介紹。


install Zookeeper

這里以zookeeper-3.4.5版本為例,搭建一個(gè)ZK集群(至少要求3個(gè)節(jié)點(diǎn),并且各個(gè)ZK SERVER之間系統(tǒng)時(shí)間保持一致)。使用的機(jī)器列表是:192.168.99.121、192.168.99.122、192.168.99.123。

以192.168.99.121為例進(jìn)行說(shuō)明:

分布式利器Zookeeper(一)


分布式利器Zookeeper(一)


分布式利器Zookeeper(一)


分布式利器Zookeeper(一)


分布式利器Zookeeper(一)


配置說(shuō)明:

tickTime:ZK集群與客戶端、ZK集群內(nèi)部SERVER之間的心跳間隔,默認(rèn)2S。

initLimit:在客戶端連接ZK集群時(shí),可以忍受多少個(gè)心跳次數(shù)。上述的配置表明,如果client初始連接ZK集群,在10*2S=20S內(nèi)ZK集群沒(méi)有返回連接成功,即意味著連接失敗。

syncLimit:表示ZK集群內(nèi)部Leader和Follower之間請(qǐng)求應(yīng)答可以忍受多少個(gè)心跳次數(shù)。

dataDir:ZK保存數(shù)據(jù)以及日志的目錄。

clientPort:ZK集群對(duì)外暴露的接口,即client訪問(wèn)ZK集群的端口(2181)。

server.x = IP:port-a:port-b 

X表示是第幾號(hào)服務(wù)器,從0開(kāi)始編號(hào),并和dataDir下的myid文件對(duì)應(yīng)。

port-a表示Leader和Follower進(jìn)行信息通信的端口(2888)。

port-b表示Follower進(jìn)行選舉的端口(3888)。


分布式利器Zookeeper(一)


分布式利器Zookeeper(一)


分布式利器Zookeeper(一)



基本的ZK命令

分布式利器Zookeeper(一)


通過(guò)zkCli.sh進(jìn)入客戶端進(jìn)行操作:

查找ls、創(chuàng)建znode節(jié)點(diǎn)create(注意每個(gè)節(jié)點(diǎn)都是有值的)、獲取get、設(shè)置set。

我們觀察下下面幾個(gè)屬性:

ctime和cZxid是一對(duì),表示創(chuàng)建ZNODE的時(shí)間和事件編號(hào);

mtime和mZxid是一對(duì),表示修改ZNODE數(shù)據(jù)內(nèi)容的時(shí)間和事件編號(hào);(通過(guò)set指令會(huì)改變這2個(gè)屬性,但是該節(jié)點(diǎn)的子節(jié)點(diǎn)的變化不會(huì)影響該節(jié)點(diǎn))

dataVersion:表示ZNODE數(shù)據(jù)的版本,注意利用JAVA 原生API進(jìn)行delete ZNODE時(shí),需要提供version才可以刪除ZNODE。(當(dāng)然我們可以提供-1來(lái)跳過(guò)版本檢查機(jī)制)

dataLength、numChildren都好理解。

另外,注意rmr指令可以遞歸刪除ZNODE;而delete只可以刪除指定ZNODE。


ZooInspector工具及IntelliJ IDEA與ZK集成

分布式利器Zookeeper(一)


ZooInspector是一個(gè)可運(yùn)行的JAR,運(yùn)行后直接連接ZK集群中的任何一個(gè)SERVER即可。

分布式利器Zookeeper(一)


分布式利器Zookeeper(一)


分布式利器Zookeeper(一)


OK,到這里,一切準(zhǔn)備工作就準(zhǔn)備就緒了~

咱們下期來(lái)看JAVA操作ZK(基于Zookeeper的原生API)、分布式鎖探討、Watch特性等~


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI