【Zookeeper】基于3臺(tái)linux虛擬機(jī)搭建zookeeper集群
環(huán)境和版本說明
環(huán)境說明:
操作系統(tǒng):Win11 2023 22H2
CPU:13代 i6
內(nèi)存:64G
虛擬機(jī):VM Tool 17
CenterOs版本:7.9
鏡像:CentOS-7-x86_64-Minimal-2009_2.iso
Zookeeper 版本:3.5.10
1. 進(jìn)入官方下載CenterOs 7.9
官網(wǎng)地址:https://www.centos.org/download/
這里還是建議有條件的用用魔法啥的。
根據(jù)個(gè)人環(huán)境選擇 x86_64。


個(gè)人比較推薦 163 和 阿里云的鏡像:
http://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/
http://mirrors.163.com/centos/7.9.2009/isos/x86_64/
點(diǎn)擊之后耐心等待下載即可。
2. 安裝 Vmware 17
嗯哼,個(gè)人用的是綠化版,怕作者網(wǎng)站被爆這里就不提供鏈接和操作說明了。
3. 在Vmware 17上安裝CenterOs 7.9
個(gè)人建議安裝好一臺(tái)之后,利用拷貝虛擬機(jī)的方式復(fù)制三份系統(tǒng),并且在文件管理中用目錄區(qū)分,方便換電腦或者遷移的時(shí)候可以快速恢復(fù)使用。
比如下面?zhèn)€人的簡單劃分方式。

新建虛擬機(jī)


這里個(gè)人選擇“稍后安裝操作系統(tǒng)”,也可以直接架在程序光盤映象文件。



個(gè)人筆記本電腦配置尚可,這里給了雙核。

內(nèi)存分配個(gè)1G即可,也可以酌情按需增加。

這里選擇NAT,如果不嫌IP變化麻煩,可以是用“橋接網(wǎng)絡(luò)”。


后面一直下一步即可,直到出現(xiàn)下面的畫面。磁盤大小可以按照需要進(jìn)行分配。

按照完全自定義的方式安裝,此時(shí)需要自己手動(dòng)指定一下操作系統(tǒng)的鏡像文件位置:

安裝CenterOs 7.9
啟動(dòng)虛擬機(jī),看到如下界面之后選擇第一個(gè)。

耐心等待安裝程序引導(dǎo)。選擇語言,這里建議選擇英文,順帶鍛煉下英文水平:

進(jìn)入下一步之后,通常需要確認(rèn)一下操作系統(tǒng)安裝到哪一塊磁盤上面。

不熟悉Linux的分區(qū)設(shè)置直接使用官方默認(rèn)的配置即可(如果要手動(dòng)設(shè)置分區(qū)可以選擇下面的“I will configure partitioning”)。

接著手動(dòng)設(shè)置一下網(wǎng)卡,這里記得開啟一下開關(guān),否則安裝之后無法自動(dòng)聯(lián)網(wǎng)(需要手動(dòng)調(diào)整一下網(wǎng)卡開關(guān))。
CenterOs 系統(tǒng)一般都是用于服務(wù)器使用,大多數(shù)情況下都是靜態(tài)IP,所以默認(rèn)是不開啟網(wǎng)卡的。


