自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

詳解Zookeeper的工作機(jī)制、數(shù)據(jù)結(jié)構(gòu)、選舉+監(jiān)聽(tīng)機(jī)制、API應(yīng)用

開(kāi)源
分布式和集中式系統(tǒng)相比,有很多優(yōu)勢(shì),比如更強(qiáng)的計(jì)算能力,存儲(chǔ)能力,避免單點(diǎn)故障等問(wèn)題。但是由于在分布式部署的方式遇到網(wǎng)絡(luò)故障等問(wèn)題的時(shí)候怎么保證各個(gè)節(jié)點(diǎn)數(shù)據(jù)的一致性和可用性是比較關(guān)鍵的問(wèn)題。

 一、Zookeeper工作機(jī)制

分布式和集中式系統(tǒng)相比,有很多優(yōu)勢(shì),比如更強(qiáng)的計(jì)算能力,存儲(chǔ)能力,避免單點(diǎn)故障等問(wèn)題。但是由于在分布式部署的方式遇到網(wǎng)絡(luò)故障等問(wèn)題的時(shí)候怎么保證各個(gè)節(jié)點(diǎn)數(shù)據(jù)的一致性和可用性是比較關(guān)鍵的問(wèn)題。

[[313075]]

那么,對(duì)于分布式集群來(lái)說(shuō),我們需要一個(gè)能夠在各個(gè)服務(wù)和節(jié)點(diǎn)之間進(jìn)行協(xié)調(diào)和服務(wù)的中間人——Zookeeper。

Zookeeper從設(shè)計(jì)模式角度來(lái)理解:是一個(gè)基于觀察者模式設(shè)計(jì)的分布式服務(wù)管理框架,負(fù)責(zé)存儲(chǔ)和管理大家都關(guān)心的數(shù)據(jù),然后接受觀察者的注冊(cè),一旦這些數(shù)據(jù)的狀態(tài)發(fā)生變化,Zookeeper就將負(fù)責(zé)通知已經(jīng)在Zookeeper上注冊(cè)的那些觀察者做出相應(yīng)的回應(yīng)。

二、數(shù)據(jù)結(jié)構(gòu)

Zookeeper的數(shù)據(jù)結(jié)構(gòu)和linux的目錄結(jié)構(gòu)類似,也像數(shù)據(jù)結(jié)構(gòu)中的樹(shù),如下圖:

 

詳解Zookeeper的工作機(jī)制、數(shù)據(jù)結(jié)構(gòu)、選舉+監(jiān)聽(tīng)機(jī)制、API應(yīng)用

 

Zookeeper的數(shù)據(jù)存儲(chǔ)基于節(jié)點(diǎn),這種節(jié)點(diǎn)稱為Znode。Znode的引用方式是路徑的引用,每個(gè)Znode都可以通過(guò)其路徑唯一標(biāo)識(shí)。

其中Znode中包含有:數(shù)據(jù),子節(jié)點(diǎn)引用,訪問(wèn)權(quán)限等,如下圖:

 

詳解Zookeeper的工作機(jī)制、數(shù)據(jù)結(jié)構(gòu)、選舉+監(jiān)聽(tīng)機(jī)制、API應(yīng)用

 

  • data:Znode存儲(chǔ)的數(shù)據(jù)信息
  • ACL:記錄Znode的訪問(wèn)權(quán)限,即哪些人或哪些IP可以訪問(wèn)本節(jié)點(diǎn)
  • child:當(dāng)前節(jié)點(diǎn)的子節(jié)點(diǎn)引用,類似于二叉樹(shù)的左孩子右孩子
  • stat:包含Znode的各種元數(shù)據(jù),比如事務(wù)ID、版本號(hào)、時(shí)間戳、大小等等

stat 查看根目錄的詳細(xì)信息:

  1. [zk: localhost:2181(CONNECTED) 0] stat / 
  2.  
  3. cZxid = 0x0 
  4.  
  5. ctime = Thu Jan 01 08:00:00 CST 1970 
  6.  
  7. mZxid = 0x0 
  8.  
  9. mtime = Thu Jan 01 08:00:00 CST 1970 
  10.  
  11. pZxid = 0x0 
  12.  
  13. cversion = -1 
  14.  
  15. dataVersion = 0 
  16.  
  17. aclVersion = 0 
  18.  
  19. ephemeralOwner = 0x0 
  20.  
  21. dataLength = 0 
  22.  
  23. numChildren = 1 

三、選舉機(jī)制

 

詳解Zookeeper的工作機(jī)制、數(shù)據(jù)結(jié)構(gòu)、選舉+監(jiān)聽(tīng)機(jī)制、API應(yīng)用

 

Zookeeper集群是一主多從的模式,主為leader,從為follower,其中l(wèi)eader是通過(guò)選舉得到。

