成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

說一下Zookeeper的ZAB協(xié)議?不好意思我肚子疼!

網(wǎng)絡(luò) 網(wǎng)絡(luò)管理
Zab(Zookeeper Atomic Broadcast)是為ZooKeeper協(xié)設(shè)計(jì)的崩潰恢復(fù)原子廣播協(xié)議,它保證zookeeper集群數(shù)據(jù)的一致性和命令的全局有序性。

 

本文轉(zhuǎn)載自微信公眾號「 三太子敖丙」,轉(zhuǎn)載本文請聯(lián)系 三太子敖丙公眾號。

前言

Zab(Zookeeper Atomic Broadcast)是為ZooKeeper協(xié)設(shè)計(jì)的崩潰恢復(fù)原子廣播協(xié)議,它保證zookeeper集群數(shù)據(jù)的一致性和命令的全局有序性。

[[326662]]

概念介紹

在介紹zab協(xié)議之前首先要知道zookeeper相關(guān)的幾個(gè)概念,才能更好的了解zab協(xié)議。

  • 集群角色
  1. Leader:同一時(shí)間集群總只允許有一個(gè)Leader,提供對客戶端的讀寫功能,負(fù)責(zé)將數(shù)據(jù)同步至各個(gè)節(jié)點(diǎn);
  2. Follower:提供對客戶端讀功能,寫請求則轉(zhuǎn)發(fā)給Leader處理,當(dāng)Leader崩潰失聯(lián)之后參與Leader選舉;
  3. Observer:與Follower不同的是但不參與Leader選舉。
  • 服務(wù)狀態(tài)
  1. LOOKING:當(dāng)節(jié)點(diǎn)認(rèn)為群集中沒有Leader,服務(wù)器會進(jìn)入LOOKING狀態(tài),目的是為了查找或者選舉Leader;
  2. FOLLOWING:follower角色;
  3. LEADING:leader角色;
  4. OBSERVING:observer角色;

可以知道Zookeeper是通過自身的狀態(tài)來區(qū)分自己所屬的角色,來執(zhí)行自己應(yīng)該的任務(wù)。

  • ZAB狀態(tài)Zookeeper還給ZAB定義的4中狀態(tài),反應(yīng)Zookeeper從選舉到對外提供服務(wù)的過程中的四個(gè)步驟。狀態(tài)枚舉定義:
  1. public enum ZabState { 
  2.         ELECTION, 
  3.         DISCOVERY, 
  4.         SYNCHRONIZATION, 
  5.         BROADCAST 
  6.     } 
  1. ELECTION: 集群進(jìn)入選舉狀態(tài),此過程會選出一個(gè)節(jié)點(diǎn)作為leader角色;
  2. DISCOVERY:連接上leader,響應(yīng)leader心跳,并且檢測leader的角色是否更改,通過此步驟之后選舉出的leader才能執(zhí)行真正職務(wù);
  3. SYNCHRONIZATION:整個(gè)集群都確認(rèn)leader之后,將會把leader的數(shù)據(jù)同步到各個(gè)節(jié)點(diǎn),保證整個(gè)集群的數(shù)據(jù)一致性;
  4. BROADCAST:過渡到廣播狀態(tài),集群開始對外提供服務(wù)。
  • ZXID

Zxid是極為重要的概念,它是一個(gè)long型(64位)整數(shù),分為兩部分:紀(jì)元(epoch)部分和計(jì)數(shù)器(counter)部分,是一個(gè)全局有序的數(shù)字。

epoch代表當(dāng)前集群所屬的哪個(gè)leader,leader的選舉就類似一個(gè)朝代的更替,你前朝的劍不能斬本朝的官,用epoch代表當(dāng)前命令的有效性,counter是一個(gè)遞增的數(shù)字。

選舉

基礎(chǔ)概念介紹完了,下面開始介紹zab協(xié)議是怎么支持leader選舉的。

進(jìn)行l(wèi)eader有三個(gè)問題,什么時(shí)候進(jìn)行?選舉規(guī)則?選擇流程?

下面我會一一解答這三個(gè)問題:

1.選舉發(fā)生的時(shí)機(jī)Leader發(fā)生選舉有兩個(gè)時(shí)機(jī),一個(gè)是服務(wù)啟動的時(shí)候當(dāng)整個(gè)集群都沒有l(wèi)eader節(jié)點(diǎn)會進(jìn)入選舉狀態(tài),如果leader已經(jīng)存在就會告訴該節(jié)點(diǎn)leader的信息,自己連接上leader,整個(gè)集群不用進(jìn)入選舉狀態(tài)。

還有一個(gè)就是在服務(wù)運(yùn)行中,可能會出現(xiàn)各種情況,服務(wù)宕機(jī)、斷電、網(wǎng)絡(luò)延遲很高的時(shí)候leader都不能再對外提供服務(wù)了,所有當(dāng)其他幾點(diǎn)通過心跳檢測到leader失聯(lián)之后,集群也會進(jìn)入選舉狀態(tài)。

