文章目錄
- **ZooKeeper 詳細介紹、部署與使用**
-
- 1. 概述 & 核心介紹
-
- 1.1 什么是 ZooKeeper?
- 1.2 核心特性
- 1.3 核心概念
- 1.4 典型應用場景
- 2. 部署 (以 3 節點集群為例)
-
- 2.1 環境準備
- 2.2 安裝步驟 (在所有節點執行)
- 2.3 啟動與停止集群
- 2.4 防火墻配置 (如果開啟)
- 3. 基本使用與客戶端操作
-
- 3.1 使用 CLI 客戶端連接
- 3.2 常用命令
- 4. 常見問題與故障排查 (FAQ)
- 5. 官方參考文獻
ZooKeeper 詳細介紹、部署與使用
1. 概述 & 核心介紹
1.1 什么是 ZooKeeper?
Apache ZooKeeper 是一個開源的分布式協調服務,由 Apache 軟件基金會托管。它旨在為分布式應用提供一個高性能、高可用且具有嚴格順序訪問控制能力的分布式配置管理、同步和命名注冊服務。
1.2 核心特性
- 順序一致性 (Sequential Consistency): 來自客戶端的更新將按照其發送的順序被應用。
- 原子性 (Atomicity): 更新要么成功,要么失敗,沒有中間狀態。
- 單一系統映像 (Single System Image): 無論客戶端連接到哪個服務器,它都將看到相同的服務視圖。
- 可靠性 (Reliability): 一旦一個更新被應用,它將從那時起一直保持,直到被下一個更新覆蓋。
- 及時性 (Timeliness): 確保客戶端的視圖在特定時間范圍內是最新的。
1.3 核心概念
- 集群模式 (Cluster Mode): ZooKeeper 通常以復制模式 (Replicated Mode) 部署,即一個由多個節點(奇數個,如 3, 5, 7…)組成的集群,稱為一個 Ensemble。這是生產環境的標準部署方式,提供高可用性。
- 領導者選舉 (Leader Election): 集群啟動時,所有節點會通過投票選舉出一個 Leader,其余節點成為 Follower。所有寫請求都必須由 Leader 處理,讀請求可以由任何節點處理。
- ZNode: ZooKeeper 數據模型中的數據節點,類似于文件系統中的文件和目錄。它構成了一個層次化的命名空間(樹狀結構)。
- 持久節點 (PERSISTENT): 創建后即使客戶端斷開連接也會一直存在。
- 臨時節點 (EPHEMERAL): 客戶端會話有效時存在,會話結束則節點自動刪除。常用于實現服務發現和領導者選舉。
- 順序節點 (SEQUENTIAL): 節點名后會附加一個單調遞增的計數器。可用于實現分布式鎖和隊列。
- (節點類型可組合,如
PERSISTENT_SEQUENTIAL
)
- 會話 (Session): 客戶端與服務器端建立一個 TCP 長連接,并通過此連接進行心跳檢測。會話有超時時間 (
sessionTimeout
)。 - Watcher (監聽器): 客戶端可以在 ZNode 上設置監聽。當該 ZNode 發生變化(數據變更、子節點增減等)時,ZooKeeper 會向客戶端發送一個一次性通知。這是 ZooKeeper 實現分布式協調的核心機制。
1.4 典型應用場景
- 配置管理: 將公共配置(如數據庫URL、特性開關)存儲在 ZNode 中,所有應用監聽其變化,實現配置的集中管理和動態更新。
- 分布式鎖: 利用臨時順序節點和 Watcher 機制實現排他鎖和共享鎖。
- 服務發現: 服務提供者啟動時在特定路徑下創建臨時節點,服務消費者監聽該路徑,從而動態感知服務的上線和下線。
- 領導者選舉: 多個候選者嘗試創建同一個臨時節點,成功者即為 Leader,其他候選者監聽該節點,一旦 Leader 宕機(會話失效),節點刪除,其他候選者重新競爭。
- 命名服務 (Naming Service): 通過樹形結構全局唯一地命名資源。
- 集群管理: 監控節點的存活狀態。
2. 部署 (以 3 節點集群為例)
2.1 環境準備
- 服務器: 3臺 Linux 主機 (CentOS 7/8, Ubuntu 18.04+)
zk-node1
(IP: 192.168.1.101)zk-node2
(IP: 192.168.1.102)zk-node3
(IP: 192.168.1.103)
- 軟件依賴: Java 8 或 Java 11 (推薦 LTS 版本)
- 用戶: 建議創建一個專用用戶,如
zookeeper
。
2.2 安裝步驟 (在所有節點執行)
1. 創建用戶和組
sudo groupadd zookeeper
sudo useradd -g zookeeper zookeeper
sudo passwd zookeeper # 設置密碼,用于運維登錄(可選,也可用密鑰)
2. 安裝 Java
# CentOS
sudo yum install -y java-11-openjdk-devel# Ubuntu
sudo apt update && sudo apt install -y openjdk-11-jdk# 驗證安裝
java -version