zookeeper的介紹和簡單使用

1 zookerper介紹

zookeeper是一個開源的分布式協調服務,由Apache軟件基金會提供,主要用于解決分布式應用中的數據管理、狀態同步和集群協調等問題。通過提供一個高性能、高可用的協調服務,幫助構建可靠的分布式系統。

Zookeeper的特點和功能:

  • 數據模型:Zookeeper的數據模型類似于Unix文件系統,采用層次化的樹形結構,稱為Znode。每個Znode可以存儲數據和子節點,支持臨時節點和持久節點
  • 一致性保證:Zookeeper保證了順序一致性、原子性、單一系統映像、實時性和持久性
  • 核心功能:包括領導者選舉、分布式鎖、配置管理、服務注冊與發現等

Zookeeper的工作原理:

Zookeeper采用Leader-Follower架構,集群通常由奇數個節點組成,以確保在網絡分區或節點故障時仍能實現一致性與可用性。核心機制是ZAB協議(Zookeeper Atomic Broadcast),一種崩潰恢復的原子廣播協議,保證了在網絡分區和崩潰時的最終一致性和持久性

Zookeeper的應用場景:

  • Leader選舉:在分布式系統中,協調多個節點選出一個領導者是關鍵操作,例如Hadoop HDFS使用Zookeeper進行Namenode的故障轉移和選舉

  • 分布式鎖:實現資源競爭的控制,Zookeeper提供了強大的分布式鎖功能

  • 配置管理:保持配置的一致性和動態更新,例如Apache Storm使用Zookeeper來協調任務拓撲和節點狀態。

  • 服務注冊與發現:Zookeeper常作為服務注冊中心,允許服務提供者注冊其服務,消費者動態發現服務

配置中心簡單理解:

假設多個應用有自己的配置文件,如果經常變更的話,修改起來比較麻煩;就可以使用配置中心統一存儲配置,讓應用程序去配置中心獲取配置

注冊中心簡單理解:

酒店商家到飛旅平臺 注冊,消費者在平臺上查看酒店信息。酒店平臺就是注冊中心供商家注冊

2 zookerper集群部署

2.1 部署zookerper集群

主機IP地址
elk9110.0.0.0.91
elk9210.0.0.0.92
elk9310.0.0.0.93

端口規劃:

  • 2181:供客戶端訪問的端口
  • 5888:zookerper數據同步和交換
  • 6888:leader選舉

1.下載地址:https://dlcdn.apache.org/zookeeper/zookeeper-3.8.4/apache-zookeeper-3.8.4-bin.tar.gz

2.所有節點創建zookerper相關目錄,添加hosts文件解析

[root@elk91 ~]# mkdir -pv /zhiyong18/{softwares,data,logs}/[root@elk91 ~]# cat >> /etc/hosts <<EOF
10.0.0.91 elk91
10.0.0.92 elk92
10.0.0.93 elk93
EOF

3.配置elk91節點免密登錄其他節點

ssh-keygen -t rsa -f ~/.ssh/id_rsa -P '' -qssh-copy-id elk91
ssh-copy-id elk92
ssh-copy-id elk93

4.解壓軟件包,拷貝配置文件

[root@elk91 ~]# tar xvf apache-zookeeper-3.8.4-bin.tar.gz -C /zhiyong18/softwares/[root@elk91 ~]# cp /zhiyong18/softwares/apache-zookeeper-3.8.4-bin/conf/zoo{_sample.cfg,.cfg}[root@elk91 ~]# ll /zhiyong18/softwares/apache-zookeeper-3.8.4-bin/conf/zoo*
/zhiyong18/softwares/apache-zookeeper-3.8.4-bin/conf/zoo.cfg
/zhiyong18/softwares/apache-zookeeper-3.8.4-bin/conf/zoo_sample.cfg

5.修改zookeeper的配置文件,指定數據目錄、集群主機。然后同步配置文件到其他節點

