zookeeper學習之原理

来源:https://www.cnblogs.com/jalja/archive/2019/09/01/11441174.html
-Advertisement-
Play Games

ZAB協議包括兩種基本的模式,分別是 崩潰恢復和消息廣播。當整個服務框架在啟動過程中,或是當 Leader 伺服器出現網路中斷、崩潰退出與重啟等異常情況時,ZAB 協議就會進人恢復模式並選舉產生新的Leader伺服器。當選舉產生了新的 Leader 伺服器,同時集群中已經有過半的機器與該Leader... ...


一、zookeeper 是什麼

Zookeeper是一個分散式協調服務,可用於服務發現,分散式鎖,分散式領導選舉,配置管理等。這一切的基礎,都是Zookeeper提供了一個類似於Linux文件系統的樹形結構(可認為是輕量級的記憶體文件系統,但只適合存少量信息,完全不適合存儲大量文件或者大文件),同時提供了對於每個節點的監控與通知機制。既然是一個文件系統,就不得不提Zookeeper是如何保證數據的一致性的。


 

二、zookeeper 集群架構

Zookeeper集群是一個基於主從複製的高可用集群,通常 Master伺服器作為主伺服器提供寫服務,其他的 Slave 伺服器通過非同步複製的方式獲取 Master 伺服器最新的數據,並提供讀服務,在 ZooKeeper 中沒有選擇傳統的 Master/Slave 概念,而是引入了Leader、Follower 和 Observer 三種角色,每個角色承擔如下:

  • Leader 一個Zookeeper集群同一時間只會有一個實際工作的Leader,它會發起並維護與各Follwer及Observer間的心跳。所有的寫操作必須要通過Leader完成再由Leader將寫操作廣播給其它伺服器。
  • Follower 一個Zookeeper集群可能同時存在多個Follower,它會響應Leader的心跳。Follower可直接處理並返回客戶端的讀請求,同時會將寫請求轉發給Leader處理,並且負責在Leader處理寫請求時,對請求進行投票(“過半寫成功”策略)。
  • Observer 角色與Follower類似,但是無投票權。

 在集群中zookeeper是如何保證master與slave數據一致性?

為了保證寫操作的一致性與可用性,Zookeeper專門設計了一種名為原子廣播(ZAB)的支持崩潰恢復的一致性協議。基於該協議,Zookeeper實現了一種主從模式的系統架構來保持集群中各個副本之間的數據一致性。

寫數據時保證一致性:Zookeeper 客戶端會隨機連接到 Zookeeper 集群的一個節點,如果是讀請求,就直接從當前節點中讀取數據;如果是寫請求且當前節點不是leader,那麼節點就會向 leader 提交事務,leader 會廣播事務,只要有超過半數節點寫入成功,該寫請求就會被提交(類 2PC 協議)。

伺服器運行時期的Leader選舉(當leader當機後如何選主)?

zookeeper 在集群模式下,leader宕機也不會影響繼續提供服務,但是leader宕機在從新選主過程時無法對外提供服務,會有一個短暫的停頓過程(這裡就是與eureka的區別)。

  • 集群已存在leader現在又假如一臺伺服器:對於集群中已經存在Leader而言,此種情況一般都是某台機器啟動得較晚,在其啟動之前,集群已經在正常工作,對這種情況,該機器試圖去選舉Leader時,會被告知當前伺服器的Leader信息,對於該機器而言,僅僅需要和Leader機器建立起連接,併進行狀態同步即可。
  • 集群存在leader宕機需要重新選舉leader:例如server3  宕機了。則剩餘的 每個Server發出一個投票。Server1和Server2都會將自己作為Leader伺服器來進行投票,每次投票會包含所推舉的伺服器的myid和ZXID,使用(myid, ZXID)來表示,此時Server1的投票為(1, 0),Server2的投票為(2, 0),然後各自將這個投票發給集群中其他機器。當新的leader選擇出來以後,第二步就是數據同步保證所有的節點與leader數據一致。

            處理投票。針對每一個投票,伺服器都需要將別人的投票和自己的投票進行PK,PK規則如下

    · 優先檢查ZXID。ZXID比較大的伺服器優先作為Leader。

    · 如果ZXID相同,那麼就比較myid。myid較大的伺服器作為Leader伺服器。

為什麼最好使用奇數台伺服器構成 ZooKeeper 集群?

