ZooKeeper 原理解析及優劣比較

大家好,這里是架構資源棧!點擊上方關注,添加“星標”,一起學習大廠前沿架構!

Apache Zookeeper Architecture ...

引言

在分布式系統中,服務注冊、配置管理、分布式鎖、選舉等場景都需要一個高可用、一致性強的協調服務。Apache ZooKeeper 憑借其輕量級、易用性和強一致性,成為業界主要選擇之一。本文將從原理層面剖析 ZooKeeper,給出 Java 快速上手示例,并與同類產品(etcd、Consul、Eureka)進行對比,為架構選型提供參考。


一、ZooKeeper 簡介

  • 定位:分布式協調服務,提供命名(Naming)、同步(Synchronization)、配置管理(Configuration)、組管理(Group Management)等基本原語。

  • 優勢

    • 讀性能優越:針對讀多寫少場景優化
    • 強一致性:采用 Zab(ZooKeeper Atomic Broadcast)協議保障寫操作原子廣播
    • Watch 機制:基于事件通知的異步設計

二、ZooKeeper 核心原理

1. 數據模型 —— ZNode 樹

  • 類文件系統的樹狀結構存儲數據,稱為 ZNode
  • 每個 ZNode 可以存儲少量的元數據和數據(默認 1MB 以內)
  • 支持持久節點(Persistent)和臨時節點(Ephemeral),及順序變體
/
├── /app
│   ├── /app/config     (持久節點)
│   └── /app/lock_0001  (臨時順序)
└── /services├── /services/svcA (臨時節點)└── /services/svcB (臨時節點)

2. 集群架構與選舉

  • 角色:每個節點啟動時會在集群中選舉產生一個 Leader,其余為 Follower;也可配置 Observer(只讀,不參與選舉)

  • 讀寫分離

    • 讀請求:可由任意節點(Follower/Observer)處理
    • 寫請求:必須先提交給 Leader,由 Leader 通知 Follower 過半達成一致后應用并回復客戶端

3. Zab 協議(Atomic Broadcast)

  1. Proposal:Leader 接收寫請求并生成提案(Proposal)
  2. Sync:Leader 將 Proposal 發送給所有 Follower
  3. Ack:Follower 收到 Proposal 后返回確認
  4. Commit:Leader 收到多數 Ack 后發送 Commit,所有節點應用并完成事務

4. 會話與 Watch

  • Session:客戶端與集群建立會話,ZK 用心跳維持,有超時機制
  • Watch:客戶端可在 ZNode 上注冊 Watch,節點數據/子節點變化時觸發一次性事件通知

三、ZooKeeper 快速入門示例(Java)

import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;import java.util.concurrent.CountDownLatch;public class ZkDemo {private static final String CONNECT_ADDR = "zk1:2181,zk2:2181,zk3:2181";private static final int SESSION_TIMEOUT = 5000;private ZooKeeper zk;private CountDownLatch connectedSignal = new CountDownLatch(1);public void connect() throws Exception {zk = new ZooKeeper(CONNECT_ADDR, SESSION_TIMEOUT, event -> {if (event.getState() == Watcher.Event.KeeperState.SyncConnected) {connectedSignal.countDown();}});connectedSignal.await();}// 創建持久節點public String createPersistent(String path, byte[] data) throws KeeperException, InterruptedException {return zk.create(path, data, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);}// 讀取數據并注冊 Watchpublic byte[] getData(String path, Watcher watcher) throws KeeperException, InterruptedException {Stat stat = zk.exists(path, true);if (stat != null) {return zk.getData(path, watcher, stat);}return null;}// 更新數據public void updateData(String path, byte[] data) throws KeeperException, InterruptedException {Stat stat = zk.exists(path, false);if (stat != null) {zk.setData(path, data, stat.getVersion());}}// 關閉連接public void close() throws InterruptedException {zk.close();}public static void main(String[] args) throws Exception {ZkDemo demo = new ZkDemo();demo.connect();String path = demo.createPersistent("/app/config", "v1".getBytes());System.out.println("節點創建: " + path);byte[] data = demo.getData("/app/config", event ->System.out.println("節點變更: " + event));System.out.println("讀取數據: " + new String(data));demo.updateData("/app/config", "v2".getBytes());demo.close();}
}

四、與同類產品對比

