偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

ZooKeeper實(shí)現(xiàn)分布式的思路

云計(jì)算 分布式
Hadoop生態(tài)系統(tǒng)為開源屆提供很多優(yōu)秀軟件,zookeeper便是其中一員。

Hadoop生態(tài)系統(tǒng)為開源屆提供很多優(yōu)秀軟件,zookeeper便是其中一員。

前段時(shí)間項(xiàng)目中用到了zookeeper,主要是用作服務(wù)的注冊(cè)和發(fā)現(xiàn)使用方式類似阿里的dubbo。實(shí)際上zookeeper的功能不僅僅只有這些內(nèi)容,它提供了一系列非常方便使用的功能,后面會(huì)提到。這篇文章僅僅是我個(gè)人的一點(diǎn)兒理解,如有錯(cuò)誤煩請(qǐng)指正,以免給別人誤導(dǎo)。

1、zookeeper是什么

zookeeper的名字很有趣被稱為動(dòng)物管理員,這是因?yàn)镠adoop生態(tài)系統(tǒng)中很多軟件的名字都是動(dòng)物,hadoop本身就是小象的意思,還有hive小蜜蜂,pig。zookeeper作為一個(gè)分布式協(xié)調(diào)系統(tǒng)在hadhoop中被廣泛的應(yīng)用,其中HBase默認(rèn)帶有zookeeper。zookeeper主要功能有配置維護(hù)、分布式鎖、選舉、分布式隊(duì)列等,并且zookeeper本身可以是一個(gè)集群,提供了高可用性。這一切的功能都離不開zookeeper的數(shù)據(jù)模型。

2、zookeeper數(shù)據(jù)模型

zookeeper提供的命名服務(wù)看起來和一個(gè)unix的文件系統(tǒng)非常相似,下面是從官網(wǎng)復(fù)制的一張圖:

 

其中的每個(gè)節(jié)點(diǎn)稱為znode,每個(gè)znode節(jié)點(diǎn)既可以包含數(shù)據(jù)又可以包含子節(jié)點(diǎn),由于zookeeper被定位為協(xié)調(diào)程序因此znode中的數(shù)據(jù)通常存儲(chǔ)的是非常小的數(shù)據(jù),比如狀態(tài)信息,位置信息等等。znode中有一個(gè)很重要的概念——節(jié)點(diǎn)類型,znode有兩種類型的節(jié)點(diǎn):臨時(shí)節(jié)點(diǎn),永久節(jié)點(diǎn)。其中這兩種節(jié)點(diǎn)又分為有序和無序,重點(diǎn)講一下臨時(shí)節(jié)點(diǎn),因?yàn)閦k中很多基礎(chǔ)的功能都是基于臨時(shí)節(jié)點(diǎn)實(shí)現(xiàn)的,client在和zookeeper連接的時(shí)候兩者之間會(huì)建立起session,session的狀態(tài)由zookeeper服務(wù)端維護(hù),臨時(shí)節(jié)點(diǎn)的特點(diǎn)是隨著session的超時(shí)服務(wù)端會(huì)將client建立的所有臨時(shí)節(jié)點(diǎn)移除,而永久節(jié)點(diǎn)即使客戶端退出節(jié)點(diǎn)也不會(huì)消失,同時(shí)臨時(shí)節(jié)點(diǎn)不能有子節(jié)點(diǎn)但是可以掛載數(shù)據(jù)。結(jié)合watcher機(jī)制可以實(shí)現(xiàn)非常豐富和靈活的功能。

3、zookeeper集群結(jié)構(gòu)

zookeeper實(shí)現(xiàn)分布式的思路

