一. Zookeeper簡介
1.1 什麼是Zookeeper
ZooKeeper是一個分布式的,開放源碼的分布式應用程式協調服務,Google的Chubby一個開源的實作,是大資料生态中的重要元件。它是叢集的管理者,監視着叢集中各個節點的狀态根據節點送出的回報進行下一步合理操作。最終,将簡單易用的接口和性能高效、功能穩定的系統提供給使用者。
它是一個為分布式應用提供一緻性協調服務的中間件
1.2 ZooKeeper提供了什麼
檔案系統
Zookeeper提供一個多層級的節點命名空間(節點稱為znode)。與檔案系統不同的是,這些節點都可以設定關聯的資料,而檔案系統中隻有檔案節點可以存放資料而目錄節點不行。Zookeeper為了保證高吞吐和低延遲,在記憶體中維護了這個樹狀的目錄結構,這種特性使得Zookeeper不能用于存放大量的資料,每個節點的存放資料上限為1M。
通知機制
client端會對某個znode建立一個watcher事件,當該znode發生變化時,這些client會收到zk的通知,然後client可以根據znode變化來做出業務上的改變等。
1.3 Zookeeper作用
master節點選舉, 主節點down掉後, 從節點就會接手工作, 并且保證這個節點是唯一的,這也就是所謂首腦模式,進而保證我們叢集是高可用的統一配置檔案管理, 即隻需要部署一台伺服器, 則可以把相同的配置檔案同步更新到其他所有伺服器, 此操作在雲計算中用的特别多(例如修改了redis統一配置)
資料釋出與訂閱, 類似消息隊列MQ分布式鎖,分布式環境中不同程序之間争奪資源,類似于多程序中的鎖叢集管理, 保證叢集中資料的強一緻性
1.4 Zookeeper的特性
一緻性: 資料一緻性, 資料按照順序分批入庫
原子性: 事務要麼成功要麼失敗
單一視圖: 用戶端連接配接叢集中的任意zk節點, 資料都是一緻的
可靠性:每次對zk的操作狀态都會儲存在服務端
實時性: 用戶端可以讀取到zk服務端的最新資料
軟體包ZooKeeper
提取碼:6ugy
一.單機安裝Zookeeper
#上傳JDK包
#安裝JDK環境
[[email protected] ~]# tar zxf jdk-8u211-linux-x64.tar.gz -C /usr/local/
[[email protected] ~]# vim /etc/profile # 編輯Java變量
..........................
export JAVA_HOME=/usr/local/jdk1.8.0_211
export JRE_HOME=/usr/local/jdk1.8.0_211/jre
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
[[email protected] ~]# source /etc/profile # 執行使配置生效
[[email protected] ~]# java -version # 檢視是否安裝成功
java version "1.8.0_211"
Java(TM) SE Runtime Environment (build 1.8.0_211-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode)
#上傳zookeeper包
#安裝zookeeper
[[email protected] ~]# tar zxf zookeeper-3.4.14.tar.gz -C /usr/local/
[[email protected] ~]# vim /etc/profile
export ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.14
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$ZOOKEEPER_HOME/bin:$PATH # 加入Java配置的PATH中
[[email protected] ~]# source /etc/profile
[[email protected] ~]# cd /usr/local/zookeeper-3.4.14/conf/
[[email protected] conf]# cp zoo_sample.cfg zoo.cfg
[[email protected] conf]# mkdir -p /usr/local/zookeeper-3.4.14/data # 建立資料目錄
[[email protected] conf]# sed -i "s/dataDir=\/tmp\/zookeeper/dataDir=\/usr\/local\/zookeeper-3.4.14\/data/g" zoo.cfg
[[email protected] conf]# zkServer.sh start # 啟動服務
[[email protected] conf]# netstat -anput | grep 2181 # 确定端口在監聽
tcp6 0 0 :::2181 :::* LISTEN 4903/java
用戶端指令操作
[[email protected] ~]# zkCli.sh # 後面不加任何參數預設連接配接localhost本機的2181端口
Connecting to localhost:2181
[zk: localhost:2181(CONNECTED) 0] help # 顯示用戶端支援的指令
[zk: localhost:2181(CONNECTED) 1] ls / # 檢視目前zk中所包含的内容
[zookeeper]
[zk: localhost:2181(CONNECTED) 2] ls2 / # 檢視目前zk中的内容及詳情
[zookeeper]
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x0
cversion = -1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 1
[zk: localhost:2181(CONNECTED) 3] create /test1 neirong # 建立一個節點
Created /test1
[zk: localhost:2181(CONNECTED) 4] ls / # 可以看到已經多了一個test1
[zookeeper, test1]
[zk: localhost:2181(CONNECTED) 5] get /test1 # huo擷取節點資訊,需寫絕對路徑
neirong # 節點資料資訊
cZxid = 0x2 # 節點建立時額zxid
ctime = Sat Apr 04 16:15:30 CST 2020 # 節點建立的時間
mZxid = 0x2
mtime = Sat Apr 04 16:15:30 CST 2020 # 節點最近一次更新的時間
pZxid = 0x2
cversion = 0 # 子結點資料更新次數
dataVersion = 0 # 本節點資料更新次數
aclVersion = 0 # 節點ACL的更新次數
ephemeralOwner = 0x0
dataLength = 7 # 節點資料長度
numChildren = 0 # 子結點的數量
[zk: localhost:2181(CONNECTED) 6] set /test1 "gengxin" # 更新節點資料
[zk: localhost:2181(CONNECTED) 7] get /test1 # 可以看到已經更改為新的資料
gengxin
[zk: localhost:2181(CONNECTED) 8] history # 列出zui最近所使用的指令
0 - help
1 - ls /
2 - ls2 /
3 - create /test1 neirong
4 - ls /
5 - get /test1
6 - set /test1 "gengxin"
7 - get /test1
8 - history
[zk: localhost:2181(CONNECTED) 9] delete /test1 # 删除節點,但是無法删除擁有子節點的 節點
[zk: localhost:2181(CONNECTED) 11] rmr /test1 # rmrk可以删除帶有子節點的節點
二.zookeeper單機僞叢集部署
在一台主機上跑多個zk執行個體,每個zk執行個體對應一個獨立的配置檔案;但是每個配置檔案的clientPort & dataDir & dataLogDir絕對不能相同,還需要在dataDir中建立myid檔案來指定該dataDir對應的zk執行個體。
環境如下:
這裡在一台實體伺服器上,部署3個zk執行個體
1.安裝JDK
#上傳JDK包
#安裝JDK環境
[[email protected] ~]# tar zxf jdk-8u211-linux-x64.tar.gz -C /usr/local/
[[email protected] ~]# vim /etc/profile # 編輯Java變量
..........................
export JAVA_HOME=/usr/local/jdk1.8.0_211
export JRE_HOME=/usr/local/jdk1.8.0_211/jre
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
[[email protected] ~]# source /etc/profile # 執行使配置生效
[[email protected] ~]# java -version # 檢視是否安裝成功
java version "1.8.0_211"
Java(TM) SE Runtime Environment (build 1.8.0_211-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode)
2.安裝zookeeper
#上傳zookeeper包
[[email protected] ~]# tar zxf zookeeper-3.4.14.tar.gz -C /usr/local/
[[email protected] ~]# vim /etc/profile
export ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.14
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$ZOOKEEPER_HOME/bin:$PATH
[[email protected] ~]# source /etc/profile
#建立資料目錄
[[email protected] ~]# mkdir -p /usr/local/zookeeper-3.4.14/{data_0,data_1,data_2}
#建立myid檔案,并填入ID值
[[email protected] ~]# echo 0 > /usr/local/zookeeper-3.4.14/data_0/myid
[[email protected] ~]# echo 1 > /usr/local/zookeeper-3.4.14/data_1/myid
[[email protected] ~]# echo 2 > /usr/local/zookeeper-3.4.14/data_2/myid
#建立事務日志目錄,官方建立盡量給事務日志作單獨的磁盤或挂載點,這會極大的提高zk性能
[[email protected] ~]# mkdir -p /usr/local/zookeeper-3.4.14/{logs_0,logs_1,logs_2}
#配置server0
[[email protected] ~]# cd /usr/local/zookeeper-3.4.14/conf/
[[email protected] conf]# cp zoo_sample.cfg zoo_0.cfg
[[email protected] conf]# egrep -v "^$|^#" zoo_0.cfg # 修改配置檔案為如下
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper-3.4.14/data_0/
clientPort=2180
dataLogDir=/usr/local/zookeeper-3.4.14/logs_0/
server.0=127.0.0.1:2287:3387
server.1=127.0.0.1:2288:3388
server.2=127.0.0.1:2289:3389
#配置server1
[[email protected] conf]# cp zoo_0.cfg zoo_1.cfg # 複制之前的配置檔案,修改個别參數
[[email protected] conf]# vim zoo_1.cfg
dataDir=/usr/local/zookeeper-3.4.14/data_1/
clientPort=2181
dataLogDir=/usr/local/zookeeper-3.4.14/logs_1/
#配置server2
[[email protected] conf]# cp zoo_0.cfg zoo_2.cfg
[[email protected] conf]# vim zoo_2.cfg
dataDir=/usr/local/zookeeper-3.4.14/data_2/
clientPort=2182
dataLogDir=/usr/local/zookeeper-3.4.14/logs_2/
[[email protected] conf]# zkServer.sh start zoo_0.cfg # 我這裡是在conf目錄下,是以後面直接接着配置檔案,如果不在conf下,則需寫全路徑
#啟動各執行個體
[[email protected] conf]# zkServer.sh start zoo_1.cfg
[[email protected] conf]# zkServer.sh start zoo_2.cfg
[[email protected] conf]# netstat -anput | grep java
tcp6 0 0 :::2180 :::* LISTEN 9251/java
tcp6 0 0 :::2181 :::* LISTEN 9291/java
tcp6 0 0 :::2182 :::* LISTEN 9334/java
#列出JVM
[[email protected] conf]# jps
9377 Jps
9251 QuorumPeerMain
9334 QuorumPeerMain
9291 QuorumPeerMain
#各執行個體都啟動之後就可以使用用戶端進行連接配接了
[[email protected] conf]# zkCli.sh -server 127.0.0.1:2180 # 例
關于多個server的配置說明: 這些server表單伺服器的條目。列出組成ZooKeeper服務的伺服器。當伺服器啟動 時,它通過在資料目錄中查找檔案myid來知道它是哪個伺服器。該檔案包含伺服器号。 最後,注意每個伺服器 名後面的兩個端口号:“2287”和“3387”。對等點使用前一個端口連接配接到其他對等點。這樣的連接配接是必要的,以便 對等點可以通信,例如,就更新的順序達成一緻。更具體地說,ZooKeeper伺服器使用這個端口将追随者連接配接 到leader。當一個新的上司者出現時,追随者使用這個端口打開一個TCP連接配接到上司者。由于預設的上司人選舉 也使用TCP,我們目前需要另一個端口的上司人選舉。這是伺服器條目中的第二個端口。
三.ZooKeeper多機叢集部署
三台伺服器上都需要執行如下操作
#安裝好JDK
[[email protected] ~]# java -version
java version "1.8.0_211"
Java(TM) SE Runtime Environment (build 1.8.0_211-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode)
#安裝好zookeeper
[[email protected] ~]# tar zxf zookeeper-3.4.14.tar.gz -C /usr/local/
[[email protected] ~]# vim /etc/profile
export ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.14
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$ZOOKEEPER_HOME/bin:$PATH # 加入Java配置的PATH中
[[email protected] ~]# source /etc/profile
server0配置
[[email protected] ~]# mkdir -p /usr/local/zookeeper-3.4.14/{data,logs}
[[email protected] ~]# echo 0 > /usr/local/zookeeper-3.4.14/data/myid
[[email protected] ~]# cd /usr/local/zookeeper-3.4.14/conf/
[[email protected] conf]# cp zoo_sample.cfg zoo.cfg
[[email protected] conf]# egrep -v "^$|^#" zoo.cfg # 修改配置檔案為如下
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper-3.4.14/data/
clientPort=2181
dataLogDir=/usr/local/zookeeper-3.4.14/logs
server.0=192.168.1.14:2288:3388
server.1=192.168.1.15:2288:3388
server.2=192.168.1.16:2288:3388
[[email protected] conf]# zkServer.sh start # 啟動執行個體
[[email protected] conf]# netstat -anput | grep java # 确定端口在監聽
tcp6 0 0 :::43542 :::* LISTEN 40355/java
tcp6 0 0 192.168.1.14:3388 :::* LISTEN 40355/java
tcp6 0 0 :::2181 :::* LISTEN 40355/java
server1配置
[[email protected] ~]# mkdir -p /usr/local/zookeeper-3.4.14/{data,logs}
[[email protected] ~]# echo 1 > /usr/local/zookeeper-3.4.14/data/myid
[[email protected] ~]# cd /usr/local/zookeeper-3.4.14/conf/
[[email protected] conf]# scp [email protected]:/usr/local/zookeeper-3.4.14/conf/zoo.cfg ./
[[email protected] conf]# zkServer.sh start
[[email protected] conf]# netstat -anput | grep java
tcp6 0 0 192.168.1.15:3388 :::* LISTEN 40608/java
tcp6 0 0 :::2181 :::* LISTEN 40608/java
server2配置
[[email protected] ~]# mkdir -p /usr/local/zookeeper-3.4.14/{data,logs}
[[email protected] ~]# echo 2 > /usr/local/zookeeper-3.4.14/data/myid
[[email protected] ~]# cd /usr/local/zookeeper-3.4.14/conf/
[[email protected] conf]# scp [email protected]:/usr/local/zookeeper-3.4.14/conf/zoo.cfg ./
[[email protected] conf]# zkServer.sh start
[[email protected] conf]# netstat -anput | grep java
tcp6 0 0 192.168.1.16:3388 :::* LISTEN 12769/java
tcp6 0 0 :::2181 :::* LISTEN 12769/java
檢視各zk節點的狀态
[[email protected] /]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper-3.4.14/bin/../conf/zoo.cfg
Mode: follower
[[email protected] /]# zkServer.sh status # 02伺服器為leader
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper-3.4.14/bin/../conf/zoo.cfg
Mode: leader
[[email protected] /]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper-3.4.14/bin/../conf/zoo.cfg
Mode: follower