由于是最小化安裝,自己可以干的事情有限,這里我們直接下一步即可。
之后是設(shè)置root密碼和構(gòu)建自定義用戶,如果用戶密碼強(qiáng)度過低點(diǎn)擊“Done”可能會(huì)沒有任何反應(yīng),但是可以通過兩次點(diǎn)擊“Done”給強(qiáng)制通過。
這里放一下個(gè)人的操作root密碼是經(jīng)典的root。
另外新建一個(gè)偽root用戶,用于自己登陸操作(不建議養(yǎng)成root登陸的習(xí)慣)。
如果想要自定用戶具備sudo權(quán)限,需要勾選“Make this user administrator”。
設(shè)置之后點(diǎn)擊右下角即可。耐心等待片刻。
重啟,CenterOs7安裝完成。
安裝虛擬機(jī)之后的操作
具體參考這篇文章:[【Linux】拿到一臺(tái)虛擬機(jī)Linux該干什么?]
偽 root 測試
如果是具備sudo權(quán)限的普通用戶,通常能流暢執(zhí)行下面的指令。
sudo?yum?install?-y?vim
4. 設(shè)置靜態(tài)IP
設(shè)置靜態(tài)IP之前這里先介紹一下個(gè)人網(wǎng)絡(luò)情況。
菜單->編輯->虛擬網(wǎng)絡(luò)編輯器,記錄并修改IP網(wǎng)段和網(wǎng)關(guān)地址,或者直接用默認(rèn)生成的配置:
網(wǎng)關(guān)IP如下,這里需要記憶一下這個(gè)IP,等下會(huì)使用上:
這里的IP為:192.168.154.2。
設(shè)置虛擬機(jī)IP和網(wǎng)關(guān)
根據(jù)前面的截圖,這里總結(jié)下個(gè)人的配置。
子網(wǎng)IP:
192.168.154.0
子網(wǎng)掩碼:
255.255.255.0
網(wǎng)關(guān) IP:
192.168.154.2
修改虛擬機(jī)網(wǎng)卡配置
打開虛擬機(jī)
在終端打開網(wǎng)卡配置文件并修改,非管理員需要加sudo。
vi /etc/sysconfig/network-scripts/ifcfg-ens33
,將BOOTPROTO字段修改為static,如果ONBOOT字段為no,則將其修改為yes(開機(jī)自啟)。添加具體的IP地址如 192.168.154.128、子網(wǎng)掩碼、網(wǎng)關(guān)、以及常用的DNS。其中IP網(wǎng)段,子網(wǎng)掩碼,網(wǎng)關(guān)為上一步中提到的IP。
大部分情況下默認(rèn)給的網(wǎng)卡都是 ens33。
vi?/etc/sysconfig/network-scripts/ifcfg-ens33
首先把 BOOTPROTO 的值進(jìn)行修改。
BOOTPROTO=static
在網(wǎng)卡配置中進(jìn)行修改。
IPADDR=192.168.154.128
ETMASK=255.255.255.0
GATEWAY=192.168.154.2
DNS1=8.8.8.8
DNS2=114.114.114.114
設(shè)置完成之后重啟。
systemctl?restart?network
最后使用命令ip addr
檢查。
個(gè)人配置
最后個(gè)人三臺(tái)機(jī)器的配置如下:
第一臺(tái)機(jī)器7911
BOOTPROTO=static
IPADDR=192.168.154.128
ETMASK=255.255.255.0
GATEWAY=192.168.154.2
DNS1=8.8.8.8
DNS2=114.114.114.114
第二臺(tái)機(jī)器7912
BOOTPROTO=static
IPADDR=192.168.154.131
ETMASK=255.255.255.0
GATEWAY=192.168.154.2
DNS1=8.8.8.8
DNS2=114.114.114.114
第三臺(tái)機(jī)器7913
BOOTPROTO=static
IPADDR=192.168.154.130
ETMASK=255.255.255.0
GATEWAY=192.168.154.2
DNS1=8.8.8.8
DNS2=114.114.114.114
5. 檢查NetManager的狀態(tài)
systemctl?status?NetworkManager.service
結(jié)果:
[xander@localhost?~]$?systemctl?status?NetworkManager.service
●?NetworkManager.service?-?Network?Manager
???Loaded:?loaded?(/usr/lib/systemd/system/NetworkManager.service;?enabled;?vendor?preset:?enabled)
???Active:?active?(running)?since?Sun?2023-06-18?22:18:57?EDT;?2?days?ago
?????Docs:?man:NetworkManager(8)
?Main?PID:?686?(NetworkManager)
???CGroup:?/system.slice/NetworkManager.service
???????????└─686?/usr/sbin/NetworkManager?--no-daemon
6. 檢查NetManager管理的網(wǎng)絡(luò)接口
nmcli?dev?status
運(yùn)行結(jié)果如下:
[xander@localhost?~]$?nmcli?dev?status
DEVICE??TYPE??????STATE??????CONNECTION?
ens33???ethernet??connected??ens33??????
lo??????loopback??unmanaged??--??
7. 檢查NetManager管理的網(wǎng)絡(luò)連接
nmcli?connection?show
[xander@localhost?~]$?nmcli?connection?show
NAME???UUID??????????????????????????????????TYPE??????DEVICE?
ens33??b749bcf8-eeeb-446f-bb42-30a333da7328??ethernet??ens33
8. 設(shè)置dns
nmcli?con?mod?ens33?ipv4.dns?"114.114.114.114?8.8.8.8"
9. 讓dns配置生效
nmcli?con?up?ens33
[root@localhost?xander]#?nmcli?con?up?ens33
Connection?successfully?activated?(D-Bus?active?path:?/org/freedesktop/NetworkManager/ActiveConnection/4)
10. 配置host
查看主機(jī)名稱
查看主機(jī)名的命令如下:
hostname
hosts 文件的格式如下:
[root@localhost?xander]#?vi?/etc/hosts
1
127.0.0.1???localhost?localhost.localdomain?localhost4?localhost4.localdomain4
::1?????????localhost?localhost.localdomain?localhost6?localhost6.localdomain6IP地址? 主機(jī)名/域名? 主機(jī)名別名
第一部份:網(wǎng)絡(luò) IP 地址
第二部份:主機(jī)名或域名
第三部份:主機(jī)名別名
根據(jù)自己的需要修改host即可。
默認(rèn)情況如下:
[root@localhost?xander]#?hostname
localhost.localdomain
為了方便三臺(tái)虛擬機(jī)快速進(jìn)行通信,這里用同一份主機(jī)解析配置。
192.168.154.128?zknode1
192.168.154.131?zknode2
192.168.154.130?zknode3
配置完成之后,建議在三臺(tái)主機(jī)上都嘗試一下能否正常ping通過:
PING?zknode1?(192.168.154.128)?56(84)?bytes?of?data.
64?bytes?from?zknode1?(192.168.154.128):?icmp_seq=1?ttl=64?time=0.009?ms
64?bytes?from?zknode1?(192.168.154.128):?icmp_seq=2?ttl=64?time=0.048?ms
^C
---?zknode1?ping?statistics?---
2?packets?transmitted,?2?received,?0%?packet?loss,?time?1001ms
rtt?min/avg/max/mdev?=?0.009/0.028/0.048/0.020?ms
[root@localhost?conf]#?ping?zknode2
PING?zknode2?(192.168.154.131)?56(84)?bytes?of?data.
64?bytes?from?zknode2?(192.168.154.131):?icmp_seq=1?ttl=64?time=0.968?ms
64?bytes?from?zknode2?(192.168.154.131):?icmp_seq=2?ttl=64?time=0.250?ms
^C
---?zknode2?ping?statistics?---
2?packets?transmitted,?2?received,?0%?packet?loss,?time?1001ms
rtt?min/avg/max/mdev?=?0.250/0.609/0.968/0.359?ms
[root@localhost?conf]#?ping?zknode3
ping:?zknode3:?Name?or?service?not?known
#?這里發(fā)現(xiàn)敲錯(cuò)了又回去改了一遍
[root@localhost?conf]#?ping?zknode3
PING?zknode3?(192.168.154.130)?56(84)?bytes?of?data.
64?bytes?from?zknode3?(192.168.154.130):?icmp_seq=1?ttl=64?time=1.67?ms
64?bytes?from?zknode3?(192.168.154.130):?icmp_seq=2?ttl=64?time=0.185?ms
^C
---?zknode3?ping?statistics?---
11. 關(guān)閉防火墻
systemctl?disable?firewalld
12. 配置 yum
三臺(tái)機(jī)器執(zhí)行下面的命令即可。
yum?clean?all
yum?makecache
yum?install?-y?wget
13. 安裝 JDK 8
進(jìn)入官網(wǎng):Java Archive Downloads - Java SE 8 (oracle.com)
下載之后需要把文件傳輸?shù)絃inux服務(wù)器,傳輸之后在服務(wù)器執(zhí)行下面的指令:
[root@localhost?xander]#?ls
jdk1.8.0_202??jdk-8u202-linux-x64.tar.gz?[root@localhost?xander]#?tar?-zxvf?jdk-8u202-linux-x64.tar.gz
解壓后把文件放到指定位置,個(gè)人放到了 /opt
的文件目錄下。
vim?/etc/bashrc
在這個(gè)文件的末尾添加下面的內(nèi)容:
#?Java_Home?改為自己對應(yīng)的目錄即可。
export?JAVA_HOME=/opt/jdk1.8.0_202
export?JRE_HOME=${JAVA_HOME}/jre?
export?CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib?
export?PATH=${JAVA_HOME}/bin:$PATH
修改之后source
一下讓配置修改生效。
source?/etc/bashrc
接著運(yùn)行javac
、java
、java -version
這些明命令即可。
[root@localhost?jdk1.8.0_202]#?java?-version
java?version?"1.8.0_202"
Java(TM)?SE?Runtime?Environment?(build?1.8.0_202-b08)
Java?HotSpot(TM)?64-Bit?Server?VM?(build?25.202-b08,?mixed?mode)
14. 安裝配置 Zookeeper
構(gòu)建相關(guān)存儲(chǔ)目錄
為了方便管理,首先需要構(gòu)建目錄存儲(chǔ)Zookeeper。
mkdir?-p?/opt/zookeeper/zk3.5.10
mkdir?-p?/opt/zookeeper/zk3.5.10/dataDir
mkdir?-p?/opt/zookeeper/zk3.5.10/dataLogDir
去官網(wǎng)下載Zookeeper,考慮到后續(xù)實(shí)戰(zhàn)使用Curator 4.3.0 版本,所以Zk這里選擇的版本為 zk3.5.10。
官網(wǎng)地址:Apache ZooKeeper
注意下載是帶bin的包,不帶Bin為源碼包。
下載安裝包之后,把 tar 包遷移到對應(yīng)的位置。
[root@localhost?xander]#?mv?apache-zookeeper-3.5.10-bin.tar.gz?/opt/zookeeper/zk3.5.10/
接著我們需要修改ZK的配置文件。
[root@localhost?conf]#?pwd
/opt/zookeeper/zk3.5.10/zk3510/conf
[root@localhost?conf]#?mv?zoo_sample.cfg?zoo.cfg
修改 zoo.cfg
配置,在末尾添加下面的內(nèi)容。
#######################cluster##########################
server.1=zknode1:2888:3888
server.2=zknode2:2888:3888
server.3=zknode3:2888:3888