2.選舉規(guī)則進(jìn)入投票選舉流程,怎么才能選舉出leader?或者說按照什么規(guī)則來讓其他節(jié)點(diǎn)都能選舉你當(dāng)leader。

3.zab協(xié)議是按照幾個(gè)比較規(guī)則來進(jìn)行投票的篩選,如果你的票比我更好,就修改自身的投票信息,改投你當(dāng)leader。

下面代碼是zookeeper投票比較規(guī)則:

  1. /* 
  2.          * We return true if one of the following three cases hold: 
  3.          * 1- New epoch is higher 
  4.          * 2- New epoch is the same as current epoch, but new zxid is higher 
  5.          * 3- New epoch is the same as current epoch, new zxid is the same 
  6.          *  as current zxid, but server id is higher. 
  7.          */ 
  8.  
  9.         return ((newEpoch > curEpoch) 
  10.                 || ((newEpoch == curEpoch) 
  11.                     && ((newZxid > curZxid) 
  12.                         || ((newZxid == curZxid) 
  13.                             && (newId > curId))))); 

當(dāng)其他節(jié)點(diǎn)的紀(jì)元比自身高投它,如果紀(jì)元相同比較自身的zxid的大小,選舉zxid大的節(jié)點(diǎn),這里的zxid代表節(jié)點(diǎn)所提交事務(wù)最大的id,zxid越大代表該節(jié)點(diǎn)的數(shù)據(jù)越完整。

最后如果epoch和zxid都相等,則比較服務(wù)的serverId,這個(gè)Id是配置zookeeper集群所配置的,所以我們配置zookeeper集群的時(shí)候可以把服務(wù)性能更高的集群的serverId配置大些,讓性能好的機(jī)器擔(dān)任leader角色。

選舉流程

時(shí)機(jī)和規(guī)則都有了,下面就是leader的選舉流程:

 

  • 所有節(jié)點(diǎn)第一票先選舉自己當(dāng)leader,將投票信息廣播出去;
  • 從隊(duì)列中接受投票信息;
  • 按照規(guī)則判斷是否需要更改投票信息,將更改后的投票信息再次廣播出去;
  • 判斷是否有超過一半的投票選舉同一個(gè)節(jié)點(diǎn),如果是選舉結(jié)束根據(jù)投票結(jié)果設(shè)置自己的服務(wù)狀態(tài),選舉結(jié)束,否則繼續(xù)進(jìn)入投票流程。

舉例

 

上圖來自《ZooKeeper:分布式過程協(xié)同技術(shù)詳解》,整體流程還是比較簡單,這里就不具體分析了。

廣播

集群在經(jīng)過leader選舉之后還會有連接leader和同步兩個(gè)步驟,這里就不具體分析這兩個(gè)步驟的流程了,主要介紹集群對外提供服務(wù)如何保證各個(gè)節(jié)點(diǎn)數(shù)據(jù)的一致性。

zab在廣播狀態(tài)中保證以下特征

  • 可靠傳遞: 如果消息m由一臺服務(wù)器傳遞,那么它最終將由所有服務(wù)器傳遞。
  • 全局有序: 如果一個(gè)消息a在消息b之前被一臺服務(wù)器交付,那么所有服務(wù)器都交付了a和b,并且a先于b。
  • 因果有序: 如果消息a在因果上先于消息b并且二者都被交付,那么a必須排在b之前。

有序性是zab協(xié)議必須要保證的一個(gè)很重要的屬性,因?yàn)閦ookeeper是以類似目錄結(jié)構(gòu)的數(shù)據(jù)結(jié)構(gòu)存儲數(shù)據(jù)的,必須要求命名的有序性。

比如一個(gè)命名a創(chuàng)建路徑為/test,然后命名b創(chuàng)建路徑為/test/123,如果不能保證有序性b命名在a之前,b命令會因?yàn)楦腹?jié)點(diǎn)不存在而創(chuàng)建失敗。

 

如上圖所示,整個(gè)寫請求類似一個(gè)二階段的提交。

當(dāng)收到客戶端的寫請求的時(shí)候會經(jīng)歷以下幾個(gè)步驟:

  1. Leader收到客戶端的寫請求,生成一個(gè)事務(wù)(Proposal),其中包含了zxid;
  2. Leader開始廣播該事務(wù),需要注意的是所有節(jié)點(diǎn)的通訊都是由一個(gè)FIFO的隊(duì)列維護(hù)的;
  3. Follower接受到事務(wù)之后,將事務(wù)寫入本地磁盤,寫入成功之后返回Leader一個(gè)ACK;
  4. Leader收到過半的ACK之后,開始提交本事務(wù),并廣播事務(wù)提交信息
  5. 從節(jié)點(diǎn)開始提交本事務(wù)。

有以上流程可知,zookeeper通過二階段提交來保證集群中數(shù)據(jù)的一致性,因?yàn)橹恍枰盏竭^半的ACK就可以提交事務(wù),所以zookeeper的數(shù)據(jù)并不是強(qiáng)一致性。