zookeeper有這樣一個特性:集群中只要有過半的機器是正常工作的,那麼整個集群對外就是可用的。也就是說如果有2個zookeeper,那麼只要有1個死了zookeeper就不能用了,因為1沒有過半,所以2個zookeeper的死亡容忍度為0;同理,要是有3個zookeeper,一個死了,還剩下2個正常的,過半了(2>3/2),所以3個zookeeper的容忍度為1。如果是4台zookeeper 如果掛掉2台, 還剩下2台 (2 不大於 4/2),顯然不過半所以集群還是不可用,4台的容忍度還是1。因此不是 不能部署偶數台,而是偶數台對於高可用作用不大,浪費伺服器。


 

三、ZooKeeper 的一些重要概念

ZooKeeper 將數據保存在記憶體中,這也就保證了 高吞吐量和低延遲(但是記憶體限制了能夠存儲的容量不太大,此限制也是保持znode中存儲的數據量較小的進一步原因)。

ZooKeeper 是高性能的。 在“讀”多於“寫”的應用程式中尤其地高性能,因為“寫”會導致所有的伺服器間同步狀態。(“讀”多於“寫”是協調服務的典型場景。)

會話(Session)

  Session 指的是 ZooKeeper 伺服器與客戶端會話。在 ZooKeeper 中,一個客戶端連接是指客戶端和伺服器之間的一個 TCP 長連接。客戶端啟動的時候,首先會與伺服器建立一個 TCP 連接,從第一次連接建立開始,客戶端會話的生命周期也開始了。通過這個連接,客戶端能夠通過心跳檢測與伺服器保持有效的會話,也能夠向Zookeeper伺服器發送請求並接受響應,同時還能夠通過該連接接收來自伺服器的Watch事件通知。 Session的sessionTimeout值用來設置一個客戶端會話的超時時間。當由於伺服器壓力太大、網路故障或是客戶端主動斷開連接等各種原因導致客戶端連接斷開時,只要在sessionTimeout規定的時間內能夠重新連接上集群中任意一臺伺服器,那麼之前創建的會話仍然有效。

在為客戶端創建會話之前,服務端首先會為每個客戶端都分配一個sessionID。由於 sessionID 是 Zookeeper 會話的一個重要標識,許多與會話相關的運行機制都是基於這個 sessionID 的,因此,無論是哪台伺服器為客戶端分配的 sessionID,都務必保證全局唯一。

Watcher

  Watcher(事件監聽器),是Zookeeper中的一個很重要的特性。Zookeeper允許用戶在指定節點上註冊一些Watcher,並且在一些特定事件觸發的時候,ZooKeeper服務端會將事件通知到感興趣的客戶端上去,該機制是Zookeeper實現分散式協調服務的重要特性。

ACL

Zookeeper採用ACL(AccessControlLists)策略來進行許可權控制,類似於 UNIX 文件系統的許可權控制。Zookeeper 定義瞭如下5種許可權


 

四、zookeeper 的數據結構

ZooKeeper 允許分散式進程通過共用的層次結構命名空間進行相互協調,這與標準文件系統類似。 名稱空間由 ZooKeeper 中的數據寄存器組成 - 稱為znode,這些類似於文件和目錄。 與為存儲設計的典型文件系統不同,ZooKeeper數據保存在記憶體中,這意味著ZooKeeper可以實現高吞吐量和低延遲。

 

1、PERSISTENT--持久化目錄節點      客戶端與zookeeper斷開連接後,該節點依舊存在

2、PERSISTENT_SEQUENTIAL-持久化順序編號目錄節點   客戶端與zookeeper斷開連接後,該節點依舊存在,只是Zookeeper給該節點名稱進行順序編號

3、EPHEMERAL-臨時目錄節點   客戶端與zookeeper斷開連接後,該節點被刪除

4、EPHEMERAL_SEQUENTIAL-臨時順序編號目錄節點   客戶端與zookeeper斷開連接後,該節點被刪除,只是Zookeeper給該節點名稱進行順序編號


 

五、zookeeper的作用

1、命名服務

在zookeeper的文件系統里創建一個目錄,即有唯一的path,在我們使用tborg無法確定上游程式的部署機器時即可與下游程式約定好path,通過path即能互相探索發現。

2、配置管理

 程式總是需要配置的,如果程式分散部署在多台機器上,要逐個改變配置就變得困難。好吧,現在把這些配置全部放到zookeeper上去,保存在 Zookeeper 的某個目錄節點中,然後所有相關應用程式對這個目錄節點進行監聽,一旦配置信息發生變化,每個應用程式就會收到 Zookeeper 的通知,然後從 Zookeeper 獲取新的配置信息應用到系統中就好。

 3、集群管理

