日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

ZooKeeper學習之路 (八)ZooKeeper原理解析

 HK123COM 2019-02-14

目錄

 

正文

ZooKeeper中的各種角色

ZooKeeper與客戶端

  每個Server在工作過程中有三種狀態(tài):
    LOOKING:當前Server不知道leader是誰,正在搜尋
    LEADING:當前Server即為選舉出來的leader
    FOLLOWING:leader已經(jīng)選舉出來,當前Server與之同步

Zookeeper節(jié)點數(shù)據(jù)操作流程

 

 

注:    

  1.在Client向Follwer發(fā)出一個寫的請求

  2.Follwer把請求發(fā)送給Leader

  3.Leader接收到以后開始發(fā)起投票并通知Follwer進行投票

  4.Follwer把投票結果發(fā)送給Leader

  5.Leader將結果匯總后如果需要寫入,則開始寫入同時把寫入操作通知給Leader,然后commit;

  6.Follwer把請求結果返回給Client

 Follower主要有四個功能:

  1. 向Leader發(fā)送請求(PING消息、REQUEST消息、ACK消息、REVALIDATE消息);

  2 .接收Leader消息并進行處理;

  3 .接收Client的請求,如果為寫請求,發(fā)送給Leader進行投票;

  4 .返回Client結果。

Follower的消息循環(huán)處理如下幾種來自Leader的消息:

  1 .PING消息: 心跳消息;

  2 .PROPOSAL消息:Leader發(fā)起的提案,要求Follower投票;

  3 .COMMIT消息:服務器端最新一次提案的信息;

  4 .UPTODATE消息:表明同步完成;

  5 .REVALIDATE消息:根據(jù)Leader的REVALIDATE結果,關閉待revalidate的session還是允許其接受消息;

  6 .SYNC消息:返回SYNC結果到客戶端,這個消息最初由客戶端發(fā)起,用來強制得到最新的更新。

Paxos 算法概述(ZAB 協(xié)議) 

   Paxos 算法是萊斯利·蘭伯特(英語:Leslie Lamport)于 1990 年提出的一種基于消息傳遞且 具有高度容錯特性的一致性算法。

  分布式系統(tǒng)中的節(jié)點通信存在兩種模型:共享內存(Shared memory)和消息傳遞(Messages passing)?;谙鬟f通信模型的分布式系統(tǒng),不可避免的會發(fā)生以下錯誤:進程可能會 慢、被殺死或者重啟,消息可能會延遲、丟失、重復,在基礎 Paxos 場景中,先不考慮可能 出現(xiàn)消息篡改即拜占庭錯誤(Byzantine failure,即雖然有可能一個消息被傳遞了兩次,但是 絕對不會出現(xiàn)錯誤的消息)的情況。Paxos 算法解決的問題是在一個可能發(fā)生上述異常的分 布式系統(tǒng)中如何就某個值達成一致,保證不論發(fā)生以上任何異常,都不會破壞決議一致性。

  Paxos 算法使用一個希臘故事來描述,在 Paxos 中,存在三種角色,分別為

    Proposer(提議者,用來發(fā)出提案 proposal)

    Acceptor(接受者,可以接受或拒絕提案)

    Learner(學習者,學習被選定的提案,當提案被超過半數(shù)的 Acceptor 接受后為被批準)

  下面更精確的定義 Paxos 要解決的問題:

    1、決議(value)只有在被 proposer 提出后才能被批準

    2、在一次 Paxos 算法的執(zhí)行實例中,只批準(chose)一個 value

    3、learner 只能獲得被批準(chosen)的 value

  ZooKeeper 的選舉算法有兩種:一種是基于 Basic Paxos(Google Chubby 采用)實現(xiàn)的,另外 一種是基于 Fast Paxos(ZooKeeper 采用)算法實現(xiàn)的。系統(tǒng)默認的選舉算法為 Fast Paxos。 并且 ZooKeeper 在 3.4.0 版本后只保留了 FastLeaderElection 算法。

  ZooKeeper 的核心是原子廣播,這個機制保證了各個 Server 之間的同步。實現(xiàn)這個機制的協(xié) 議叫做 ZAB 協(xié)議(Zookeeper Atomic BrodCast)。 ZAB 協(xié)議有兩種模式,它們分別是崩潰恢復模式(選主)和原子廣播模式(同步)。

  1、當服務啟動或者在領導者崩潰后,ZAB 就進入了恢復模式,當領導者被選舉出來,且大 多數(shù) Server 完成了和 leader 的狀態(tài)同步以后,恢復模式就結束了。狀態(tài)同步保證了 leader 和 follower 之間具有相同的系統(tǒng)狀態(tài)。

     2、當 ZooKeeper 集群選舉出 leader 同步完狀態(tài)退出恢復模式之后,便進入了原子廣播模式。 所有的寫請求都被轉發(fā)給 leader,再由 leader 將更新 proposal 廣播給 follower

   為了保證事務的順序一致性,zookeeper 采用了遞增的事務 id 號(zxid)來標識事務。所有 的提議(proposal)都在被提出的時候加上了 zxid。實現(xiàn)中 zxid 是一個 64 位的數(shù)字,它高 32 位是 epoch 用來標識 leader 關系是否改變,每次一個 leader 被選出來,它都會有一個新 的 epoch,標識當前屬于那個 leader 的統(tǒng)治時期。低 32 位用于遞增計數(shù)?! ?/p>

   這里給大家介紹以下 Basic Paxos 流程:

