zookeeper(單機、僞集羣、集羣)部署

ZooKeeper是一個分佈式的、開源的分佈式應用程序協調服務,可以在分佈 式環境中實現應用配置管理、統一命名服務、狀態同步服務等功能。
ZooKeeper是一種爲分佈式應用所設計的高可用、高性能的開源協調服務,它提供了一項基本服務:分佈式鎖 服務。由於ZooKeeper開源的特性,在其分佈式鎖實現的基礎上,又被摸索出了其它的功用,譬如:配置維 護、組服務、分佈式消息隊列等等。 ZooKeeper維護了一個類似文件系統的數據結構,其內部每個子目錄都被 稱作znode(目錄節點),與文件系統一樣,我們可以自由的增刪改查znode。ZooKeeper集羣適合搭建在奇數 臺機器上。只要集羣中半數以上主機處於存活,那麼服務就是可用的。 ZooKeeper在配置文件中並沒有指定 master和slave,但是,ZooKeeper在工作時,只有一個節點爲leader,其餘節點爲follower,leader是通過內部 的選舉機制臨時產生的。

ZooKeeper特點
1、順序一致性:以zxid來保證事務的順序性。
2、原子性:以zab保證原子操作,要麼成功,要麼失敗。
3、單一視圖:客戶獲取到的數據始終是一致的。
4、可靠:以版本實現"寫入校驗",保證了數據寫入的正確性。

ZooKeeper有三種安裝方式:單機模式 & 僞集羣模式 & 集羣模式
單機模式:ZooKeeper以單實例的形式運 行在一臺服務器上,適合測試環境。
僞集羣模式:在一臺服務器上跑多個ZooKeeper實例。
集羣模式: ZooKeeper運行在多臺服務器上,適合生產環境。
所需軟件包(提取碼:mqtp )

一、開始部署

1、單機安裝Zookeeper

#安裝JDK環境
[root@zookeeper ~]# tar zxf jdk-8u211-linux-x64.tar.gz -C /usr/local/
[root@zookeeper ~]# 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
[root@zookeeper ~]# source /etc/profile           # 執行使配置生效
[root@zookeeper ~]# 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
[root@zookeeper ~]# tar zxf zookeeper-3.4.14.tar.gz -C /usr/local/
[root@zookeeper ~]# 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中
[root@zookeeper ~]# source /etc/profile
[root@zookeeper ~]# cd /usr/local/zookeeper-3.4.14/conf/
[root@zookeeper conf]# cp zoo_sample.cfg zoo.cfg
[root@zookeeper conf]# mkdir -p /usr/local/zookeeper-3.4.14/data                           # 創建數據目錄
[root@zookeeper conf]# sed -i "s/dataDir=\/tmp\/zookeeper/dataDir=\/usr\/local\/zookeeper-3.4.14\/data/g" zoo.cfg 
[root@zookeeper conf]# zkServer.sh start             # 啓動服務
[root@zookeeper conf]# netstat -anput | grep 2181           # 確定端口在監聽
tcp6       0      0 :::2181                 :::*                    LISTEN      4903/java   

1)客戶端命令操作

[root@zookeeper ~]# 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可以刪除帶有子節點的節點

關於zoo.cfg配置參數說明可參考官方文檔

2、zookeeper單機僞集羣部署
在一臺主機上跑多個zk實例,每個zk實例對應一個獨立的配置文件;但是每個配置文件的clientPort & dataDir & dataLogDir絕對不能相同,還需要在dataDir中創建myid文件來指定該dataDir對應的zk實例。
環境如下:
這裏在一臺物理服務器上,部署3個zk實例
zookeeper(單機、僞集羣、集羣)部署
1)安裝zookeeper

