一、概述
在四子王等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè) 網(wǎng)站設(shè)計(jì)制作按需搭建網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),成都全網(wǎng)營(yíng)銷,外貿(mào)營(yíng)銷網(wǎng)站建設(shè),四子王網(wǎng)站建設(shè)費(fèi)用合理。Zookeeper是一個(gè)開源的分布式的,為分布式應(yīng)用提供協(xié)調(diào)服務(wù)的Apache項(xiàng)目。Hadoop和Hbase的重要組件。它是一個(gè)為分布式應(yīng)用提供一致服務(wù)的軟件。
雖然可以用zk實(shí)現(xiàn)很多功能,但是實(shí)際上zk只提供了三個(gè)東西:文件系統(tǒng)、通知機(jī)制、集群管理機(jī)制。
zk的存儲(chǔ)的數(shù)據(jù)的結(jié)構(gòu),類似于一個(gè)文件系統(tǒng),結(jié)構(gòu)如下:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖1.1 zk文件系統(tǒng)
每個(gè)節(jié)點(diǎn)稱為znode,每個(gè)znode都是一個(gè)類似于KV的結(jié)構(gòu),每個(gè)節(jié)點(diǎn)名稱相當(dāng)于key,每個(gè)節(jié)點(diǎn)中都保存了對(duì)應(yīng)的數(shù)據(jù),類似于Key對(duì)應(yīng)的value。每個(gè)znode下面都可以有多個(gè)子節(jié)點(diǎn),就這樣一直延續(xù)下去,構(gòu)成了類似于Linux文件系統(tǒng)的架構(gòu)。
當(dāng)某個(gè)client監(jiān)聽(tīng)某個(gè)節(jié)點(diǎn)時(shí)(watch機(jī)制,后面有講),當(dāng)該節(jié)點(diǎn)發(fā)生變化時(shí)(有可能是增加子節(jié)點(diǎn),或者節(jié)點(diǎn)值變了等),zk就會(huì)通知監(jiān)聽(tīng)該節(jié)點(diǎn)的客戶端。后續(xù)該怎么處理就看客戶端的處理邏輯了。
zk本身是一個(gè)集群結(jié)構(gòu),有一個(gè)leader節(jié)點(diǎn),負(fù)責(zé)寫請(qǐng)求,多個(gè)follower負(fù)責(zé)響應(yīng)讀請(qǐng)求。并且在leader節(jié)點(diǎn)故障時(shí),會(huì)自動(dòng)根據(jù)選舉機(jī)制從剩下的follower中選出新的leader。
1)Zookeeper:一個(gè)領(lǐng)導(dǎo)者(leader),多個(gè)跟隨者(follower)組成的集群。 2)Leader負(fù)責(zé)進(jìn)行投票的發(fā)起和決議,更新系統(tǒng)狀態(tài)。 3)Follower用于接收客戶請(qǐng)求并向客戶端返回結(jié)果,在選舉Leader過(guò)程中參與投票。 4)集群中奇數(shù)臺(tái)服務(wù)器只要有半數(shù)以上節(jié)點(diǎn)存活,Zookeeper集群就能正常服務(wù)。 5)全局?jǐn)?shù)據(jù)一致:每個(gè)server保存一份相同的數(shù)據(jù)副本,client無(wú)論連接到哪個(gè)server,數(shù)據(jù)都是一致的。 6)更新請(qǐng)求順序進(jìn)行,來(lái)自同一個(gè)client的更新請(qǐng)求按其發(fā)送順序依次執(zhí)行。 7)數(shù)據(jù)更新原子姓,一次數(shù)據(jù)更新要么成功,要么失敗。 8)實(shí)時(shí)姓,在一定時(shí)間范圍內(nèi),client能讀到最新數(shù)據(jù)。
leader: 1.恢復(fù)數(shù)據(jù); 2.維持與Learner的心跳,接收Learner請(qǐng)求并判斷Learner的請(qǐng)求消息類型; 3.Learner的消息類型主要有PING消息、REQUEST消息、ACK消息、REVALIDATE消息,根據(jù)不同的消息類型,進(jìn)行不同的處理。 PING消息是指Learner的心跳信息;REQUEST消息是Follower發(fā)送的提議信息,包括寫請(qǐng)求及同步請(qǐng)求;ACK消息是Follower的對(duì)提議的回復(fù),超過(guò)半數(shù)的Follower通過(guò),則commit該提議;REVALIDATE消息是用來(lái)延長(zhǎng)SESSION有效時(shí)間。
follower: 1)向Leader發(fā)送請(qǐng)求(PING消息、REQUEST消息、ACK消息、REVALIDATE消息);| 2)接收Leader消息并進(jìn)行處理; 3)接收Client的請(qǐng)求,如果為寫請(qǐng)求,發(fā)送給Leader進(jìn)行處理; 4)返回Client結(jié)果。
Follower的消息循環(huán)處理如下幾種來(lái)自Leader的消息: 1)PING消息:心跳消息 2)PROPOSAL消息:Leader發(fā)起的提案,要求Follower投票 3)COMMIT消息:服務(wù)器端最新一次提案的信息 4)UPTODATE消息:表明同步完成 5)REVALIDATE消息:根據(jù)Leader的REVALIDATE結(jié)果,關(guān)閉待revalidate的session還是允許其接受消息 6)SYNC消息:返回SYNC結(jié)果到客戶端,這個(gè)消息最初由客戶端發(fā)起,用來(lái)強(qiáng)制得到最新的更新。
observer:和follower類似,但是不參與投票和選舉 learner:follower和observer的統(tǒng)稱
短暫節(jié)點(diǎn)--ephemeral: 客戶端和服務(wù)器端斷開連接后,創(chuàng)建的節(jié)點(diǎn)自己刪除。并且在還未斷開的過(guò)程中,這個(gè)臨時(shí)的節(jié)點(diǎn)對(duì)其他客戶端來(lái)說(shuō)都是可見(jiàn)的。其中也可以分為普通的短暫節(jié)點(diǎn)和帶序號(hào)的短暫節(jié)點(diǎn)。帶序號(hào)的短暫節(jié)點(diǎn)稱為ephemeral_sequential,就是會(huì)在節(jié)點(diǎn)的名稱最后加上一串序號(hào),標(biāo)明順序
持久節(jié)點(diǎn)--persistent: 創(chuàng)建的節(jié)點(diǎn)會(huì)永久存在,即使客戶端和服務(wù)器端斷開連接。也分為普通和帶序號(hào),區(qū)別和上面類似
首先先說(shuō)幾個(gè)相關(guān)概念: zxid: 每次修改zk中的數(shù)據(jù)以及zk的狀態(tài)的變化(比如發(fā)生過(guò)選舉等),就會(huì)有一個(gè)zxid數(shù)字串,每次隨著事務(wù)的增加,會(huì)逐漸遞增。所以zxid小的事務(wù)肯定最先發(fā)生的。
myid(sid): 每個(gè)zk節(jié)點(diǎn)服務(wù)器編號(hào),在配置文件中指定的,必須保證全局唯一。
zk的幾個(gè)狀態(tài): looking--表示正在搜尋leader leading--當(dāng)前正在選舉leader following--leader選舉出來(lái)之后,正在新的leader和follower之間同步數(shù)據(jù) observing:observer正在接受選舉結(jié)果
下面正式講選舉過(guò)程: leader的選舉基于paxos算法實(shí)現(xiàn),這里不細(xì)究算法原理,就簡(jiǎn)單講講選舉的過(guò)程。 (1)第一輪投票:所有活的zk節(jié)點(diǎn)都會(huì)將票投給自己,并將選票結(jié)果廣播給其他節(jié)點(diǎn)。因?yàn)檫@個(gè)時(shí)候也不知道其他節(jié)點(diǎn)的情況,選票上有兩個(gè)關(guān)鍵信息:當(dāng)前節(jié)點(diǎn)最新的zxid以及sid。zxid越大,表示該節(jié)點(diǎn)所擁有的數(shù)據(jù)越新,所以zxid大的節(jié)點(diǎn)是會(huì)被首先選舉成leader的;如果zxid相同,則比較sid,sid大的選舉為leader。且因?yàn)閟id是全局唯一的,所以根據(jù)這個(gè)原則,一定可以選出唯一的leader。 (2)收到其他節(jié)點(diǎn)的投票后,獲取選票中的zxid以及sid,根據(jù)(1)的比較原則,選擇最新的,然后更新選票,再把新的選票發(fā)送出去,并將選票標(biāo)記為“第二輪選票”。我們要注意,因?yàn)槊總€(gè)節(jié)點(diǎn)收到其他節(jié)點(diǎn)的選票的時(shí)間點(diǎn)一般是不一致的,不同的節(jié)點(diǎn)會(huì)有延遲,所以會(huì)導(dǎo)致有不同選舉輪次的選票出現(xiàn)。所以當(dāng)節(jié)點(diǎn)發(fā)現(xiàn)自己的收到的選票比自己當(dāng)前的投出的選票輪次大時(shí),那么就直接更新當(dāng)前選票,然后投出去。并且每個(gè)節(jié)點(diǎn)都會(huì)進(jìn)行選票的歸檔統(tǒng)計(jì)(同一輪次的選票),如果發(fā)現(xiàn)沒(méi)有節(jié)點(diǎn)選票過(guò)半數(shù),節(jié)點(diǎn)就繼續(xù)將最新的(zxix,sid)選票投出。 (3)在經(jīng)歷了多次(2)流程后,如果節(jié)點(diǎn)歸檔選票后,發(fā)現(xiàn)有節(jié)點(diǎn)選票過(guò)半,就會(huì)停止投票。而如果節(jié)點(diǎn)發(fā)現(xiàn)歸檔統(tǒng)計(jì)的結(jié)果,發(fā)現(xiàn)leader就是自己的話,就會(huì)廣播告訴其他節(jié)點(diǎn),我是leader。 (4)其他節(jié)點(diǎn)收到新的leader消息后,就會(huì)開始leader和follower的數(shù)據(jù)同步。
當(dāng)我們使用stat path或者get path的方式查看節(jié)點(diǎn)元信息時(shí),會(huì)有很多信息項(xiàng)目,那么每一項(xiàng)表示什么呢?
1)czxid- 引起這個(gè)znode創(chuàng)建的zxid,創(chuàng)建節(jié)點(diǎn)的事務(wù)的zxid 每次修改ZooKeeper狀態(tài)都會(huì)收到一個(gè)zxid形式的時(shí)間戳,也就是ZooKeeper事務(wù)ID。 事務(wù)ID是ZooKeeper中所有修改總的次序。每個(gè)修改都有唯一的zxid,如果zxid1小于zxid2,那么zxid1在zxid2之前發(fā)生。 2)ctime - znode被創(chuàng)建的毫秒數(shù)(從1970年開始) 3)mzxid - znode最后更新的zxid 4)mtime - znode最后修改的毫秒數(shù)(從1970年開始) 5)pZxid-znode最后更新的子節(jié)點(diǎn)zxid 6)cversion - znode子節(jié)點(diǎn)變化號(hào),znode子節(jié)點(diǎn)修改次數(shù) 7)dataversion - znode數(shù)據(jù)變化號(hào) 8)aclVersion - znode訪問(wèn)控制列表的變化號(hào) 9)ephemeralOwner- 如果是臨時(shí)節(jié)點(diǎn),這個(gè)是znode擁有者的session id。如果不是臨時(shí)節(jié)點(diǎn)則是0。 10)dataLength- znode的數(shù)據(jù)長(zhǎng)度 11)numChildren - znode子節(jié)點(diǎn)數(shù)量
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖 2.1 zk寫數(shù)據(jù)流程
讀是局部姓的,即client只需要從與它相連的follower上讀取數(shù)據(jù)即可; 寫請(qǐng)求時(shí),follower會(huì)將請(qǐng)求轉(zhuǎn)發(fā)給leader,leader通過(guò)transaction(事務(wù))的形式廣播執(zhí)行,這個(gè)過(guò)程是怎樣的呢? (1)leader 會(huì)給所有follower發(fā)送一個(gè)PROPOSAL提案消息 (2)一個(gè)follower接收到這次PROPOSAL消息,寫到磁盤,發(fā)送給leader一個(gè)ACK消息,告知已經(jīng)收到。 (3)當(dāng)Leader收到法定人數(shù)(quorum)的follower的ACK時(shí)候,發(fā)送commit消息執(zhí)行。 注意:只有發(fā)送commit之后,做的修改才會(huì)提交,不然是會(huì)回退的;如果發(fā)現(xiàn)寫入超時(shí),是會(huì)回退這個(gè)更新操作的。
1) 首先要有一個(gè)main()線程 2) 在main線程中創(chuàng)建ZK客戶端,這時(shí)會(huì)創(chuàng)建兩個(gè)線程,一個(gè)負(fù)責(zé)網(wǎng)絡(luò)連接通信(connect),一個(gè)負(fù)責(zé)監(jiān)聽(tīng)(listener) 3) 通過(guò)connect線程將注冊(cè)的監(jiān)聽(tīng)事件發(fā)送給ZK 4) 在ZK的注冊(cè)監(jiān)聽(tīng)器列表中將注冊(cè)的監(jiān)聽(tīng)事件添加到列表中 5) ZK監(jiān)聽(tīng)到有數(shù)據(jù)或路徑發(fā)生變化時(shí),就會(huì)將這個(gè)消息通過(guò)connect線程發(fā)送給listener線程 6) Listener線程內(nèi)部調(diào)用process()方法
命令行下:客戶端使用類似 ls path watch 的方式來(lái)監(jiān)聽(tīng)一個(gè)節(jié)點(diǎn)的子節(jié)點(diǎn)的變化 當(dāng)節(jié)點(diǎn)的子節(jié)點(diǎn)發(fā)生變化時(shí),會(huì)通知相應(yīng)的客戶端,會(huì)顯示如下的信息:
WATCHER::? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖 3.1 zk統(tǒng)一命名服務(wù)
所謂命名服務(wù)就是對(duì)資源進(jìn)行命名,用于更好地對(duì)資源進(jìn)行定位。而zk本身的文件系統(tǒng)結(jié)構(gòu)就可以創(chuàng)建以路徑為名稱的節(jié)點(diǎn),用于存儲(chǔ)服務(wù)器地址等信息。并且每個(gè)節(jié)點(diǎn)的名稱都不會(huì)重復(fù),嚴(yán)格按照文件系統(tǒng)的限制實(shí)現(xiàn)的。阿里巴巴開發(fā)的分布式服務(wù)框架DUBBO就是用zookeeper來(lái)作為其命名服務(wù),維護(hù)全局的服務(wù)器列表,實(shí)現(xiàn)方式就是服務(wù)器啟動(dòng)時(shí),在ZK的某個(gè)路徑下創(chuàng)建一個(gè)代表自己的節(jié)點(diǎn),節(jié)點(diǎn)的value存儲(chǔ)的就是對(duì)應(yīng)服務(wù)的服務(wù)地址(比如說(shuō)URL地址)。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖 3.2 zk統(tǒng)一配置管理
在集群中環(huán)境的服務(wù)中,同一個(gè)程序會(huì)分布在多臺(tái)機(jī)器上運(yùn)行,便于橫向擴(kuò)展。個(gè)程序一般都會(huì)需要一些配置信息,如果程序分散部署在多臺(tái)機(jī)器上,要逐個(gè)改變配置就變得很困難。同時(shí),目前各種分布式系統(tǒng)以及微服務(wù)的流行,如何有效管理不同組件的配置也是一項(xiàng)重要的問(wèn)題?,F(xiàn)在可以在zk上創(chuàng)建一個(gè)節(jié)點(diǎn),將配置信息作為節(jié)點(diǎn)的值。然后相關(guān)的應(yīng)用程序都監(jiān)聽(tīng)這個(gè)節(jié)點(diǎn)。當(dāng)節(jié)點(diǎn)中的數(shù)據(jù)發(fā)生變化時(shí),zk就會(huì)通知這些監(jiān)聽(tīng)的程序說(shuō):“有東西改變了”。這些監(jiān)聽(tīng)者就會(huì)自動(dòng)到zk上獲取更改后的配置信息,接著后面如何處理就看具體的業(yè)務(wù)邏輯了。 其實(shí)這是用到了zk的watcher機(jī)制,也就是發(fā)布/訂閱機(jī)制,客戶端可以向zookeeper服務(wù)器注冊(cè)watcher,訂閱自己感興趣的節(jié)點(diǎn),當(dāng)相應(yīng)的節(jié)點(diǎn)發(fā)生變化時(shí),zookeeper服務(wù)器就會(huì)向客戶端發(fā)布通知。 類似的場(chǎng)景還會(huì)用在服務(wù)高可用中,比如有兩臺(tái)數(shù)據(jù)庫(kù)服務(wù)器,一主一備。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖3.3 zk統(tǒng)一配置管理--數(shù)據(jù)庫(kù)主備
其中主備的數(shù)據(jù)中都運(yùn)行一個(gè)zk的監(jiān)控進(jìn)程client,用于監(jiān)控?cái)?shù)據(jù)庫(kù)服務(wù)的可用姓。當(dāng)服務(wù)可用時(shí),主備數(shù)據(jù)庫(kù)的client會(huì)和zk建立持久會(huì)話,向zk發(fā)送心跳信息,表示自己正常運(yùn)行。zk收到心跳信息,就會(huì)在節(jié)點(diǎn)上創(chuàng)建相應(yīng)的節(jié)點(diǎn),節(jié)點(diǎn)數(shù)據(jù)為當(dāng)前可用的主數(shù)據(jù)的地址(實(shí)際上沒(méi)有這么簡(jiǎn)單,這里只是簡(jiǎn)化了,便于理解)。如果任意一個(gè)數(shù)據(jù)庫(kù)服務(wù)下線了,那么對(duì)應(yīng)的在zk上的節(jié)點(diǎn)也會(huì)被刪除。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖 3.4 zk服務(wù)動(dòng)態(tài)上下線感知
對(duì)于一些復(fù)雜的分布式系統(tǒng)來(lái)說(shuō),系統(tǒng)中不同的組件非常多,即不同的服務(wù)很多。同一服務(wù)中還存在多臺(tái)并發(fā)處理的服務(wù)器。那么如何知道這些服務(wù)哪些是可用的,哪些是不可用的呢?這就得用到zk了。 當(dāng)服務(wù)上線時(shí),會(huì)創(chuàng)建zkclient,并和zk保持持久會(huì)話,然后在zk的特定特定目錄下創(chuàng)建一個(gè)臨時(shí)znode(會(huì)話一斷開,znode就消失)。而需要訪問(wèn)這些服務(wù)的客戶端,就會(huì)監(jiān)聽(tīng)在這個(gè)目錄下(watcher機(jī)制),通過(guò) getChildren() 這個(gè)api監(jiān)聽(tīng)。當(dāng)目錄下的節(jié)點(diǎn)發(fā)生變化時(shí),就意味著那些服務(wù)有下線或者上線了。這時(shí)候zk就會(huì)通知監(jiān)聽(tīng)(訂閱)該節(jié)點(diǎn)的客戶端來(lái)獲取最新的可用的服務(wù)列表。這樣就可以動(dòng)態(tài)上下線可用的服務(wù)。
zk可以用于保存其他業(yè)務(wù)集群中每個(gè)節(jié)點(diǎn)的狀態(tài)信息,特別是一些主從結(jié)構(gòu)的集群中。當(dāng)發(fā)生故障轉(zhuǎn)移時(shí),可以從zk獲取當(dāng)前每個(gè)節(jié)點(diǎn)的狀態(tài)信息。典型的比如 HBase的master節(jié)點(diǎn)的選舉,就是通過(guò)zk協(xié)調(diào)狀態(tài)實(shí)現(xiàn)的。 集群每個(gè)節(jié)點(diǎn)會(huì)在對(duì)應(yīng)的一個(gè)znode下創(chuàng)建自己對(duì)應(yīng)的子znode,用于保存自己的狀態(tài)。然后每個(gè)節(jié)點(diǎn)都監(jiān)聽(tīng)在這個(gè)znode下,也就是監(jiān)聽(tīng)每個(gè)節(jié)點(diǎn)狀態(tài)的變化。正常情況下,如果一個(gè)集群不發(fā)生故障,zk中保存的所有節(jié)點(diǎn)信息是不會(huì)變化的。如果zk中發(fā)生變化,意味著集群有故障發(fā)生。后續(xù)集群可借助zk中的節(jié)點(diǎn)狀態(tài)數(shù)據(jù)來(lái)進(jìn)行下一步的故障處理,比如選舉新的master等操作。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖3.5 zk軟負(fù)載均衡
每個(gè)到服務(wù)列表下注冊(cè)的服務(wù)節(jié)點(diǎn),相應(yīng)的znode下的數(shù)據(jù)會(huì)保存服務(wù)地址,以及當(dāng)前處理的訪問(wèn)數(shù)。當(dāng)客戶端來(lái)獲取服務(wù)列表時(shí),可以根據(jù)訪問(wèn)數(shù)選擇比較少的一個(gè)服務(wù)節(jié)點(diǎn)進(jìn)行請(qǐng)求的分發(fā)。達(dá)到一定的負(fù)載均衡的作用。
在一些資源的使用上,為了防止不同的請(qǐng)求的讀寫相互產(chǎn)生干擾,有了鎖的概念。比如并發(fā)情況下,購(gòu)買一件限量的商品。為了保證商品的數(shù)量是安全的,就需要用到鎖機(jī)制。 鎖分為共享鎖(也叫讀鎖)和排他鎖(也叫寫鎖)。獲取共享鎖時(shí),所有事務(wù)都可以對(duì)數(shù)據(jù)進(jìn)行讀取,但是都不能修改數(shù)據(jù)。獲取排他鎖時(shí),只有當(dāng)前事務(wù)可以讀取和修改數(shù)據(jù),其他事務(wù)不可以。 在分布式系統(tǒng)中,對(duì)某些資源的限制就必須采用分布式鎖,這種鎖比起傳統(tǒng)的非分布式鎖復(fù)雜??梢允褂脄k來(lái)實(shí)現(xiàn),實(shí)現(xiàn)方式也很多,下面講一種。
首先,需要獲取鎖的人要在zk的特定目錄下創(chuàng)建一個(gè)臨時(shí)節(jié)點(diǎn),并標(biāo)明是讀鎖還是寫鎖。那么,這個(gè)目錄下所有的節(jié)點(diǎn)都是想要獲取鎖的人。接下來(lái)就監(jiān)聽(tīng)在這個(gè)目錄下,有通知了,就表示有新的人要獲取鎖了。因?yàn)橛泻芏嗳讼氆@取鎖,那么就要有個(gè)先后順序,順序由節(jié)點(diǎn)的順序決定。 接著,就是節(jié)點(diǎn)的順序問(wèn)題了,如果都是讀鎖,那么順序不影響;如果都是寫鎖,就得嚴(yán)格按照節(jié)點(diǎn)的順序來(lái)決定獲取寫鎖的順序;如果兩種鎖混雜,節(jié)點(diǎn)的順序是會(huì)影響到獲取鎖的順序的。對(duì)于這樣的場(chǎng)景,實(shí)現(xiàn)邏輯是這樣的: (1)如果當(dāng)前需要獲取讀鎖,則判斷該節(jié)點(diǎn)前面是否有比自己序號(hào)小的寫節(jié)點(diǎn),如果有,那么肯定得先等那個(gè)寫節(jié)點(diǎn)獲取寫鎖釋放之后才輪到自己;如果沒(méi)有,那么表示在自己前面的都是讀鎖,大家可以不用等待,可以一起獲取讀鎖了。 (2)如果當(dāng)前需要獲取寫鎖,就需要看自己是不是序號(hào)最小的節(jié)點(diǎn)了,如果不是,那么意味著前面的寫節(jié)點(diǎn)和讀節(jié)點(diǎn),無(wú)論是哪個(gè),都不能讓自己獲取到寫鎖的。 最后,因?yàn)閯?chuàng)建的節(jié)點(diǎn)都是臨時(shí)節(jié)點(diǎn),所以只要斷開會(huì)話,就會(huì)自動(dòng)刪除,也就實(shí)現(xiàn)了鎖的釋放。
分布式系統(tǒng)中,非常重要的一個(gè)組件就是消息隊(duì)列,可以實(shí)現(xiàn)應(yīng)用解耦,異步消息,流量消減。首先傳統(tǒng)的用戶請(qǐng)求都是請(qǐng)求者直接發(fā)給服務(wù)器,服務(wù)器處理完成之后在將結(jié)果返回給請(qǐng)求者,這樣會(huì)導(dǎo)致一個(gè)問(wèn)題就是請(qǐng)求者在發(fā)出請(qǐng)求后會(huì)阻塞住,在收到服務(wù)器回復(fù)之前什么都干不了,而如果引入了消息隊(duì)列,那么這個(gè)處理的流程就會(huì)變成請(qǐng)求者先把請(qǐng)求發(fā)給消息隊(duì)列,然后服務(wù)器在從消息隊(duì)列獲得需要處理的消息,處理完成之后在將結(jié)果返回給請(qǐng)求者,這種方式下,請(qǐng)求者只要把請(qǐng)求發(fā)給消息隊(duì)列就可以干其他事情了,這樣就實(shí)現(xiàn)了請(qǐng)求的異步處理,也解除了請(qǐng)求者和服務(wù)器之間的耦合。 而在典型的大流量場(chǎng)景中,大量請(qǐng)求涌入到服務(wù)器時(shí),會(huì)造成服務(wù)的癱瘓,所以需要有有個(gè)限流措施,但是又不至于丟失請(qǐng)求。所以需要一個(gè)組件將請(qǐng)求暫存,然后以一定的速度轉(zhuǎn)發(fā)給服務(wù)器進(jìn)行處理,這個(gè)組件就是消息隊(duì)列。這種做法稱為流量消減。 還有典型的搶購(gòu)場(chǎng)景中,大量搶購(gòu)請(qǐng)求會(huì)涌入到服務(wù)器中,為了防止服務(wù)器崩潰。可以使用消息隊(duì)列,并將隊(duì)列的大小設(shè)置為搶購(gòu)數(shù)量的大小,超過(guò)則返回失敗,也就搶不到東西了。成功的就會(huì)暫存在隊(duì)列中,給服務(wù)器慢慢處理。 zk實(shí)現(xiàn)隊(duì)列很簡(jiǎn)單,就是在特定目錄下創(chuàng)建節(jié)點(diǎn),存儲(chǔ)請(qǐng)求。然后服務(wù)器依次從該目錄下讀取節(jié)點(diǎn)中的請(qǐng)求,處理并返回結(jié)果。處理完成后刪除節(jié)點(diǎn)。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
網(wǎng)頁(yè)標(biāo)題:二、zookeeper--基本原理-創(chuàng)新互聯(lián)
網(wǎng)頁(yè)網(wǎng)址:http://jinyejixie.com/article48/dhcoep.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁(yè)設(shè)計(jì)公司、定制網(wǎng)站、標(biāo)簽優(yōu)化、搜索引擎優(yōu)化、域名注冊(cè)、網(wǎng)站導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容