1、選舉線程由當前 Server 發(fā)起選舉的線程擔任,其主要功能是對投票結果進行統(tǒng)計,并選 出推薦的 Server

2、選舉線程首先向所有 Server 發(fā)起一次詢問(包括自己)

3、選舉線程收到回復后,驗證是否是自己發(fā)起的詢問(驗證 zxid 是否一致),然后獲取對方 的 serverid(myid),并存儲到當前詢問對象列表中,最后獲取對方提議的 leader 相關信息 (serverid,zxid),并將這些信息存儲到當次選舉的投票記錄表中

4、收到所有 Server 回復以后,就計算出 id 最大的那個 Server,并將這個 Server 相關信息設 置成下一次要投票的 Server

5、線程將當前 id 最大的 Server 設置為當前 Server 要推薦的 Leader,如果此時獲勝的 Server 獲得 n/2 + 1 的 Server 票數(shù), 設置當前推薦的 leader 為獲勝的 Server,將根據(jù)獲勝的 Server 相關信息設置自己的狀態(tài),否則,繼續(xù)這個過程,直到 leader 被選舉出來。

   通過流程分析我們可以得出:要使 Leader 獲得多數(shù) Server 的支持,則 Server 總數(shù)必須是奇 數(shù) 2n+1,且存活的 Server 的數(shù)目不得少于 n+1。 每個 Server 啟動后都會重復以上流程。在恢復模式下,如果是剛從崩潰狀態(tài)恢復的或者剛 啟動的 server 還會從磁盤快照中恢復數(shù)據(jù)和會話信息,zk 會記錄事務日志并定期進行快照, 方便在恢復時進行狀態(tài)恢復。 Fast Paxos 流程是在選舉過程中,某 Server 首先向所有 Server 提議自己要成為 leader,當其 它 Server 收到提議以后,解決 epoch 和 zxid 的沖突,并接受對方的提議,然后向對方發(fā)送 接受提議完成的消息,重復這個流程,最后一定能選舉出 Leader

ZooKeeper 的選主機制

選擇機制中的概念

服務器ID

比如有三臺服務器,編號分別是1,2,3。

編號越大在選擇算法中的權重越大。

數(shù)據(jù)ID

服務器中存放的最大數(shù)據(jù)ID.

 值越大說明數(shù)據(jù)越新,在選舉算法中數(shù)據(jù)越新權重越大。