這里補(bǔ)充解釋一下這個(gè)配置的含義。
server.1=zknode1:2888:3888
我們可以把他看作是四個(gè)部分:
server.1 的 1 含義:配置的myid,相當(dāng)于一個(gè)身份標(biāo)示。(意思就是說第一臺(tái)機(jī)器叫1號)。
zknode1 含義:主機(jī)地址,由于之前我們在hosts文件中做了配置,所以可以直接用自定義的“域名”替換。
第一個(gè) 2888:Leader與Follower通信的端口號。
第二個(gè) 3888:Leader服務(wù)器掛了,用于選舉的通信端口號。
然后我們修改數(shù)據(jù)文件目錄的存放位置,如果有必要可以添加添加dataLogDir存儲(chǔ)位置:
#?the?directory?where?the?snapshot?is?stored.
#?do?not?use?/tmp?for?storage,?/tmp?here?is?just?
#?example?sakes.
dataDir=/opt/zookeeper/zk3.5.10/dataDir
dataLogDir=/opt/zookeeper/zk3.5.10/dataLogDir

配置之后我們啟動(dòng)測試一下:
[root@localhost?bin]#?./zkServer.sh?start
ZooKeeper?JMX?enabled?by?default
Using?config:?/opt/zookeeper/zk3.5.10/zk3510/bin/../conf/zoo.cfg
Starting?zookeeper?...?FAILED?TO?START
啟動(dòng)失敗不要慌,先觀察一下狀態(tài):
[root@localhost?bin]#?./zkServer.sh?status
ZooKeeper?JMX?enabled?by?default
Using?config:?/opt/zookeeper/zk3.5.10/zk3510/bin/../conf/zoo.cfg
Client?port?found:?2181.?Client?address:?localhost.?Client?SSL:?false.
Error?contacting?service.?It?is?probably?not?running.
接著根據(jù)日志排查原因:
[root@localhost?bin]#?cat?../logs/zookeeper-xander-server-localhost.localdomain.out?
2023-06-21?03:15:34,530?[myid:]?-?INFO??[main:QuorumPeerConfig@154]?-?Reading?configuration?from:?/opt/zookeeper/zk3.5.10/zk3510/bin/../conf/zoo.cfg
2023-06-21?03:15:34,535?[myid:]?-?INFO??[main:QuorumPeerConfig@414]?-?clientPortAddress?is?0.0.0.0:2181
2023-06-21?03:15:34,535?[myid:]?-?INFO??[main:QuorumPeerConfig@418]?-?secureClientPort?is?not?set
2023-06-21?03:15:34,538?[myid:]?-?ERROR?[main:QuorumPeerMain@90]?-?Invalid?config,?exiting?abnormally
org.apache.zookeeper.server.quorum.QuorumPeerConfig$ConfigException:?Address?unresolved:?zknode1:3888?
?at?org.apache.zookeeper.server.quorum.QuorumPeer$QuorumServer.<init>(QuorumPeer.java:264)
?at?org.apache.zookeeper.server.quorum.flexible.QuorumMaj.<init>(QuorumMaj.java:89)
?at?org.apache.zookeeper.server.quorum.QuorumPeerConfig.createQuorumVerifier(QuorumPeerConfig.java:625)
?at?org.apache.zookeeper.server.quorum.QuorumPeerConfig.parseDynamicConfig(QuorumPeerConfig.java:658)
?at?org.apache.zookeeper.server.quorum.QuorumPeerConfig.setupQuorumPeerConfig(QuorumPeerConfig.java:631)
?at?org.apache.zookeeper.server.quorum.QuorumPeerConfig.parseProperties(QuorumPeerConfig.java:449)
?at?org.apache.zookeeper.server.quorum.QuorumPeerConfig.parse(QuorumPeerConfig.java:171)
?at?org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:114)
?at?org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:83)
這樣的報(bào)錯(cuò)是zoo.cfg
上的配置可能存在空格等內(nèi)容,ZK對于配置的校驗(yàn)非常嚴(yán)格,有時(shí)候拷貝配置會(huì)多拷貝空格的情況,為了快速查找空格等情況,我們通過顯示隱藏字符的方式排查。
在vim打開文件之后,使用冒號進(jìn)入到命令模式,然后敲入下面的內(nèi)容:
:set?list