特性ZooKeeperetcdConsulEureka
一致性強一致性(CP)強一致性(CP,基于 Raft)可配(默認 CP)弱一致性(AP,基于自選復制)
讀寫性能讀快、寫次之寫優、讀優性能均衡適中
Watch機制一次性 Watch,需重置支持 Watch/WatchStream,可持續監聽支持 KV Watch不支持,需客戶端輪詢
數據模型樹形層級(類文件系統)鍵值對(扁平)KV + 服務健康檢查服務注冊中心
客戶端生態原生 Java/C、眾多三方Go/Kotlin/Java/C# 等,多語種支持Go/Java/Python/Node.js 等Java 生態為主
高可用方案集群模式,Observer 可擴展讀集群模式,普通節點+LearnerCluster + WAN Federation集群模式,PeerAwareInstance
典型場景分布式鎖、配置管理、選舉、Naming配置管理、服務發現、Leader 選舉服務發現、健康檢查、Multi-Datacenter服務發現、負載均衡

對比總結

  • 一致性與性能:若追求強一致性、讀多寫少場景,首選 ZooKeeper;寫密集場景可考慮 etcd。
  • 生態與易用性:Consul 提供內置健康檢查、Multi-DC 支持,適合作為全棧服務發現與健康監控;Eureka 更偏向 Java 微服務生態(Spring Cloud)。
  • Watch 能力:持續監聽場景下,etcd 和 Consul 更靈活;ZooKeeper 則需客戶端自行重置 Watch。

結語

Apache ZooKeeper 以其成熟的協調原語、強一致性和穩定的社區,仍是分布式系統核心組件的首選。但在選型時,應結合業務場景、性能特點和運維成本,綜合權衡。希望本文能夠幫助你快速理解 ZooKeeper 原理,并在架構設計中做出更明智的決策。

轉自:https://mp.weixin.qq.com/s/cSTNX6jaOYnkHhSEjz9ILw

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/81658.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/81658.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/81658.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

模糊照片變清晰:照片高清修復 ComfyUI 使用教學

模糊照片變清晰 滿心歡喜地翻出舊相冊,想重溫那些美好的回憶,結果照片卻模糊不清,根本看不清當年的模樣;又或者精心拍攝了一張超有氛圍感的照片,結果因為手抖或者光線問題,變得模糊,無法發朋友圈…

IEEEtran中文獻中的作者大于3個時,用et al.省略

latex: 在使用bib文件的時候,當參考文獻超過三個作者時,第三個作者后加逗號并接上et al.。我使用的是IEEEtran.bst。 \begingroup \small \bibliographystyle{IEEEtran} \bibliography{newbmyref1} \endgroup1.需要將IEEEtran.bst添加到這個…

Android Studio Kotlin 中的方法添加灰色參數提示

在使用 Android Studio 時, 我發現使用 Java 編寫方法后在調用方法時, 會自動顯示灰色的參數。 但在 Kotlin 中沒有顯示, 于是找了各種方法最后找到了設置, 并且以本文章記錄下來。 博主博客 https://blog.uso6.comhttps://blog.…

python寵物用品商城系統

目錄 技術棧介紹具體實現截圖系統設計研究方法:設計步驟設計流程核心代碼部分展示研究方法詳細視頻演示試驗方案論文大綱源碼獲取/詳細視頻演示 技術棧介紹 Django-SpringBoot-php-Node.js-flask 本課題的研究方法和研究步驟基本合理,難度適中&#xf…

《具身智能機器人:自修復材料與智能結構設計的前沿探索》

在具身智能機器人的研發進程中,自修復材料與智能結構設計無疑是極具挑戰性與創新性的關鍵領域,吸引著無數科研人員投身其中,探尋未知。 傳統機器人在復雜多變的環境中執行任務時,一旦材料出現損傷,如外殼刮擦、內部線…

矩陣的秩(Rank)

矩陣的秩(Rank)是線性代數中的核心概念,表示矩陣中線性無關的行(或列)的最大數量,反映了矩陣所包含的“獨立信息”的多少。以下是其核心要點: 1. 秩的定義 行秩:矩陣中線性無關的行…

麒麟系統編譯osg —— 擴展篇

一、背景 前文講到麒麟系統編譯osg,通常情況下會提示: 意思是無法生成插件osgdb_jpeg,需要配置“JPEG_LIBRARY”和“JPEG_INCLUDE_DIR”。 經查,本機不存在jpeglib.h和libjpeg.so,需要另外安裝。 二、編譯jpeg庫 …

【數據倉庫面試題合集①】數據建模高頻面試題及解析