cat > /zhiyong18/softwares/apache-zookeeper-3.8.4-bin/conf/zoo.cfg <<EOF
# 定義最小單元的時間范圍tick。
tickTime=2000
# 啟動時最長等待tick數量。
initLimit=5
# 數據同步時最長等待的tick時間進行響應ACK
syncLimit=2
# 指定數據目錄
dataDir=/zhiyong18/data/zk
# 監聽端口
clientPort=2181
# 開啟四字命令允許所有的節點訪問。
4lw.commands.whitelist=*server.91=10.0.0.91:5888:6888
server.92=10.0.0.92:5888:6888
server.93=10.0.0.93:5888:6888# # 監控相關
## Metrics Providers
# https://prometheus.io Metrics Exporter
#metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider
#metricsProvider.httpHost=0.0.0.0
#metricsProvider.httpPort=7000
#metricsProvider.exportJvmInfo=true
EOF
scp -r /zhiyong18/softwares/apache-zookeeper-3.8.4-bin/ 10.0.0.92:/zhiyong18/softwares/
scp -r /zhiyong18/softwares/apache-zookeeper-3.8.4-bin/ 10.0.0.93:/zhiyong18/softwares/

6.準備myID文件,ID必須和配置文件中的一樣

for ((host_id=91; host_id<=93; host_id++)); dossh elk${host_id} "mkdir /zhiyong18/data/zkecho ${host_id} > /zhiyong18/data/zk/myid"
done

7.編寫啟動腳本并傳輸到其他節點,最后啟動zookerper集群

cat > /lib/systemd/system/zk.service <<EOF
[Unit]
Description=zhiyong18 zookeeper server
After=network.target[Service]
Type=forking
Environment=JAVA_HOME=/usr/share/elasticsearch/jdk
ExecStart=/zhiyong18/softwares/apache-zookeeper-3.8.4-bin/bin/zkServer.sh start [Install]
WantedBy=multi-user.target
EOF
scp /lib/systemd/system/zk.service elk92:/lib/systemd/system/
scp /lib/systemd/system/zk.service elk93:/lib/systemd/system/
systemctl daemon-reload
systemctl enable --now zk  
systemctl status zk  

8.檢查各端口是否監聽

[root@elk92~]#  ss -ntl | grep 2181
LISTEN 0      50                      *:2181             *:*

9.配置環境變量,便于直接使用zookerper的變量進行操作

cat > /etc/profile.d/zk.sh <<EOF
#!/bin/bash
export JAVA_HOME=/usr/share/elasticsearch/jdk
export ZK_HOME=/zhiyong18/softwares/apache-zookeeper-3.8.4-bin
export PATH=$PATH:$ZK_HOME/bin:$JAVA_HOME/bin
EOF
scp /etc/profile.d/zk.sh elk92:/etc/profile.d
scp /etc/profile.d/zk.sh elk93:/etc/profile.dsource /etc/profile.d/zk.sh

10.連接zookeeper集群

[root@elk91 ~]# zkCli.sh -server 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181
...
[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 0] ls /
[zookeeper]
[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 1] 

11.查看zookeeper集群的狀態。有2個是follower,1個是leader

zkServer.sh status

2.2 zookerper變量

設置占用的內存容量

[root@elk91 ~]# grep ^ZK_SERVER_HEAP /zhiyong18/softwares/apache-zookeeper-3.8.4-bin/bin/zkEnv.sh 
ZK_SERVER_HEAP="${ZK_SERVER_HEAP:-128}"

2.2 圖形化連接工具zk-web

使用方式:java -jar jar包名

注意不要超過 jdk1.8

訪問地址:http://10.0.0.91:8099/

在這里插入圖片描述

2.2 zookerper四字監控

zookeeper的四字監控命令

echo srvr | nc 10.0.0.93 2181
echo ruok | nc 10.0.0.93 2181
echo conf | nc 10.0.0.93 2181

3 zookerper常用命令增刪改查

連接集群:zkCli.sh -server 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181

1.查看zookeeper node列表

[zk: 10.0.0.93:2181(CONNECTED) 1] ls /
[zookeeper]
[zk: 10.0.0.93:2181(CONNECTED) 2] 

2.創建zookeeper node并存儲數據

[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 2] create /wzy666 xixi
Created /wzy666
[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 3] get /wzy666
xixi

3.創建zookeeper node不存儲數據

[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 4] create /wzy666/wzy999
Created /wzy666/wzy999[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 6] get /wzy666/wzy999
null

4.修改zookeeper node的數據

[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 7] set /wzy666/wzy999 999
[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 8] get /wzy666/wzy999
999