我們把zoo.cfg
的多余空格刪除之后,重新嘗試啟動(dòng)發(fā)現(xiàn)還是報(bào)錯(cuò)。
Caused?by:?java.lang.IllegalArgumentException:?myid?file?is?missing
myid 配置
上面的報(bào)錯(cuò)意味著我們需要在 dataDir 中構(gòu)建對應(yīng)的 myid 以及對應(yīng)的id文件。
echo?"1"?>?/opt/zookeeper/zk3.5.10/dataDir/myid
為什么要弄個(gè)這樣奇怪的文件,只能說照做就行了,這個(gè)配置是讓ZK知道當(dāng)前所處的集群使用哪一份配置。此外需要注意切換到其他的服務(wù)器需要修改這個(gè)echo "1"
的值。
也可以直接修改 myid 中的標(biāo)識(shí)
比如個(gè)人的 xxxx.131
是第二臺(tái)機(jī)器,這里的命令就需要用:
echo?"2"?>?/opt/zookeeper/zk3.5.10/dataDir/myid
個(gè)人的xxxx.130
是第三臺(tái)機(jī)器,命令如下:
echo?"3"?>?/opt/zookeeper/zk3.5.10/dataDir/myid
吐槽一下這個(gè)設(shè)計(jì)不是很好理解
通過上面的處理之后我們再次嘗試啟動(dòng)。
[root@localhost?bin]#?./zkServer.sh?start
ZooKeeper?JMX?enabled?by?default
Using?config:?/opt/zookeeper/zk3.5.10/zk3510/bin/../conf/zoo.cfg
Starting?zookeeper?...?STARTED
日志上看是啟動(dòng)成功了,我們看下日志打印情況。

