Zookeeper 集群角色、原理

来源:https://www.cnblogs.com/svenaugustus/archive/2020/05/24/12952588.html
-Advertisement-
Play Games

Zookeeper 的集群角色 集群中的 server 分為三種角色: , , 。 其中 是配置 明確定義的,角色 在一個zookeeper集群中有且只能有一個,是通過內部的選舉機制臨時產生的。 是集群中最重要的角色。負責響應集群的所有對Zookeeper數據狀態變更的請求。它會將每個狀態更新請求進 ...


Zookeeper 的集群角色

集群中的 server 分為三種角色:leader, follower, observer

file

  • 其中observer是配置zoo.cfg明確定義的,角色leader 在一個zookeeper集群中有且只能有一個,是通過內部的選舉機制臨時產生的。
  • leader 是集群中最重要的角色。負責響應集群的所有對Zookeeper數據狀態變更的請求。它會將每個狀態更新請求進行順序管理,以便保證整個集群內部消息處理的 FIFO,遵循了順序一致性(Sequential Consistency)。
    • leader 內部維護 session ,來自客戶端的連接和斷開連接,都會被統一followerobserver 轉發給leader處理。
    • leader 內部維護單調遞增的 Zxid(ZooKeeper Transaction Id),針對客戶端連接,斷開連接,節點的寫操作都會分配一個全局唯一的Zxid,同時這些操作是原子性的,並且是嚴格順序性的,遵循ZAB原子廣播一致性協議完成事務(transaction)操作。如果客戶端的所有寫操作,都會被 follower 統一轉發給leader處理。
  • follower 具有選舉權。負責提供給客戶端讀寫服務,需要響應leader的提議
  • observer 沒有選舉權。主要提供給客戶端讀服務,不提供寫服務,也不需要響應leader的提議。也不需要日誌文件,因為沒有寫服務,沒有持久化的需要。
Server狀態
  • LOOKING,競選狀態。
  • FOLLOWING,隨從狀態,同步leader狀態,參與投票決策提案。
  • OBSERVING,觀察狀態,同步leader狀態,不參與投票決策提案。
  • LEADING,領導者狀態,發起正常消息的提案。

Zookeeper 的存儲

zookeeper中的znode數據都是在記憶體中優先維護和提供讀服務,當事務被提交以及最終提交都會持久化到磁碟的日誌文件中。

Zookeeper 的內部網路拓撲

Zookeeper 在內部網路中如何實現兩兩連接的?

file

這裡暫且使用 10.0.2.30,10.0.2.31,10.0.2.32,10.0.2.33 替代 node1,node2,node3,node4,並依次啟動 zookeeper。

  • zoo.cfg配置文件
server.1=10.0.2.30:2888:3888
server.2=10.0.2.31:2888:3888
server.3=10.0.2.32:2888:3888
server.4=10.0.2.33:2888:3888

依次使用 netstat 查看網路連接情況

  • node1

file

可以看出來 node1作為服務節點,由 node2,node3,node4 通過 3888埠建立連接進來。
node1 作為客戶端連接 node3 (目前node3是leader) 的2888埠。

  • node2

file

可以看出來 node2作為服務節點,由 node3,node4 通過 3888埠建立連接進來。
但是 node2 作為客戶端連接node1的3888埠。
node2 作為客戶端連接 node3 (目前node3是leader) 的2888埠。

  • node3

file

可以看出來 node3作為服務節點,由 node4 通過 3888埠建立連接進來。
但是 node3 作為客戶端連接node1,node2 的3888埠。
node3 作為leader節點,由 node1,node2 ,node4 通過 3888埠建立連接進來。
至於為什麼 node3能當選 leader 呢?可以在下麵的 選舉過程中 得到進一步詳細的闡述。

  • node4

file

可以看出來 node4 作為客戶端連接node1,node2 ,node3 的3888埠。
node4 作為客戶端連接 node3 (目前node3是leader) 的2888埠。

  • 結論
    Zookeeper 在內部網路中如圖所示,依據zoo.cfg的配置後續的server都逐個連接前面的server的3888埠,這樣就形成了兩兩連接的拓撲,同時也不冗餘。
    而當leader當選時,會開放2888埠,其他follower連接其2888埠。