Zookeeper集群有如下特點(diǎn):

- Zookeeper:一個(gè)領(lǐng)導(dǎo)者(leader),多個(gè)跟隨者(follower)組成的集群

- Leader負(fù)責(zé)進(jìn)行投票的發(fā)起和決議,更新系統(tǒng)狀態(tài)

- Follower用于接收客戶請(qǐng)求并向客戶端返回結(jié)果,在選舉Leader過(guò)程中參與投票

- 集群中只要有半數(shù)以上節(jié)點(diǎn)存活,Zookeeper集群就能正常服務(wù),所以Zookeeper適合安裝奇數(shù)臺(tái)服務(wù)器

- 全局?jǐn)?shù)據(jù)一致:每個(gè)server保存一份相同的數(shù)據(jù)副本,client無(wú)論連接到哪個(gè)server,數(shù)據(jù)都是一致的

- 更新請(qǐng)求順序進(jìn)行,來(lái)自同一個(gè)client的更新請(qǐng)求按其發(fā)送順序依次執(zhí)行

- 數(shù)據(jù)更新原子性,一次數(shù)據(jù)更新要么成功,要么失敗

- 實(shí)時(shí)性,在一定時(shí)間范圍內(nèi),client能讀到最新數(shù)據(jù)

Leader選舉是保證分布式數(shù)據(jù)一致性的關(guān)鍵所在,當(dāng)Zookeeper進(jìn)入以下兩種狀態(tài)時(shí),需要進(jìn)入leader選舉:

  • 服務(wù)器初始化啟動(dòng)
  • leader宕機(jī)掛掉

1. 服務(wù)器初始化啟動(dòng)時(shí)的選舉

(1)以三臺(tái)服務(wù)器組成的集群為例,在集群的初始化階段,當(dāng)server1啟動(dòng)時(shí),其單獨(dú)無(wú)法完成選舉;當(dāng)server2啟動(dòng)時(shí),此時(shí)兩臺(tái)機(jī)器可以互相通信,每臺(tái)機(jī)器都試圖找到leader,于是進(jìn)入選舉狀態(tài)

(2)每個(gè)server首先給自己投票:初始階段,每個(gè)服務(wù)器都將自己作為leader來(lái)投票,每次投票包含的信息有(myid,ZXID,epoch),此時(shí)Server1的投票為(1, 0),Server2的投票為(2, 0),然后各自將這個(gè)投票發(fā)給集群中其他機(jī)器

其中epoch用來(lái)判斷多個(gè)投票是否在同一輪選舉周期中,該值在服務(wù)端是一個(gè)自增序列,每次進(jìn)入新一輪的投票后,都會(huì)對(duì)該值進(jìn)行加1操作

(3)每個(gè)server接受來(lái)自各個(gè)服務(wù)器的投票:集群的每個(gè)服務(wù)器收到投票后,首先判斷該投票的有效性,如檢查是否是本輪投票、是否來(lái)自LOOKING狀態(tài)的服務(wù)器

(4)處理投票。針對(duì)每一個(gè)投票,服務(wù)器都需要將別人的投票和自己的投票進(jìn)行PK,PK規(guī)則如下:

優(yōu)先檢查ZXID。ZXID比較大的服務(wù)器優(yōu)先作為L(zhǎng)eader

如果ZXID相同,那么就比較myid。myid較大的服務(wù)器作為L(zhǎng)eader服務(wù)器

對(duì)于Server1而言,它的投票是(1, 0),接收Server2的投票為(2, 0),首先會(huì)比較兩者的ZXID,均為0,再比較myid,此時(shí)Server2的myid最大,于是更新自己的投票為(2, 0),然后重新投票,對(duì)于Server2而言,其無(wú)須更新自己的投票,只是再次向集群中所有機(jī)器發(fā)出上一次投票信息即可

(5)統(tǒng)計(jì)投票。每次投票后,服務(wù)器都會(huì)統(tǒng)計(jì)投票信息,判斷是否已經(jīng)有過(guò)半機(jī)器接受到相同的投票信息,對(duì)于Server1、Server2而言,都統(tǒng)計(jì)出集群中已經(jīng)有兩臺(tái)機(jī)器接受了(2, 0)的投票信息,此時(shí)便認(rèn)為已經(jīng)選出了Leader,一旦選出leader,后邊的機(jī)器不管myid和ZXID多大,都自動(dòng)成為leader的小弟

(6)改變服務(wù)器狀態(tài)。一旦確定了Leader,每個(gè)服務(wù)器就會(huì)更新自己的狀態(tài),如果是Follower,那么就變更為FOLLOWING,如果是Leader,就變更為L(zhǎng)EADING

2. leader服務(wù)器掛掉的投票機(jī)制