5.刪除zookeeper node(必須為空,換句話說,沒有子目錄)

[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 8] create /wzy666/wzy999/1
Created /wzy666/wzy999/1
[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 9] create /wzy666/wzy999/2
Created /wzy666/wzy999/[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 10] ls /wzy666/wzy999
[1, 2][zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 11] delete /wzy666/wzy999
Node not empty: /wzy666/wzy999

6.刪除zookeeper node(遞歸刪除,換句話說,有子目錄也可以被刪除)

[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 15] deleteall /wzy666/wzy999
[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 16] ls /wzy666/wzy999
Node does not exist: /wzy666/wzy999

4 zookerper的節點類型

  • 臨時zookeeper node:當與客戶端鏈接斷開時,超出了一定的時間范圍(默認30s),則自動刪除該zookeeper node
  • 永久zookeeper node:當與客戶端斷開鏈接時,zookeeper node并不會被刪除,除非手動刪除

1.create + -e可以創建臨時node

[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 12] create /wzy666/dev
Node does not exist: /zhiyong18/dev
[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 13] create -e /wzy666/test
Node does not exist: /zhiyong18/test

2.對比2個node的狀態;ephemeralOwner = 0x0 表示永久node,不是則表示臨時node

[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 22] stat /wzy666/dev
cZxid = 0x20000000d
ctime = Fri Nov 22 10:29:02 UTC 2024
mZxid = 0x20000000d
mtime = Fri Nov 22 10:29:02 UTC 2024
pZxid = 0x20000000d
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 0
[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 23] stat /wzy666/tst
Node does not exist: /wzy666/tst
[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 24] stat /wzy666/test
cZxid = 0x20000000e
ctime = Fri Nov 22 10:29:09 UTC 2024
mZxid = 0x20000000e
mtime = Fri Nov 22 10:29:09 UTC 2024
pZxid = 0x20000000e
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x5c000066919c0000
dataLength = 0
numChildren = 0
[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 25]

3.退出30秒,node會被刪除

[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 0] ls /wzy666/test
Node does not exist: /wzy666/test

4.ephemeralOwner ID和 當前連接終端ID相同,當然也可以用隨機的:create -s

5 watch機制

客戶端可以監控znode狀態,一旦發生變化,就立刻通知客戶端。watch事件是一次性的

1.在第一個會話監視/wzy666的數據

[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 1] get -w /wzy666
6x6

2.在第二個會話修改數據

[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 2] set /wzy666 6x9

這時在第一個就能看能通知了

[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 2] 
WATCHER::WatchedEvent state:SyncConnected type:NodeDataChanged path:/wzy666

6 zookerper數據寫入機制

1.客戶端發去數據寫入請求如果到了follwer節點,那么 follower 會轉發寫請求到leader節點;

2.eader 節點接收到寫入請求后,會分配一個全局唯一的事務 ID(ZXID),然后發起寫操作的提案;leader 節點將寫操作的提案廣播給所有 follower 節點

3.每個 follower 節點收到提案后,會嘗試在本地日志中記錄(寫入磁盤),然后向 leader 節點發送一個 ACK(確認消息),表明提案已被記錄

4.當 leader 節點收到超過半數(包括自身)節點的 ACK 后,認為該寫操作被集群大多數接受(滿足 ZooKeeper 的強一致性需求),于是將該事務標記為已提交(commit)。隨后,leader 節點通知所有 follower 節點提交該事務

wzy666


# 6 zookerper數據寫入機制1.客戶端發去數據寫入請求如果到了follwer節點,那么 follower 會轉發寫請求到leader節點;2.eader 節點接收到寫入請求后,會分配一個全局唯一的事務 ID(ZXID),然后發起寫操作的提案;leader 節點將寫操作的提案廣播給所有 follower 節點3.每個 follower 節點收到提案后,會嘗試在本地日志中記錄(寫入磁盤),然后向 leader 節點發送一個 ACK(確認消息),表明提案已被記錄4.當 leader 節點收到超過半數(包括自身)節點的 ACK 后,認為該寫操作被集群大多數接受(滿足 ZooKeeper 的強一致性需求),于是將該事務標記為已提交(commit)。隨后,leader 節點通知所有 follower 節點提交該事務5.最后,leader 節點向客戶端返回寫入成功的響應

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

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