ZAB(原子廣播,Zookeeper Atomic Broadcast

https://zookeeper.apache.org/doc/current/zookeeperInternals.html

ZAB(Zookeeper Atomic Broadcast)原子廣播是 Paxos分散式一致性協議演算法(http://zh.wikipedia.org/zh-cn/Paxos) 的一個簡化版本。

首先有以下概念,我們需要瞭解:

  • 數據包(Packet):通過 FIFO Channel 發送的位元組數組。
  • 提案(Proposal):協議的單位。通過與ZooKeeper中的法定server交換數據包來達成協議。大多數提案都包含消息,但是 NEW_LEADER Proposal 提案是不包含消息。
  • 消息(Message):要自動廣播到所有ZooKeeper伺服器的位元組數組。消息被包含在一個提案(Proposal)中,並且只有在提案(Proposal)被通過後消息才會最終交付delivered(提交到事務日誌和更新記憶體的統一視圖)。
  • 法定人員 (Quorum):有 Zookeeper集群中非observer 角色的所有伺服器節點組成,具有投票通過提案(Proposal)的權力。

在 Zookeeper 中提供以下的保證數據的嚴格順序:

  • 傳遞可靠性:如果一個消息被一個server最終交付delivered,那麼這個消息最終也被其他所有的server最終交付delivered,這裡指最終一致性。
  • 順序全局性:如果一個消息a先於b被一個server最終交付delivered,那麼消息a也是先於b被其他所有的server最終交付delivered
  • 順序傳遞性:如果消息a先於b被髮送到server,消息b先於c被髮送到server,那麼消息a也是先於c被server接收的。

如上所述,ZooKeeper保證消息的總順序,也保證建議的總順序。

ZooKeeper使用ZooKeeper transaction id (zxid) ,這是一個全局的唯一的ID。提出提案(Proposal)時,所有提案都將附上zxid,進而保證全局的順序性。

  • leader 將提案(Proposal)將發送到所有ZooKeeper伺服器。

  • 在法定人員(Quorum)收到後,會確認(acknowledge)回覆這個提案(Proposal)給leader

其中確認acknowledge提案(Proposal)表示伺服器已將提案(Proposal)持久化到日誌中。

稍微註意一下:法定人員(Quorum)收到提案(Proposal),只存在確認(acknowledge),或者因為網路等原因超時響應,不存在反對(reject)。

  • 只要一但滿足半數以上(大於所有法定人員的一半)確認acknowledge後,leader就會進入正式提交(Commit)。

  • 如果提案(Proposal)中包含一條消息,則在提交時將最終交付delivered該消息。

ZooKeeper消息傳遞包括兩個階段:

  • leader選舉(Leader activation):在此階段,leader被選舉出來,集群開始變為對外可用狀態,並準備開始提出提案(Proposal)。
  • 活動消息傳遞(Active messaging):在此階段,leader開始接受消息(Message),併發起提案(Proposal),協調和決策以提交(Commit)提案(Proposal)。

leader選舉

leader產生的條件:

  • 具有最新的 Zxid,如果 存在多個server都有最新的Zxid,在投票過程中選取建立網路連接中 myid最大的。
  • leader 和其連接的follower的個數必須滿足半數以上(大於所有法定人員的一半)。

file

當集群中任意具有選舉權的server發現leader掛了:

  • 該 server 會觸發NEW_LEADER Proposal 提案,給自己投票,並通過 ZAB 廣播給所有連接的 server。
  • 接受到 NEW_LEADER Proposal 提案的server,如果有被選舉權,則會觸發它的投票行為:
    • 先比較zxid,最新的勝出,如果zxid相同,再比較myid,最大的勝出。
    • 最後將勝出的內容,通過 ZAB 廣播給所有連接的 server。
  • 最終滿足leader條件的server,將被選出,同時 follower也被廣播獲得 Proposal 的提交。

以上中的 網路拓撲 為什麼 node3能當選 leader 呢?

  • node1 啟動時,給自己投票,因為其他server尚沒啟動,因為 node1 依然在LOOKING競選狀態。
  • node2 啟動完,給自己投票,同時與 node1 交換了Zxid和myid,node2 勝出,但因為沒有達到半數以上法定人員,所以node1,node2 依然處於LOOKING競選狀態。
  • node3 啟動完,給自己投票,同時與 node1 ,node2 交換了Zxid和myid,node3 勝出,也達到半數以上法定人員(3 > 4/2),因此 node3 被選舉為 leader
  • node4 啟動完,給自己投票,同時與 node1 ,node2 ,node3交換了Zxid和myid,node3的Zxid最新,因此 node4 追隨 node3。

活動消息傳遞

消息的傳遞一般指寫請求。

file

  • follower 接收到 客戶端的 寫請求後,會轉發給 leader順序處理。
  • leader 收到寫請求,會檢查數據問題,如無問題,創建一個新的提案proposal加入toBeApplied FIFO 隊列,內容是寫請求的消息,並附上全局的ZXid。
  • leader每次toBeApplied FIFO 隊列頭部取到一個提案proposal,通過 ZAB 廣播給所有的 follower,處於 pending 等待回覆。
  • follower 收到提案proposal後,記錄提案proposal持久化到磁碟的日誌文件中,然後確認(acknowledge)回覆這個提案(Proposal)給leader
  • leader處於 pending 等待回覆,一旦收到follower 加上自己的確認(acknowledge)超過半數法定人員(Quorum),就會觸發 Commit階段,發送commit請求給所有的follower,發送info請求所有的observer
    同時,leader將提案proposal放入 committedRequest 隊列,並從toBeApplied FIFO 隊列移出該 提案proposal
  • follower 收到 Commit後,會更新自己的記憶體數據,統一數據視圖。
  • observer收到info後,會更新自己的記憶體數據,統一數據視圖。

file

針對客戶端的讀請求,則不需要轉發給leader處理。
當然如果是客戶端的sync命令,則會觸發客戶端連接的followerobserverleader請求同步數據狀態。

@SvenAugustus(https://www.flysium.xyz/)
更多請關註微信公眾號【編程不離宗】,專註於分享伺服器開發與編程相關的技術乾貨:


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • C#實現對DropDowList添加下拉選項的方法 1.在指定下標處添加: DropDownList.Items.Insert(2, new ListItem("Title", "Value")); 2.在已存在的選擇下添加: DropDownList.Items.Add(new ListItem( ...
  • 樹莓派版本: Raspberry Pi 4 操作系統 : Ubuntu Server 20.04_x64 樹莓派官網: https://www.raspberrypi.org/ ubuntu官網: https://ubuntu.com/ 下載並安裝系統 下載鏡像: https://ubuntu.co ...
  • 預設情況下啟動docker容器都是bridge網路,橋接到docker0橋;對於docker容器來講,各個容器之間的網路上相互隔離的;相互隔離就表示在第一個容器里監聽某個埠,對於第二個容器是不可見的;對於宿主機來講,兩個容器的網路都是共用docker0橋的網路;同時在宿主機上的網路名稱空間中是可... ...
  • 今天同事說新裝了一臺雲伺服器,使用ssh登錄正常,但是上面的達夢資料庫服務埠不能訪問。 用netstat anp查看埠是正常監聽的,監聽的地址也是允許任意ip訪問 並且防火牆和iptables都是關閉的 我也覺得奇怪,於是遠程登錄上去伺服器。查看了達夢的埠,看起來是正常的。 Active In ...
  • [TOC] 1.打開VMware,進入虛擬網路編輯器 2.進行如下配置 3.進入虛擬機設置 4.進行如下設置 5.進入CentOS7終端 6.重新啟動網路 ...
  • 你以為只有馬雲會灌雞湯?Linux 命令行也會! “Linux 太南了o(╥﹏╥)o”,“我累了不想奮鬥了o(︶︿︶)o”... 不知道你有沒有想過,在你快喪失鬥志的時候,Linux 還能牛逼得給你來一碗香噴噴的心靈雞湯? 和 能夠在終端隨機顯示一些激勵性的名句,可謂是兩大心靈雞湯烹飪師。 安裝 m ...
  • which 命令 功能說明:查找命令對應的程式文件的路徑。 which命令會在PATH環境變數設定的目錄里查找符合條件的可執行文件。 用法:which [options] programname [...] | 選項 | 作用 | | | | | skip alias | 忽略別名 | 示例1:查找 ...
  • [toc] 在RHEL系列中,Bash中的快捷鍵是由readline庫來提供,預設是emacs風格的鍵綁定。 使用set命令可以查看當前的模式 快捷鍵的一些說明 Control鍵:PC鍵盤上的Ctrl鍵 Meta鍵:PC鍵盤上的ALT鍵,如果你鍵盤上沒有這個鍵,可以使用ESC鍵代替 ctrl開頭的快 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...