zab協(xié)議的有序性保證是通過幾個(gè)方面來體現(xiàn)的,第一是,服務(wù)之前用TCP協(xié)議進(jìn)行通訊,保證在網(wǎng)絡(luò)傳輸中的有序性;第二,節(jié)點(diǎn)之前都維護(hù)了一個(gè)FIFO的隊(duì)列,保證全局有序性;第三,通過全局遞增的zxid保證因果有序性。

狀態(tài)流轉(zhuǎn)

前面介紹了zookeeper服務(wù)狀態(tài)有四種,ZAB狀態(tài)也有四種。這里就簡單介紹一個(gè)他們之間的狀態(tài)流轉(zhuǎn),更能加深對zab協(xié)議在zookeeper工作流程中的作用。

 

  1. 服務(wù)在啟動或者和leader失聯(lián)之后服務(wù)狀態(tài)轉(zhuǎn)為LOOKING;
  2. 如果leader不存在選舉leader,如果存在直接連接leader,此時(shí)zab協(xié)議狀態(tài)為ELECTION;
  3. 如果有超過半數(shù)的投票選擇同一臺server,則leader選舉結(jié)束,被選舉為leader的server服務(wù)狀態(tài)為LEADING,其他server服務(wù)狀態(tài)為FOLLOWING/OBSERVING;
  4. 所有server連接上leader,此時(shí)zab協(xié)議狀態(tài)為DISCOVERY;
  5. leader同步數(shù)據(jù)給learner,使各個(gè)從節(jié)點(diǎn)數(shù)據(jù)和leader保持一致,此時(shí)zab協(xié)議狀態(tài)為SYNCHRONIZATION;
  6. 同步超過一半的server之后,集群對外提供服務(wù),此時(shí)zab狀態(tài)為BROADCAST。

可以知道整個(gè)zookeeper服務(wù)的工作流程類似一個(gè)狀態(tài)機(jī)的轉(zhuǎn)換,而zab協(xié)議就是驅(qū)動服務(wù)狀態(tài)流轉(zhuǎn)的關(guān)鍵,理解了zab就理解了zookeeper工作的關(guān)鍵原理

總結(jié)

本文對zab協(xié)議在zookeeper的工作流程中做了簡單的介紹,希望對大家理解學(xué)習(xí)zookeeper有所幫助。

我是敖丙,一個(gè)在互聯(lián)網(wǎng)茍且偷生的工具人。

責(zé)任編輯:武曉燕 來源: 三太子敖丙
相關(guān)推薦

2024-09-13 09:32:30

2022-06-28 08:03:06

緩存Redis

2024-06-27 11:05:19

2019-01-23 10:58:52

接入層架構(gòu)負(fù)載均衡

2015-07-13 09:48:21

iOS

2013-02-28 09:46:18

程序員巖機(jī)Hacker News

2015-12-31 10:23:06

2015公有云中國云市場

2014-03-07 13:23:23

百度面試iOS

2019-09-24 11:36:51

Python支付寶數(shù)據(jù)

2020-10-09 14:13:04

Zookeeper Z

2020-08-26 14:40:38

explainMySQL數(shù)據(jù)庫

2019-10-18 16:05:32

框架開發(fā)Java

2016-01-04 11:18:38

存儲極客

2021-07-21 08:48:44

內(nèi)卷技術(shù)競賽

2021-05-17 10:53:49

5G手機(jī)4G

2009-11-20 09:06:12

2019-08-21 08:01:24

計(jì)算機(jī)視覺人工智能深度學(xué)習(xí)

2020-09-16 09:08:49

訂單微服務(wù)架構(gòu)

2017-04-26 10:49:25

搜狗輸入法

2017-04-26 10:42:27

搜狗輸入法
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 成人午夜av | 日日夜夜91| 久久国产精品视频 | 超碰免费观看 | 色婷婷在线视频 | 婷婷精品 | 在线看av网址 | 男女爱爱网站 | 国产成人综合在线 | 亚洲精品福利视频 | 中文字幕精品视频 | 欧美亚洲国产一区 | 欧美精品一二三区 | 精品久久久久久久久久久下田 | 日韩久草 | 日韩精品一区二区三区在线观看 | 国精产品一区二区三区 | 色花av| 男插女下体视频 | 午夜影院在线播放 | 欧美日韩不卡合集视频 | 在线观看www高清视频 | www视频在线观看 | 午夜激情免费视频 | 亚洲 成人 av | 中文成人无字幕乱码精品 | 久久久久久久久久久久久久国产 | 成人精品免费 | 久久精品99| 亚洲成人精品免费 | 精品日韩一区二区三区 | 国产精品久久久久久久午夜片 | 日韩在线视频免费观看 | 国产一区二区三区精品久久久 | 一区二区免费 | 在线观看第一区 | 91av在线免费观看 | 亚洲欧美精品国产一级在线 | 亚洲成人免费在线观看 | 亚洲一二三视频 | 黄色一级大片在线观看 |