?? 面試官愛問什么?——核心考察點 數據建模作為數倉崗位面試的重頭戲,考察的不只是模型知識,更是對業務理解、抽象能力和工程落地經驗的綜合評估。常見題型可分為三類: 概念類:模型類型、建模方法論(如維度建模、范式建模) 場景類:給定一個業務場景進行模型設計(如…

園區無人機智能巡檢項目方案

在工業4.0與智慧園區建設加速推進的今天,傳統人工巡檢的局限性日益凸顯:效率低、覆蓋范圍有限、安全隱患大。而無人機智能巡檢技術的崛起,正以其 "高空視角AI大腦全自動作業" 的創新模式,重新定義園區管理標準。本文將深…

【C++】vector:容器的別樣風采

目錄 vector: vector實例化: vector構造函數: vector對象尾插:v1.push_back() vector迭代器: vector實例化string類型的對象 vector接口: begin()end()//rbegin()rend() resize(): vector&#xff…

大語言模型 15 - Manus 超強智能體 開源版本 OpenManus 案例與原理深入解析

寫在前面 Manus 是由中國初創公司 Monica.im 于 2025 年 3 月推出的全球首款通用型 AI 智能體(AI Agent),旨在實現“知行合一”,即不僅具備強大的語言理解和推理能力,還能自主執行復雜任務,直接交付完整成…

【node.js】安裝與配置

個人主頁:Guiat 歸屬專欄:node.js 文章目錄 1. Node.js簡介1.1 Node.js的特點1.2 Node.js架構 2. Node.js安裝2.1 下載和安裝方法2.1.1 Windows安裝2.1.2 macOS安裝2.1.3 Linux安裝 2.2 使用NVM安裝和管理Node.js版本2.2.1 安裝NVM2.2.2 使用NVM管理Node…

Neo4j(一) - Neo4j安裝教程(Windows)

文章目錄 前言一、JDK與Neo4j版本對應關系二、JDK11安裝及配置1. JDK11下載2. 解壓3. 配置環境變量3.1 打開系統屬性設置3.2 新建系統環境變量3.3 編輯 PATH 環境變量3.4 驗證環境變量是否配置成功 三、Neo4j安裝(Windows)1. 下載并解壓Neo4j安裝包1.1 下…

深信服golang面經

for range 中賦值的變量,這個變量指向的是真實的地址嗎,還是臨時變量 不是真實地址,是臨時變量 package mainimport "fmt"func main() {slice : []int{4, 2, 3}for _, v : range slice {fmt.Println(v, &v) // 這里的 v 是臨…

PLC雙人舞:profinet轉ethernet ip網關奏響施耐德與AB的協奏曲

PLC雙人舞:ethernet ip轉profinet網關奏響施耐德與AB的協奏曲 案例分析:施耐德PLC與AB PLC的互聯互通 在現代工業自動化中,設備之間的互聯互通至關重要。本案例旨在展示如何通過北京倍訊科技的EtherNet/IP轉Modbus網關,將施耐德P…

鏈接家里電腦

要在外網訪問家里的電腦(或NAS),主要有 5種主流方法,各有優缺點,適用于不同需求。以下是詳細方案和操作指南: 一、方案對比速查表 方法適用場景速度安全性難度是否需要公網IP遠程桌面(RDP&…

VS Code開源AI編輯器:一場編程革命的新起點

在2025年5月19日,微軟發布了一則激動人心的消息——VS Code將開源其AI編輯器組件,特別是GitHub Copilot Chat擴展。正如微軟官方博客所宣告的:“我們相信代碼編輯器的未來應該是開放的,并由AI驅動。” 為什么現在開源&#xff1f…

51c嵌入式※~合集7~Linux

我自己的原文哦~ https://blog.51cto.com/whaosoft/13926843 一、u-boot和bootloader~區別 Bootloader 比Bootloader從字面上來看就是啟動加載的意思。用過電腦的都知道,windows開機時會首先加載bios,然后是系統內核,最后啟動完畢。那…

深度學習實戰 04:卷積神經網絡之 VGG16 復現三(訓練)

在后續的系列文章中,我們將逐步深入探討 VGG16 相關的核心內容,具體涵蓋以下幾個方面: 卷積原理篇:詳細剖析 VGG 的 “堆疊小卷積核” 設計理念,深入解讀為何 332 卷積操作等效于 55 卷積,以及 333 卷積操作…

Ubuntu 20.04之Docker安裝ES7.17.14和Kibana7.17.14

你需要已經安裝如下運行環境: Ubuntu 20.04 docker 28 docker-compose 1.25 一、手動拉取鏡像 docker pull docker.elastic.co/kibana/kibana:7.17.14docker pull docker.elastic.co/elasticsearch/elasticsearch:7.17.14 或者手動導入鏡像 docker load -i es7.17.14.ta…