相關文章

二級 二維數組3

對角線之和 題目描述 輸入一個矩陣&#xff0c;輸出右上-左下對角線上的數字和 輸入 輸入1個整數N。(N<10)表示矩陣有n行n列 輸出 對角線的和 樣例 輸入復制 4 1 2 3 4 2 3 4 5 4 5 6 7 1 2 3 4 輸出復制 14 #include<iostream> using namespace std; int main() {i…

Spring Boot MyBatis Plus 版本兼容問題(記錄)

Spring Boot & MyBatis Plus 版本兼容問題&#xff08;Invalid value type for attribute factoryBeanObjectType: java.lang.String&#xff09; 問題描述問題排查1. 檢查 MapperScan 的路徑2. 項目中沒有配置 FactoryBean3. 檢查 Spring 和 MyBatis Plus 版本兼容性 解決…

嵌入式學習筆記-雜七雜八

文章目錄 連續波光纖耦合激光器工作原理主要特點應用領域設計考慮因素 數值孔徑&#xff08;Numerical Aperture&#xff0c;簡稱NA&#xff09;數值孔徑的定義數值孔徑的意義數值孔徑的計算示例數值孔徑與光纖 四象限探測器檢測目標方法四象限劃分檢測目標的步驟1. 數據采集2.…

Java Web-Cookie與Session

會話跟蹤技術 會話跟蹤技術是一種在 Web 應用程序中跟蹤用戶會話狀態的機制&#xff0c;它允許服務器在多個請求之間識別和關聯屬于同一用戶的請求&#xff0c;以便在整個會話過程中保持用戶相關的信息。以下是幾種常見的會話跟蹤技術&#xff1a; Cookie 概念&#xff1a;Cook…

Spring Boot - 數據庫集成04 - 集成Redis

Spring boot集成Redis 文章目錄 Spring boot集成Redis一&#xff1a;redis基本集成1&#xff1a;RedisTemplate Jedis1.1&#xff1a;RedisTemplate1.2&#xff1a;實現案例1.2.1&#xff1a;依賴引入和屬性配置1.2.2&#xff1a;redisConfig配置1.2.3&#xff1a;基礎使用 2&…

STM32使用VScode開發

文章目錄 Makefile形式創建項目新建stm項目下載stm32cubemx新建項目IED makefile保存到本地arm gcc是編譯的工具鏈G++配置編譯Cmake +vscode +MSYS2方式bilibiliMSYS2 統一環境配置mingw32-make -> makewindows環境變量Cmake CmakeListnijia 編譯輸出elfCMAKE_GENERATOR查詢…

Oracle 12c 中的 CDB和PDB的啟動和關閉

一、簡介 Oracle 12c引入了多租戶架構&#xff0c;允許一個容器數據庫&#xff08;Container Database, CDB&#xff09;托管多個獨立的可插拔數據庫&#xff08;Pluggable Database, PDB&#xff09;。本文檔旨在詳細描述如何啟動和關閉CDB及PDB。 二、容器數據庫 (CDB) 2.1…

網絡仿真工具Core環境搭建

目錄 安裝依賴包 源碼下載 Core安裝 FAQ 下載源碼TLS出錯誤 問題 解決方案 找不到dbus-launch 問題 解決方案 安裝依賴包 調用以下命令安裝依賴包 apt-get install -y ca-certificates git sudo wget tzdata libpcap-dev libpcre3-dev \ libprotobuf-dev libxml2-de…

FPGA實現任意角度視頻旋轉(二)視頻90度/270度無裁剪旋轉

本文主要介紹如何基于FPGA實現視頻的90度/270度無裁剪旋轉&#xff0c;旋轉效果示意圖如下&#xff1a; 為了實時對比旋轉效果&#xff0c;采用分屏顯示進行處理&#xff0c;左邊代表旋轉前的視頻在屏幕中的位置&#xff0c;右邊代表旋轉后的視頻在屏幕中的位置。 分屏顯示的…

JavaEE:多線程進階

