這可能是最簡單易懂的 ZooKeeper 筆記

来源:https://www.cnblogs.com/czsy/archive/2019/07/21/11221394.html
-Advertisement-
Play Games

"分散式架構" "CAP 與 BASE 理論" "一致性協議" "初識 Zookeeper" "Zookeeper 介紹" "Zookeeper 工作機制" "Zookeeper 特點" "Zookeeper 數據結構" "Zookeeper 應用場景" "統一命名服務" "統一配置管理" "統一集 ...


分散式架構

CAP 與 BASE 理論

cap 定理:

一個分散式系統不可能同時滿足一致性 (C:Consistency)、可用性(A:Availability)和分區容錯性(P:Partition tolerance)這三個基本要求,最多只能同時滿足其中的兩項。

我們需要明確一點,對於一個分散式系統而言,分區容錯性是一個最基本的要求,既然是一個分散式系統,那麼分散式系統中的組件必然需要被部署到不同的節點,否則也就無所謂分散式系統了。因此我們一般把精力花在如何根據業務特點在 C 和 A 之間尋求平衡。

base 理論:

BASE 是 Basically Available (基本可用),Soft state (軟狀態)和 Eventually consistent (最終一致性) 三個短語的簡寫,BASE 是對 CAP 中一致性和可用性權衡的結果,其核心思想是即使無法做到強一致性,但每個應用都可以根據自身的業務特點,採用適當的方式來使系統達到最終一致性。

一致性協議

  • 2 PC
  • 3 PC
  • Paxos 演算法

初識 Zookeeper

Zookeeper 介紹

Zookeeper 是一個開源的分散式的(多台機器一起工作),為分散式應用提供協調服務的 Apache 項目。

ZooKeeper 工作機制

Zookeeper從設計模式角度來理解:是一個基於觀察者模式設計的分散式服務管理框架,它負責存儲和管理大家都關心的數據,然後接受觀察者的註冊,一旦這些數據的狀態發生變化,Zookeeper 就將負責通知已經在 Zookeeper 上註冊的那些觀察者做出相應的反應。

例子:

服務端啟動時去註冊信息(創建的都是臨時節點);客戶端獲取當前線上伺服器列表,並註冊監聽;當伺服器節點下線,伺服器節點下線事件通知客戶端,客戶端重新去獲取伺服器列表,並註冊監聽。

Zookeeper = 文件系統 + 通知機制

Zookeeper 特點

  1. 一個 領導者(leader),多個跟隨者(follower)組成的集群
  2. 集群中只要有半數以上節點存活,Zookeeper集群就能正常服務。因此伺服器最好設奇數台。
  3. 全局數據一致性:每台伺服器保存一份相同的數據副本,Client 無論連接到哪個 Server,數據都是一致性的。
  4. 更新請求順序進行,來自同一個 Client 的更新請求按其發送順序依次執行。
  5. 數據更新原子性,一次數據更新要麼成功,要麼失敗。典型的事務原子性。
  6. 實時性,在一定時間範圍內,Client 能讀取到最新的數據。

Zookeeper 數據結構

Zk 數據模型的結構整體上可以看作一棵樹,每個節點稱作一個 ZNode。每個 ZNode 預設能夠存儲 1MB 的數據,每個 ZNode 都是通過其路徑唯一標識的

Zookeeper 應用場景

zk 提供的服務包括:統一命名服務、統一配置管理、統一集群管理、伺服器節點動態上下線、軟負載均衡等。

統一命名服務

在分散式環境下,經常需要對應用/服務進行統一命名,便於識別

例如:IP 地址難記,但是功能變數名稱好記。如下圖,將 www.baidu.com 這個功能變數名稱與旗下的三個 伺服器 IP 地址對應起來,當訪問 www.baidu.com 的時候自動從三個 IP 地址中選一個進行訪問。

統一配置管理

  1. 分散式環境下,配置文件同步非常常見。
    1. 一般要求一個集群中,所有節點的配置信息是一致的,比如 Kafka 集群。
    2. 對配置文件修改後,希望能夠快速同步到各個節點上。
  2. 配置管理可交給 ZooKeeper 實現。
    1. 可以將配置信息寫入 Zookeeper 上的一個 ZNode。
    2. 各個客戶端伺服器監聽這個 ZNode。
    3. 一旦 ZNode 中的數據被修改,ZooKeeper 將通知各個客戶端伺服器。

統一集群管理

  1. 分散式環境中,實時掌握每個節點的狀態是必要的。
    1. 可根據節點實時狀態做出一些調整。
  2. Zookeeper 可以實現實時監控節點狀態變化
    1. 可以將節點信息寫入 Zookeeper 上的一個 ZNode。
    2. 監聽這個 ZNode 可獲取它的實時狀態變化。