zookeeper本身支持單機(jī)部署和集群部署,生產(chǎn)環(huán)境建議使用集群部署,因?yàn)榧翰渴鸩淮嬖趩吸c(diǎn)故障問題,并且zookeeper建議部署的節(jié)點(diǎn)個(gè)數(shù)為奇數(shù)個(gè),只有超過一半的機(jī)器不可用整個(gè)zk集群才不可用。zookeeper集群中主要有兩個(gè)角色leader和flower,每個(gè)客戶端可以連接集群中的任何一個(gè)zookeeper節(jié)點(diǎn),同時(shí)從其上面read信息,但是針對(duì)write操作,flower節(jié)點(diǎn)會(huì)轉(zhuǎn)發(fā)給leader,由leader負(fù)責(zé)原子廣播,從而保證集群中各個(gè)節(jié)點(diǎn)的數(shù)據(jù)一致性,zookeeper中規(guī)定只有當(dāng)多余一半的節(jié)點(diǎn)同步完成整個(gè)write操作才算完成。也就是說可能會(huì)有少于一半的數(shù)據(jù)不是新數(shù)據(jù),因此zookeeper中不是強(qiáng)一致性而是實(shí)現(xiàn)的最終一致性。但是客戶端可以使用sync來強(qiáng)制讀取最新的數(shù)據(jù)。

4、replaction

zookeeper中的高可用性是通過數(shù)據(jù)冗余和實(shí)現(xiàn)的,也就是一份數(shù)據(jù)存在多個(gè)節(jié)點(diǎn)中,zookeeper中要求同一份數(shù)據(jù)需要在超過一半的節(jié)點(diǎn)上存在,只有這樣才能實(shí)現(xiàn)對(duì)宕機(jī)數(shù)量的容忍度更高。zk建議配置奇數(shù)個(gè)節(jié)點(diǎn),是因?yàn)樵趂lower同步數(shù)據(jù)和進(jìn)行l(wèi)eader選舉的時(shí)候都要求有超過一半完成或同意才算ok。舉例來說,假如有3個(gè)節(jié)點(diǎn),至少需要有2個(gè)節(jié)點(diǎn)正常,就是容忍度為1(允許宕掉的節(jié)點(diǎn)數(shù)),有4個(gè)節(jié)點(diǎn),至少需要有三個(gè)節(jié)點(diǎn)正常,容忍度同樣為1,多出來一個(gè)機(jī)器但是容忍度相同在任何時(shí)候看來都得不償失。因此zk建議部署奇數(shù)個(gè)節(jié)點(diǎn),但這不是強(qiáng)制。另外再看一下為什么寫操作的時(shí)候要求至少有超過一半節(jié)點(diǎn)commit成功整體才成功,假如有2t+1個(gè)zk節(jié)點(diǎn),也就是必須有t+1個(gè)節(jié)點(diǎn)commit成功才算成功,因?yàn)橹挥羞@種情況下才能達(dá)成至少有一個(gè)節(jié)點(diǎn)存有前后兩次的更新操作(兩次t+1節(jié)點(diǎn)至少會(huì)重復(fù)一個(gè))。zookeeper使用zab算法實(shí)現(xiàn)數(shù)據(jù)的原子廣播,并且每次write會(huì)寫日志然后更新緩存,每個(gè)zk節(jié)點(diǎn)維護(hù)一個(gè)zxid,zxid是一個(gè)全局變量,隨著znode的每一次改變而遞增,當(dāng)leader掛掉的時(shí)候,剩余的flower選擇zxid最大的節(jié)點(diǎn)作為新的leader,在新leader提供服務(wù)前還需要一次數(shù)據(jù)恢復(fù),新leader只是擁有最多的數(shù)據(jù),但不一定擁有最新的數(shù)據(jù),因此leader和flower的數(shù)據(jù)需要同步到最新的狀態(tài),通過合并的過程完成整個(gè)數(shù)據(jù)的恢復(fù)。

 

zookeeper實(shí)現(xiàn)分布式的思路

上圖5個(gè)zk節(jié)點(diǎn)允許兩個(gè)宕機(jī),其他三個(gè)節(jié)點(diǎn)總是能恢復(fù)出來ABCDE。

#p#

5、Watch機(jī)制

zookeeper允許客戶端對(duì)znode節(jié)點(diǎn)或者節(jié)點(diǎn)中的數(shù)據(jù)設(shè)置監(jiān)聽器,當(dāng)znode改變的時(shí)候服務(wù)器觸發(fā)監(jiān)聽,客戶端完成一個(gè)回調(diào)做自己需要處理的邏輯。zookeeper中的watch是一次性的,也就是當(dāng)監(jiān)聽觸發(fā)后,需要再次應(yīng)用watcher,下次才能在收到變化的通知。exists,getData,getChildren接口都可以指定是否應(yīng)用watcher,可以使用默認(rèn)的watcher或者自定義watcher。觸發(fā)watcher的可以為create、delete、setData、setACL。