JavaEE&#xff1a;多線程進階 一、對比不同鎖策略之間的應用場景及其區別1. 悲觀鎖 和 樂觀鎖1.1 定義和原理1.2 應用場景1.3 示例代碼 2. 重量級鎖 和 輕量級鎖2.1 定義和原理2.2 應用場景2.3 示例代碼 3. 掛起等待鎖 和 自旋鎖3.1 定義和原理3.2 應用場景3.3 示例代碼 4. 幾…

董事會辦公管理系統的需求設計和實現

該作者的原創文章目錄&#xff1a; 生產制造執行MES系統的需求設計和實現 企業后勤管理系統的需求設計和實現 行政辦公管理系統的需求設計和實現 人力資源管理HR系統的需求設計和實現 企業財務管理系統的需求設計和實現 董事會辦公管理系統的需求設計和實現 公司組織架構…

pytest自動化測試 - pytest夾具的基本概念

<< 返回目錄 1 pytest自動化測試 - pytest夾具的基本概念 夾具可以為測試用例提供資源(測試數據)、執行預置條件、執行后置條件&#xff0c;夾具可以是函數、類或模塊&#xff0c;使用pytest.fixture裝飾器進行標記。 1.1 夾具的作用范圍 夾具的作用范圍&#xff1a; …

esp32-C3 實現DHT11(溫濕度)

安裝DHT傳感器庫&#xff1a; 在Arduino IDE中&#xff0c;進入項目 > 加載庫 > 管理庫。搜索DHT sensor library并安裝。 編寫代碼 定義引腳和傳感器類型初始化傳感器判斷傳感器是否正常讀取數據 源碼 #include <DHT.h> #include <DHT_U.h>// 定義DHT傳感器…

java構建工具之Gradle

自定義任務 任務定義方式&#xff0c;總體分為兩大類:一種是通過 Project 中的task()方法,另一種是通過tasks 對象的 create 或者register 方法。 //任務名稱,閉包都作為參數println "taskA..." task(A,{ }) //閉包作為最后一個參數可以直接從括號中拿出來println …

【Pytest】生成html報告中,中文亂碼問題解決方案

import pytestif __name__ "__main__":# 只運行 tests 目錄下的測試用例&#xff0c;并生成 HTML 報告pytest.main([-v, -s, --htmlreport.html, tests])可以以上方式生成&#xff0c;也可以在pytest.ini中設置 [pytest] addopts --htmlreport.html --self-contai…

MyBatis最佳實踐:提升數據庫交互效率的秘密武器

第一章&#xff1a;框架的概述&#xff1a; MyBatis 框架的概述&#xff1a; MyBatis 是一個優秀的基于 Java 的持久框架&#xff0c;內部對 JDBC 做了封裝&#xff0c;使開發者只需要關注 SQL 語句&#xff0c;而不關注 JDBC 的代碼&#xff0c;使開發變得更加的簡單MyBatis 通…

《Java程序設計》課程考核試卷

一、單項選擇題&#xff08;本大題共10個小題&#xff0c;每小題2分&#xff0c;共20分&#xff09; 1.下列用來編譯Java源文件為字節碼文件的工具是&#xff08; &#xff09;。 A.java B.javadoc C.jar D.javac 2…

【25考研】人大計算機考研復試該怎么準備?有哪些注意事項?

人大畢竟是老牌985&#xff0c;復試難度不會太低&#xff01;建議同學認真復習&#xff01;沒有機試還是輕松一些的&#xff01; 一、復試內容 由公告可見&#xff0c;復試包含筆試及面試&#xff0c;沒有機試&#xff01; 二、參考書目 官方無給出參考書目&#xff0c;可參照…

vue3中Teleport的用法以及使用場景

1. 基本概念 Teleport 是 Vue3 提供的一個內置組件&#xff0c;它可以將組件的內容傳送到 DOM 樹的任何位置&#xff0c;而不受組件層級的限制。這在處理模態框、通知、彈出菜單等需要突破組件層級限制的場景中特別有用。 1.1 基本語法 <template><teleport to&quo…

使用openwrt搭建ipsec隧道

背景&#xff1a;最近同事遇到了個ipsec問題&#xff0c;做的ipsec特性&#xff0c;ftp下載ipv6性能只有100kb, 正面定位該問題也蠻久了&#xff0c;項目沒有用openwrt, 不過用了開源組件strongswan, 加密算法這些也是內核自帶的&#xff0c;想著開源的不太可能有問題&#xff…