服務上下線

客戶端能夠實時洞察到伺服器上下線的變化。服務端啟動時去註冊信息(創建的都是臨時節點);客戶端獲取當前線上伺服器列表,並註冊監聽;當伺服器節點下線,伺服器節點下線事件通知客戶端,客戶端重新去獲取伺服器列表,並註冊監聽

軟負載均衡

在 Zookeeper 中記錄每台伺服器的訪問數,讓訪問數最少的伺服器去處理最新的客戶端請求。

Zookeeper 內部原理

選舉機制

  1. 半數機制:集群中半數以上的機器存活,集群可用。所以 Zookeeper 適合安裝奇數台伺服器
  2. ZooKeeper 在沒有 Master 和 Slave,但是 ZooKeeper 工作時是分為 Leader 和 Follower 的。Leader 只有一個,是通過內部選舉機制臨時產生的。

例子:

假設有五台伺服器組成的 ZooKeeper 集群,他們的 id 從 1-5,同時它們都是剛剛啟動的。假設這些伺服器依序啟動:

  1. 伺服器 1 啟動,現在只有它自己一臺伺服器,它發出去的報文沒有任何響應,因此它的選舉狀態一直是 LOOKING 狀態。
  2. 伺服器 2 啟動,它與最開始啟動的伺服器 1 進行通信。這時候 1 自己有自己一票,還投了 id 大的伺服器,即 2 一票,2 有自己的一票和 1 的一票,共兩票。因此 id 值大的 伺服器 2 勝出,但是沒有達到超過半數以上的伺服器都同意選舉它(由於這個例子有 5 台伺服器,因此需要3台同意,即擁有 3 票)。所以伺服器 1、2 還是繼續保持 LOOKING 狀態。
  3. 伺服器 3 啟動,過程和 2 相同,因此 3 有 三票,2 有 2 票,1 有 1 票,伺服器 3 三票超過一半,成功成為 Leader 。
  4. 伺服器 4 ,由於 3 已經是 Leader 因此它只能作為 Follower。
  5. 伺服器 5 也類似,只能作為 Follower。

節點類型

  • 持久(Persistent):客戶端和伺服器端斷開連接後,創建的節點不刪除
    • 持久化目錄節點:客戶端與 Zookeeper 斷開連接後,該節點依舊存在
    • 持久化順序編號目錄節點:客戶端與 Zookeeper 斷開連接後,該節點依舊存在,只是 Zookeeper 給該節點名稱進行順序編號。
  • 短暫(Ephemeral):客戶端和伺服器端斷開連接後,創建的節點自己刪除(伺服器上下線)
    • 臨時目錄節點:客戶端與 ZooKeeper 斷開連接後,該節點被刪除。
    • 客戶端與 ZooKeeper 斷開連接後,該節點被刪除,只是 ZooKeeper 給該節點名稱進行順序編號。

說明:創建 ZNode 時設置順序標識,ZNode 名稱後會附加一個值,順序號是一個單調遞增的計數器,由父節點維護。在分散式系統中,順序號可用被用於為所有的事件進行全局排序,這樣客戶端可用通過順序號來推斷事件的順序。

監聽器原理

  • 監聽器原理
    • 首先有個 main 線程
    • 在 main 線程中啟動 Zookeeper 客戶端,這時會創建兩個線程,一個負責網路連接通信(connect),一個負責監聽(listenner)。
    • 通過 connect 線程將註冊的監聽事件發送給 zookeeper。
    • 在 zookeeper 的註冊監聽器列表中將註冊的監聽事件添加到列表中。
    • Zookeeper 監聽到由數據或者路徑發生變化,就會將這個消息發送給 listenner 線程。
    • listenner 線程內部調用了 process()方法。
  • 常用的監聽
    • 監聽節點數據的變化:get path[watch]
    • 監聽子節點增減的變化:ls path[watch]

寫數據流程

  1. 假設Client 向 Zookeeper 上的 Server 1 寫數據,發送一個寫請求。
  2. 如果 Server 1 不是 Leader,那麼 Server 1 會把接受到的請求進一步發送給 Leader,因為每個 ZooKeeper 的伺服器集群裡面有一個 是 Leader,這個 Leader 會將所有寫請求廣播給各個 Server。各個 Server 寫成功後就會通知 Leader
  3. 當 Leader 收到大多數 Server 數據寫成功了,那麼就說明數據寫成功了,如果有三台伺服器,只要有兩台寫成功了,那麼就認為數據寫成功了,寫成功後,Leader 告訴 Server 1 數據寫成功了。
  4. Server 1 會進一步通知 Client 數據寫成功了,這時就會認為整個寫操作成功。

自我小結