邏輯時鐘

或者叫投票的次數(shù),同一輪投票過程中的邏輯時鐘值是相同的。每投完一次票這個數(shù)據(jù)就會增加,然后與接收到的其它服務器返回的投票信息中的數(shù)值相比,根據(jù)不同的值做出不同的判斷。

選舉狀態(tài)

  • LOOKING,競選狀態(tài)。
  • FOLLOWING,隨從狀態(tài),同步leader狀態(tài),參與投票。
  • OBSERVING,觀察狀態(tài),同步leader狀態(tài),不參與投票。
  • LEADING,領導者狀態(tài)。

選舉消息內容

在投票完成后,需要將投票信息發(fā)送給集群中的所有服務器,它包含如下內容。

  • 服務器ID
  • 數(shù)據(jù)ID
  • 邏輯時鐘
  • 選舉狀態(tài)

選舉流程圖

因為每個服務器都是獨立的,在啟動時均從初始狀態(tài)開始參與選舉,下面是簡易流程圖。

 

ZooKeeper 的全新集群選主

  以一個簡單的例子來說明整個選舉的過程:假設有五臺服務器組成的 zookeeper 集群,它們 的 serverid 從 1-5,同時它們都是最新啟動的,也就是沒有歷史數(shù)據(jù),在存放數(shù)據(jù)量這一點 上,都是一樣的。假設這些服務器依序啟動,來看看會發(fā)生什么

  1、服務器 1 啟動,此時只有它一臺服務器啟動了,它發(fā)出去的報沒有任何響應,所以它的 選舉狀態(tài)一直是 LOOKING 狀態(tài)

  2、服務器 2 啟動,它與最開始啟動的服務器 1 進行通信,互相交換自己的選舉結果,由于 兩者都沒有歷史數(shù)據(jù),所以 id 值較大的服務器 2 勝出,但是由于沒有達到超過半數(shù)以上的服務器都同意選舉它(這個例子中的半數(shù)以上是 3),所以服務器 1、2 還是繼續(xù)保持 LOOKING 狀態(tài)

     3、服務器 3 啟動,根據(jù)前面的理論分析,服務器 3 成為服務器 1,2,3 中的老大,而與上面不 同的是,此時有三臺服務器(超過半數(shù))選舉了它,所以它成為了這次選舉的 leader

  4、服務器 4 啟動,根據(jù)前面的分析,理論上服務器 4 應該是服務器 1,2,3,4 中最大的,但是 由于前面已經(jīng)有半數(shù)以上的服務器選舉了服務器 3,所以它只能接收當小弟的命了

  5、服務器 5 啟動,同 4 一樣,當小弟

ZooKeeper 的非全新集群選主

  那么,初始化的時候,是按照上述的說明進行選舉的,但是當 zookeeper 運行了一段時間之 后,有機器 down 掉,重新選舉時,選舉過程就相對復雜了。

  需要加入數(shù)據(jù) version、serverid 和邏輯時鐘。

  數(shù)據(jù) version:數(shù)據(jù)新的 version 就大,數(shù)據(jù)每次更新都會更新 version

  server id:就是我們配置的 myid 中的值,每個機器一個

  邏輯時鐘:這個值從 0 開始遞增,每次選舉對應一個值,也就是說:如果在同一次選舉中, 那么這個值應該是一致的;邏輯時鐘值越大,說明這一次選舉 leader 的進程更新,也就是 每次選舉擁有一個 zxid,投票結果只取 zxid 最新的

  選舉的標準就變成:

    1、邏輯時鐘小的選舉結果被忽略,重新投票

    2、統(tǒng)一邏輯時鐘后,數(shù)據(jù) version 大的勝出

    3、數(shù)據(jù) version 相同的情況下,server id 大的勝出

 根據(jù)這個規(guī)則選出 leader。

 

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多