其他機(jī)器同步
我們目前有三臺(tái)服務(wù)器,但是只啟動(dòng)了一臺(tái),根據(jù)集群規(guī)則,zookeeper集群還沒有達(dá)到半數(shù)服務(wù)器運(yùn)行,集群無法正常運(yùn)行。
接下來就是一些重復(fù)性勞動(dòng),我們需要在其他幾臺(tái)機(jī)器執(zhí)行上面提到的配置JDK和ZK的配置操作。
這里個(gè)人用了比較笨的方法,那就是把相關(guān)JDK和ZK的目錄文件夾等全部拷貝到其他機(jī)器,這樣需要自己操作的配置項(xiàng)是最少的。
也可以去網(wǎng)上找些sync的腳本,在機(jī)器很多的時(shí)候很有必要,3臺(tái)的工作量還不是很大。

15. 觀察集群信息
7912(IP為131) 第二臺(tái)機(jī)器被選擇為 Leader。

7911(IP為128) 第一臺(tái)服務(wù)器變?yōu)?Follow。

剩下最后一臺(tái)當(dāng)然也是 Follow。
當(dāng)然我們也可以利用zkServer.sh status
這樣的命令查看每個(gè)節(jié)點(diǎn)當(dāng)前運(yùn)行狀態(tài)。
[root@localhost?bin]#?./zkServer.sh?status
ZooKeeper?JMX?enabled?by?default
Using?config:?/opt/zookeeper/zk3.5.10/zk3510/bin/../conf/zoo.cfg
Client?port?found:?2181.?Client?address:?localhost.?Client?SSL:?false.
Mode:?follower[root@zknode2?zk3510]#?./bin/zkServer.sh?status
ZooKeeper?JMX?enabled?by?default
Using?config:?/opt/zookeeper/zk3.5.10/zk3510/bin/../conf/zoo.cfg
Client?port?found:?2181.?Client?address:?localhost.?Client?SSL:?false.
Mode:?leader
如果出現(xiàn)上面的信息,說明你的集群已經(jīng)搭建成功了。
個(gè)人Zookeeper集群配置備份
本著最簡單原則,這里提供本文個(gè)人實(shí)驗(yàn)導(dǎo)出的Java和ZK配置文件夾。你只需要把兩個(gè)文件夾放到/opt
就可以快速檢索本文的配置復(fù)制粘貼即可,唯一麻煩的地方可能是myid的配置需要自己修改。
鏈接:https://pan.baidu.com/s/1TevDoAPbP8zvQFxNVMNecQ?pwd=44ew 提取碼:44ew
寫在最后
這一套配置個(gè)人最后在另一臺(tái)電腦按照步驟操作之后集群很快搭建了。
問題匯總
解決啟動(dòng)zookeeper時(shí)Could not find or Load main class org.apache.zookeeper.server.quorum.QuorumPeerMain的報(bào)錯(cuò)
apache-zookeeper-3.6.1.tar.gz這個(gè)壓縮包,這個(gè)壓縮包都是zookeeper的源碼,并不是經(jīng)過編譯后的包,所以啟動(dòng)時(shí)肯定會(huì)失敗。解決辦法只需要使用Bin包重新處理即可。
推薦閱讀
zookeeper入門到精通03——zookeeper集群搭建-騰訊云開發(fā)者社區(qū)-騰訊云 (tencent.com)
oozoo