Zookeeper 是一個採用 ZAB 作為數據一致性協議的分散式數據一致性協調框架。ZooKeeper 可以作為分散式配置管理,集群服務,數據發佈/訂閱,服務註冊/發現,分散式鎖等的實現。其內部採用 ZNode 節點維護一系列數據,當數據改變的時候可以通過 watche 機制告訴客戶端。當 ZooKeeper 作為分散式消息系統的管理,如 Kafka 的管理時,可以將所有 Kafka 伺服器,即所有的 Broker 的信息寫入 ZooKeeper 節點中,當加伺服器時只要在節點下加入一個臨時子節點,伺服器宕機或下線時臨時子節點將會自動刪除。很容易實現伺服器的集群管理。不光如此,ZooKeeper也可以用來維護 Topic 主題和 Producer 和Consumer 等的信息。當 ZooKeeper 作為分散式服務框架的註冊中心時,可以將服務註冊到 ZooKeeper 節點上,每個服務對應一個節點,子節點就是所有提供了該服務的機器的地址。每當有一個服務提供者啟動的時候都會網對應的服務節點下創建自己的臨時節點,存放自己的地址信息。消費者需要某個服務的時候只需要到對應的服務節點中隨便取一個子節點然後使用該服務就行了。監控中心可以很容易的通過現有的節點監控信息。

ZooKeeper 集群中會自動選舉一個 Leader 伺服器負責事務的操作,其餘的 Follower伺服器可以處理非事務操作、參與 Leader 伺服器的投票等。而 Observer 伺服器只能處理非事務的操作,但是不能參與任何投票。

總之,ZooKeeper 常用來維護各種分散式應用的一個狀態,使得分散式應用本身無狀態,只需要向 ZooKeeper 註冊自己的狀態,當需要某種狀態的時候直接去 ZooKeeper 上取就行了。當自己關註的消息發生變化時,ZooKeeper 會通過 Watche 進行通知,自己再進行對應的處理即可。


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

-Advertisement-
Play Games
更多相關文章
  • Oracle表級約束和列級約束 1. 表級定義約束 指的是在定義完一個表所有列之後,再去定義所有相關的約束。 註意:not null 約束只能在列級上定義。 2. 列級定義約束 指的是在定義一個表的每一列的同時定義每一個列的約束條件,其約束條件 位於每一列之後。 約束:FOREIGN KEY,PRI ...
  • 1 意義 1.1 分層的 APIs & 抽象層次 Flink提供三層API。 每個API在簡潔性和表達性之間提供不同的權衡,並針對不同的用例。 而且Flink提供不同級別的抽象來開發流/批處理應用程式 最低級抽象只提供有狀態流。它通過Process Function嵌入到DataStream API ...
  • 5、預設tomcat要使用在生產環境需要做哪些優化 lTomcat記憶體優化 Tomcat記憶體優化主要是對 tomcat 啟動參數優化,我們可以在 tomcat 的啟動腳本 catalina.sh 中設置 JAVA_OPTS 參數。 JAVA_OPTS='-Xms1024m -Xmx2048m -XX ...
  • 一、確認centos系統是為64位的,x86的不可以安裝 1. 下載elasticsearch包 2. 用 tar -zxvf 解壓包 3. 增加一個elk用戶,elasticsearch7不可用root用戶運行 4. 新建用戶必須要用 chown -R 用戶名 文件夾:進行許可權分配 二、配置實現外 ...
  • 1. 數據倉庫 數據倉庫一詞尚沒有一個統一的定義,著名的數據倉庫專家W. H. Inmon 在其著作《Buildingthe Data Warehouse》一書中給予如下描述:數據倉庫(Data Warehouse) 是一個面向主題的(Subject Oriented) 、集成的( Integrat ...
  • [學習筆記] Spark通過lazy特性有什麼意義呢? Spark通過lazy特性,可以進行底層的spark應用執行的優化。在生活中,就像三思而後行。謀定而後動。 文章轉載自原文:https://blog.csdn.net/qq_44596980/article/details/93309261 ...
  • MySQL資料庫的特點和優勢: 1.MySQL性能卓越、服務穩定,很少出現異常宕機。 2.MySQL開放源代碼且無版權制約,自主性及使用成本低。 3.MySQL歷史悠久,用戶使用活躍,遇到問題可以尋求幫助。 4.MySQL體積小,安裝方便,易於維護。 5.MySQL口碑效應好,是的企業無需考慮就用之 ...
  • 07.21自我總結 pymysql模塊 一.創建連接庫 二.建立游標 三.提交sql語句 四.查看內容 五.移動游標 相對位置 cursor.scroll(1, "relative") cursor.scroll() 預設是相對位置 絕對位置 cursor.scroll(0, "absolute") ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...