#安裝好JDK,可參考之前單機安裝
[root@zookeeper ~]# 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
[root@zookeeper ~]# tar zxf zookeeper-3.4.14.tar.gz -C /usr/local/
[root@zookeeper ~]# vim /etc/profile
export ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.14
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$ZOOKEEPER_HOME/bin:$PATH                          
[root@zookeeper ~]# source /etc/profile
#創建數據目錄
[root@zookeeper ~]# mkdir -p /usr/local/zookeeper-3.4.14/{data_0,data_1,data_2}
#創建myid文件,並填入ID值
[root@zookeeper ~]# echo 0 > /usr/local/zookeeper-3.4.14/data_0/myid
[root@zookeeper ~]# echo 1 > /usr/local/zookeeper-3.4.14/data_1/myid
[root@zookeeper ~]# echo 2 > /usr/local/zookeeper-3.4.14/data_2/myid
#創建事務日誌目錄,官方建立儘量給事務日誌作單獨的磁盤或掛載點,這會極大的提高zk性能
[root@zookeeper ~]# mkdir -p /usr/local/zookeeper-3.4.14/{logs_0,logs_1,logs_2}
#配置server0
[root@zookeeper ~]# cd /usr/local/zookeeper-3.4.14/conf/
[root@zookeeper conf]# cp zoo_sample.cfg zoo_0.cfg
[root@zookeeper 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
[root@zookeeper conf]# cp zoo_0.cfg zoo_1.cfg           # 複製之前的配置文件,修改個別參數
[root@zookeeper 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
[root@zookeeper conf]# cp zoo_0.cfg zoo_2.cfg
[root@zookeeper 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/
[root@zookeeper conf]# zkServer.sh start zoo_0.cfg             # 我這裏是在conf目錄下,所以後面直接接着配置文件,如果不在conf下,則需寫全路徑
#啓動各實例
[root@zookeeper conf]# zkServer.sh start zoo_1.cfg 
[root@zookeeper conf]# zkServer.sh start zoo_2.cfg 
[root@zookeeper 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
[root@zookeeper conf]# jps
9377 Jps
9251 QuorumPeerMain
9334 QuorumPeerMain
9291 QuorumPeerMain
#各實例都啓動之後就可以使用客戶端進行連接了
[root@zookeeper conf]# zkCli.sh -server 127.0.0.1:2180     # 例

關於多個server的配置說明: 這些server表單服務器的條目。列出組成ZooKeeper服務的服務器。當服務器啓動 時,它通過在數據目錄中查找文件myid來知道它是哪個服務器。該文件包含服務器號。 最後,注意每個服務器 名後面的兩個端口號:“2287”和“3387”。對等點使用前一個端口連接到其他對等點。這樣的連接是必要的,以便 對等點可以通信,例如,就更新的順序達成一致。更具體地說,ZooKeeper服務器使用這個端口將追隨者連接 到leader。當一個新的領導者出現時,追隨者使用這個端口打開一個TCP連接到領導者。由於默認的領導人選舉 也使用TCP,我們目前需要另一個端口的領導人選舉。這是服務器條目中的第二個端口。

3、 ZooKeeper多機集羣部署
爲了獲得可靠的zk服務,應該在多臺服務器上部署多個zk,只要集羣中大多數的zk服務啓動了,那麼總的zk服 務將是可用的。 在多臺主機上搭建ZooKeeper集羣的方式,與僞集羣幾乎是差不多的。
環境如下:
zookeeper(單機、僞集羣、集羣)部署
三臺服務器上都需要執行如下操作

#安裝好JDK
[root@zookeeper01 ~]# 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
[root@zookeeper01 ~]# tar zxf zookeeper-3.4.14.tar.gz -C /usr/local/
[root@zookeeper01 ~]# 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中
[root@zookeeper01 ~]# source /etc/profile

server0配置

[root@zookeeper01 ~]# mkdir -p /usr/local/zookeeper-3.4.14/{data,logs}
[root@zookeeper01 ~]# echo 0 > /usr/local/zookeeper-3.4.14/data/myid
[root@zookeeper01 ~]# cd /usr/local/zookeeper-3.4.14/conf/
[root@zookeeper01 conf]# cp zoo_sample.cfg zoo.cfg
[root@zookeeper01 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.171.134:2288:3388
server.1=192.168.171.135:2288:3388
server.2=192.168.171.140:2288:3388
[root@zookeeper01 conf]# zkServer.sh start          # 啓動實例
[root@zookeeper01 conf]# netstat -anput | grep java     # 確定端口在監聽
tcp6       0      0 :::43542                :::*                    LISTEN      40355/java          
tcp6       0      0 192.168.171.134:3388    :::*                    LISTEN      40355/java          
tcp6       0      0 :::2181                 :::*                    LISTEN      40355/java        

server1配置

[root@zookeeper02 ~]# mkdir -p /usr/local/zookeeper-3.4.14/{data,logs}
[root@zookeeper02 ~]# echo 1 > /usr/local/zookeeper-3.4.14/data/myid
[root@zookeeper02 ~]# cd /usr/local/zookeeper-3.4.14/conf/
[root@zookeeper02 conf]# scp [email protected]:/usr/local/zookeeper-3.4.14/conf/zoo.cfg ./
[root@zookeeper02 conf]# zkServer.sh start
[root@zookeeper02 conf]# netstat -anput | grep java  
tcp6       0      0 192.168.171.135:3388    :::*                    LISTEN      40608/java          
tcp6       0      0 :::2181                 :::*                    LISTEN      40608/java 

server2配置

[root@zookeeper03 ~]# mkdir -p /usr/local/zookeeper-3.4.14/{data,logs}
[root@zookeeper03 ~]# echo 2 > /usr/local/zookeeper-3.4.14/data/myid
[root@zookeeper03 ~]# cd /usr/local/zookeeper-3.4.14/conf/
[root@zookeeper03 conf]# scp [email protected]:/usr/local/zookeeper-3.4.14/conf/zoo.cfg ./
[root@zookeeper03 conf]# zkServer.sh start
[root@zookeeper03 conf]# netstat -anput | grep java
tcp6       0      0 192.168.171.140:3388    :::*                    LISTEN      12769/java          
tcp6       0      0 :::2181                 :::*                    LISTEN      12769/java   

查看各zk節點的狀態

[root@zookeeper01 /]# zkServer.sh status 
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper-3.4.14/bin/../conf/zoo.cfg
Mode: follower
[root@zookeeper02 /]# zkServer.sh status           # 02服務器爲leader
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper-3.4.14/bin/../conf/zoo.cfg
Mode: leader
[root@zookeeper03 /]# zkServer.sh status 
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper-3.4.14/bin/../conf/zoo.cfg
Mode: follower
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章