與啟動(dòng)時(shí)不同的就是,每個(gè)服務(wù)器上都有歷史數(shù)據(jù),在選舉之前,首先非leader的服務(wù)器改變狀態(tài)為L(zhǎng)OOKING狀態(tài),因?yàn)檫\(yùn)行期間每個(gè)服務(wù)器ZXID不同,會(huì)和啟動(dòng)時(shí)的選舉一樣進(jìn)行重新投票選舉。

四、監(jiān)聽(tīng)機(jī)制

首先要有一個(gè)main()線程

在main線程中創(chuàng)建Zookeeper客戶端,這時(shí)就會(huì)創(chuàng)建兩個(gè)線程,一個(gè)負(fù)責(zé)網(wǎng)絡(luò)連接通信(connet),一個(gè)負(fù)責(zé)監(jiān)聽(tīng)(listener)

通過(guò)connect線程將注冊(cè)的監(jiān)聽(tīng)事件發(fā)送給Zookeeper

在Zookeeper的注冊(cè)監(jiān)聽(tīng)器列表中將注冊(cè)的監(jiān)聽(tīng)事件添加到列表中

Zookeeper監(jiān)聽(tīng)到有數(shù)據(jù)或路徑變化,就會(huì)將這個(gè)消息發(fā)送給listener線程

listener線程內(nèi)部調(diào)用了process()方法

五、API應(yīng)用

Zookeeper常用的API如下:

create創(chuàng)建節(jié)點(diǎn)delete刪除節(jié)點(diǎn)exists判斷節(jié)點(diǎn)是否存在getData獲得一個(gè)節(jié)點(diǎn)的數(shù)據(jù)setData設(shè)置一個(gè)節(jié)點(diǎn)的數(shù)據(jù)getChildren獲取節(jié)點(diǎn)下的所有子節(jié)點(diǎn)

這其中,exists,getData,getChildren屬于讀操作。Zookeeper客戶端在請(qǐng)求讀操作的時(shí)候,可以選擇是否設(shè)置Watch。

Watch是什么意思呢?

我們可以理解成是注冊(cè)在特定Znode上的觸發(fā)器。當(dāng)這個(gè)Znode發(fā)生改變,也就是調(diào)用了create,delete,setData方法的時(shí)候,將會(huì)觸發(fā)Znode上注冊(cè)的對(duì)應(yīng)事件,請(qǐng)求Watch的客戶端會(huì)接收到異步通知。

具體交互過(guò)程如下:

  • 客戶端調(diào)用getData方法,watch參數(shù)是true。服務(wù)端接到請(qǐng)求,返回節(jié)點(diǎn)數(shù)據(jù),并且在對(duì)應(yīng)的哈希表里插入被Watch的Znode路徑,以及Watcher列表。
  • 當(dāng)被Watch的Znode已刪除,服務(wù)端會(huì)查找哈希表,找到該Znode對(duì)應(yīng)的所有Watcher,異步通知客戶端,并且刪除哈希表中對(duì)應(yīng)的Key-Value

六、應(yīng)用場(chǎng)景

Zookeeper提供的服務(wù)包括:統(tǒng)一命名服務(wù)、統(tǒng)一配置管理、統(tǒng)一集群管理、服務(wù)器節(jié)點(diǎn)動(dòng)態(tài)上下線、軟負(fù)載均衡等。

責(zé)任編輯:武曉燕 來(lái)源: 今日頭條
相關(guān)推薦

2021-03-11 07:27:19

ZooKeeper選舉機(jī)制

2021-10-08 20:30:12

ZooKeeper選舉機(jī)制

2020-12-04 06:40:46

Zookeeper選舉機(jī)制

2025-01-07 08:00:00

有序集合數(shù)據(jù)結(jié)構(gòu)

2024-07-11 11:35:08

數(shù)組結(jié)構(gòu)內(nèi)部機(jī)制

2023-09-08 08:01:40

Gateway測(cè)試配置

2009-11-13 09:24:58

JPA 2.0Criteria AP

2018-04-27 09:03:57

Redis數(shù)據(jù)存儲(chǔ)

2019-02-26 10:33:24

快應(yīng)用

2010-07-29 10:33:59

Flex鍵盤(pán)事件

2011-08-04 18:14:42

Objective-C 消息

2009-09-23 16:30:01

Hibernate f

2011-05-26 15:23:34

JavaReflection

2020-04-24 15:44:50

MySQL數(shù)據(jù)庫(kù)鎖機(jī)制

2024-12-18 21:37:24

2020-06-29 07:44:36

Redis

2009-07-08 15:01:00

Servlet Ses

2024-07-16 08:38:06

2021-09-06 18:55:57

MySQLCheckpoint機(jī)制

2019-10-29 08:59:16

Redis底層數(shù)據(jù)
點(diǎn)贊
收藏

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