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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...