所謂集群管理無在乎兩點:是否有機器退出和加入、選舉master。

第一點,所有機器約定在父目錄GroupMembers下創建臨時目錄節點,然後監聽父目錄節點的子節點變化消息。一旦有機器掛掉,該機器與 zookeeper的連接斷開,其所創建的臨時目錄節點被刪除,所有其他機器都收到通知:某個兄弟目錄被刪除,於是,所有人都知道他掉線了。新機器加入 也是類似,所有機器收到通知:新兄弟目錄加入。

對於第二點,我們稍微改變一下,所有機器創建臨時順序編號目錄節點,每次選取編號最小的機器作為master就好。

4、分散式鎖

       有了zookeeper的一致性文件系統,鎖的問題變得容易。鎖服務可以分為兩類,一個是保持獨占,另一個是控制時序。

        對於第一類,我們將zookeeper上的一個znode看作是一把鎖,通過createznode的方式來實現。所有客戶端都去創建 /distribute_lock 節點,最終成功創建的那個客戶端也即擁有了這把鎖。用完刪除掉自己創建的distribute_lock 節點就釋放出鎖。

        對於第二類, /distribute_lock 已經預先存在,所有客戶端在它下麵創建臨時順序編號目錄節點,和選master一樣,編號最小的獲得鎖,用完刪除,依次方便。  


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

-Advertisement-
Play Games
更多相關文章
  • 讓多個組件使用同一個掛載點,並動態切換,這就是動態組件。 通過使用保留的 <component>元素,動態地綁定到它的 is 特性,可以實現動態組件。 方式一:局部註冊所需組件 使用<keep-alive>緩存 <keep-alive> 包裹動態組件時,會緩存不活動的組件實例,而不是銷毀它們。和 < ...
  • 前言 最近在公司寫一個混合 app 項目,頁面基本全部都是用 H5 完成,嵌入到原生 webview 下。發現一個問題,在 iPhone 6 下 蘋果手機的狀態欄會擋住頁面,導致頁面下移,樣式錯亂,最後網上查找了些解決辦法,加了一條 meta 標簽解決了問題。今天特來總結下常用的移動端開發需要註意的 ...
  • 正則表達式是構成搜索模式的字元序列。該搜索模式可用於文本搜索和文本替換操作。簡單來說,正則表達式其實是一種規則,主要應用在檢測字元串是否符合我們定義的規則上。 一 創建正則表達式 創建正則表達式有兩種方式,他們都返回一個正則表達式對象(RegExpObject): 1, 字面量方式 2, 構造函數方 ...
  • 嘗試模仿京東的“發現好貨”模塊的可用滑塊滑動的緩動圖 <! more JS代碼 HTML代碼 CSS代碼 ...
  • HTML表單: HTML表單用於搜集不同類型的輸入 標簽元素: HTML表單用於收集用戶輸入; form元素定義HTML表單 屬性列表: | 屬性 | 描述 | | | | | accept charset | 規定在被提交表單中使用的字元集(預設:頁面字元集)。 | | action | 規定向何 ...
  • 目前學習golang的主要需求是為了看懂TiDB的源碼,下麵我們複習一下簡易工廠模式的思想 工廠類型分為三種,創建型模式,結構型模式,行為型模式。 簡單工廠 使用場景:考慮一個簡單的API設計,一個模塊可以提供不同的APi,這些Api都源自同一個基類,不過在繼承基類後不同的子類修改了部分屬性,從而可 ...
  • JVM巨集觀認知 1.什麼是虛擬機? 虛擬機是一種 軟體 。 可分為系統虛擬機(模擬物理機)和程式虛擬機(執行單個電腦程式,比如JVM)。 2.什麼是Java虛擬機(JVM)? JVM是一種將位元組碼轉化為機器碼的軟體。(同上) 歷經時間的迭代,目前廣泛應用的Java虛擬機是Oracle的HotSpo ...
  • 所有的框架處理業務請求時,都會處理URL的路徑部分,分配到指定的代碼中去處理。實現這一功能的關鍵就是獲取$_SERVER全局變數中對於URL部分的數據 當請求的路徑為http://test.com/article?id=1http://test.com/article/update?id=1 支持以 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...