6、配置管理

如果是單機(jī)或者幾臺(tái)機(jī)器,當(dāng)應(yīng)用的配置項(xiàng)變更的時(shí)候,可能通過手動(dòng)的方式去修改一下,但是假如一個(gè)集群中有成百上千個(gè)應(yīng)用節(jié)點(diǎn),如何才能保證快速無差錯(cuò)的完成配置項(xiàng)的變更。zookeeper的出現(xiàn)可以輕松地解決這個(gè)問題

zookeeper實(shí)現(xiàn)分布式的思路

每個(gè)節(jié)點(diǎn)在zk上建立永久型znode并寫入配置項(xiàng),然后監(jiān)聽該節(jié)點(diǎn)下數(shù)據(jù)的變化,一旦其他客戶端修改了其中的數(shù)據(jù),所有的監(jiān)聽客戶端都會(huì)收到變更通知。

7、Leader選舉

zookeeper本身提供leader選舉機(jī)制,大概的思路是所有的節(jié)點(diǎn)創(chuàng)建臨時(shí)有序的znode然后監(jiān)聽所有節(jié)點(diǎn)的變化情況,獲取最小序號(hào)和自己創(chuàng)建的序列作比較,如果自己為最小則當(dāng)選為leader,當(dāng)主動(dòng)刪除自己創(chuàng)建的節(jié)點(diǎn)或者leader宕機(jī)后,臨時(shí)節(jié)點(diǎn)消失,該變化會(huì)被其他存活的節(jié)點(diǎn)獲取到從而觸發(fā)第二次的leader選舉,依次類推。實(shí)際上zookeeper提到的很多recipes curator都提供了很好的實(shí)現(xiàn)(除了兩階段提交),同時(shí)基于底層的zookeeper api開發(fā)應(yīng)用需要考慮的東西很多,curator對(duì)這些都提供了封裝,所以如果要編寫zookeeper應(yīng)用推薦使用curator。

leader應(yīng)用的場(chǎng)景很廣泛,curator提供了兩種不同的選舉實(shí)現(xiàn),一種是輪詢做leader,另外一種是永久獲取leader權(quán)直到退出,兩種選舉實(shí)現(xiàn)可以應(yīng)用在不同的集群應(yīng)用中。HBase中使用的是獲取leader的永久權(quán)
 

責(zé)任編輯:Ophira 來源: 個(gè)人博客
相關(guān)推薦

2021-02-28 07:49:28

Zookeeper分布式

2021-10-25 10:21:59

ZK分布式鎖ZooKeeper

2018-04-09 09:15:32

數(shù)據(jù)庫DB分布式鎖

2022-10-27 10:44:14

分布式Zookeeper

2017-10-24 11:28:23

Zookeeper分布式鎖架構(gòu)

2019-10-10 09:16:34

Zookeeper架構(gòu)分布式

2021-06-01 07:57:42

Zookeeper分布式系統(tǒng)

2019-11-19 08:47:45

Zookeeper分布式事務(wù)

2020-11-16 12:55:41

Redis分布式鎖Zookeeper

2021-07-16 07:57:34

ZooKeeperCurator源碼

2019-07-16 09:22:10

RedisZookeeper分布式鎖

2022-06-27 08:21:05

Seata分布式事務(wù)微服務(wù)

2024-11-28 15:11:28

2019-06-19 15:40:06

分布式鎖RedisJava

2021-10-21 06:52:17

ZooKeeper分布式配置

2022-07-25 06:44:19

ZooKeeper分布式鎖

2017-01-16 14:13:37

分布式數(shù)據(jù)庫

2022-04-08 08:27:08

分布式鎖系統(tǒng)

2017-04-13 10:51:09

Consul分布式

2018-04-03 16:24:34

分布式方式
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)