多臺(tái)虛擬機(jī)搭建zookeeper集群

zookeeper集群搭建

kafka是把狀態(tài)保存在zookeeper中的,首先要搭建zookeeper集群。盡管kafka本身自帶了zookeeper,但最好不要使用自帶的zookeeper。參考這兩個(gè)教程: 教程一(三臺(tái)虛擬機(jī))教程二(兩臺(tái)虛擬機(jī))。

1.軟件環(huán)境

我用了三臺(tái)虛擬機(jī)作為服務(wù)器,虛擬機(jī)裝的是CentOS7 64位:

  • 192.168.172.10
  • 192.168.172.11
  • 192.168.172.12
  1. Linux服務(wù)器。使用數(shù)量為一臺(tái),三臺(tái),五臺(tái),(2*n+1)。zookeeper集群的工作是超過(guò)半數(shù)才能對(duì)外提供服務(wù),三臺(tái)中超過(guò)兩臺(tái)超過(guò)半數(shù),允許一臺(tái)掛掉。最好不要使用偶數(shù)臺(tái)。

    例如:如果有4臺(tái),那么掛掉一臺(tái)還剩下三臺(tái),如果再掛掉一臺(tái)就不能行了,因?yàn)槭且^(guò)半數(shù)。

  2. Java jdk1.8. 因?yàn)閦ookeeper是用Java寫的,所以他需要Java環(huán)境,CentOS 7默認(rèn)安裝了jdk,所以此處不在安裝。

  3. zookeeper3.4.11版。

2.配置與安裝zookeeper。

下面的操作是三臺(tái)虛擬機(jī)都要做的,并且除了特別指出的,其他部分三臺(tái)虛擬機(jī)所做的配置操作是完全相同的

2.1安裝Java

CentOS7自帶jdk,此處無(wú)需安裝。

2.2下載zookeeper

首先要注意的是在生產(chǎn)環(huán)境中目錄結(jié)構(gòu)要定義好,防止在項(xiàng)目過(guò)多的時(shí)候找不到所需的項(xiàng)目。 我把目錄統(tǒng)一放在/opt下面,該目錄一般存放主機(jī)額外安裝的軟件。

// 首先創(chuàng)建zookeeper項(xiàng)目目錄
mkdir zookeeper // 項(xiàng)目目錄
cd zookeeper // 進(jìn)入項(xiàng)目目錄
mkdir zkdata // 存放快照日志
mkdir zkdatalog // 存放事物日志

從官網(wǎng)下載最新的穩(wěn)定版zookeeper后,通過(guò)xshell的文件傳輸工具傳送到虛擬機(jī)中。我就放在了/opt/zookeeper項(xiàng)目文件下。

cd /opt/zookeeper // 進(jìn)入下載目錄
tar -zxvf zookeeper-3.4.11.tar.gz // 解壓文件

2.3 修改配置文件

進(jìn)入到解壓好的zookeeper的conf目錄中,查看:

//進(jìn)入conf目錄
cd /opt/zookeeper/zookeeper-3.4.11/conf
//查看
-rw-rw-r--. 1 1000 1000 535 Feb 20 2014 configuration.xsl
-rw-rw-r--. 1 1000 1000 2161 Feb 20 2014 log4j.properties
-rw-rw-r--. 1 1000 1000 922 Feb 20 2014 zoo_sample.cfg

zoo_sample.cfg這個(gè)文件是官方給我們的zookeeper的樣板文件。我們需要復(fù)制一份名為zoo.cfg的文件,zoo.cfg是zookeeper官方指定的文件命名規(guī)則。我們以在第一臺(tái)虛擬機(jī)上的操作為例(上面的操作都是在第一臺(tái)虛擬機(jī)上,你需要在每臺(tái)虛擬機(jī)上都執(zhí)行上述以及本次操作):

// 復(fù)制zoo.cfg文件
cp zoo_sample.cfg zoo.cfg
// 打開zoo.cfg文件,然后按后面的配置信息進(jìn)行配置
vim zoo.zfg

在zoo.cfg配置文件需要填入的信息。

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/zookeeper/zkdata
dataLogDir=/opt/zookeeper/zkdatalog
clientPort=12181
// 此處的IP就是你所操作的三臺(tái)虛擬機(jī)的IP地址,每臺(tái)虛擬機(jī)的zoo.cfg中都需要填入這三個(gè)地址。第一個(gè)端口是master和slave之間的通信端口,默認(rèn)是2888,第二個(gè)端口是leader選舉的端口,集群剛啟動(dòng)的時(shí)候選舉或者leader掛掉之后進(jìn)行新的選舉的端口默認(rèn)是3888
server.1=192.168.172.10:12888:13888
server.2=192.168.172.11:12888:13888
server.3=192.168.172.12:12888:13888
// server.1 這個(gè)1是服務(wù)器的標(biāo)識(shí)也可以是其他的數(shù)字, 表示這個(gè)是第幾號(hào)服務(wù)器,用來(lái)標(biāo)識(shí)服務(wù)器,這個(gè)標(biāo)識(shí)要寫到快照目錄下面myid文件里

創(chuàng)建myid文件。以現(xiàn)在所在的第一臺(tái)虛擬機(jī)192.168.172.10為例,對(duì)應(yīng)server.1,通過(guò)上邊的配置信息可以查到。創(chuàng)建myid文件的目的是為了讓zookeeper知道自己在哪臺(tái)服務(wù)器上,例如現(xiàn)在所在的虛擬機(jī)是192.168.172.10,它對(duì)應(yīng)的id是1,那么就在myid文件中寫入1.

echo "1" > /opt/zookeeper/zkdata/myid

另外兩臺(tái)虛擬機(jī)上也需要?jiǎng)?chuàng)建myid文件并寫入相應(yīng)的id,id根據(jù)zoo.cfg文件中的IP地址查詢。

echo "2" > /opt/zookeeper/zkdata/myid
echo "3" > /opt/zookeeper/zkdata/myid

2.4 啟動(dòng)zookeeper

進(jìn)入到zookeeper的bin目錄下

cd /opt/zookeeper/zookeeper-3.4.11/bin/
// 啟動(dòng)服務(wù) (注意!三臺(tái)虛擬機(jī)都要進(jìn)行該操作)
./zkServer.sh start
// 檢查服務(wù)器狀態(tài)
./zkServer.sh status
// 顯示如下
JMX enabled by default
Using config: /opt/zookeeper/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower #他是主節(jié)點(diǎn)leader還是從節(jié)點(diǎn)follower

3.重要配置說(shuō)明(待補(bǔ)充)

  1. myid文件和server.myid 在快照目錄下存放的標(biāo)識(shí)本臺(tái)服務(wù)器的文件,他是整個(gè)zk集群用來(lái)發(fā)現(xiàn)彼此的一個(gè)重要標(biāo)識(shí)。
  2. zoo.cfg配置文件。zoo.cfg文件是zookeeper配置文件,在conf目錄里。

// tickTime:
這個(gè)時(shí)間是作為 Zookeeper 服務(wù)器之間或客戶端與服務(wù)器之間維持心跳的時(shí)間間隔,也就是每個(gè) tickTime 時(shí)間就會(huì)發(fā)送一個(gè)心跳。
// initLimit:
這個(gè)配置項(xiàng)是用來(lái)配置 Zookeeper 接受客戶端(這里所說(shuō)的客戶端不是用戶連接 Zookeeper 服務(wù)器的客戶端,而是 Zookeeper 服務(wù)器集群中連接到 Leader 的 Follower 服務(wù)器)初始化連接時(shí)最長(zhǎng)能忍受多少個(gè)心跳時(shí)間間隔數(shù)。當(dāng)已經(jīng)超過(guò) 5個(gè)心跳的時(shí)間(也就是 tickTime)長(zhǎng)度后 Zookeeper 服務(wù)器還沒(méi)有收到客戶端的返回信息,那么表明這個(gè)客戶端連接失敗??偟臅r(shí)間長(zhǎng)度就是 52000=10 秒
// syncLimit:
這個(gè)配置項(xiàng)標(biāo)識(shí) Leader 與Follower 之間發(fā)送消息,請(qǐng)求和應(yīng)答時(shí)間長(zhǎng)度,最長(zhǎng)不能超過(guò)多少個(gè) tickTime 的時(shí)間長(zhǎng)度,總的時(shí)間長(zhǎng)度就是5
2000=10秒
// dataDir:
快照日志的存儲(chǔ)路徑
// dataLogDir:
事物日志的存儲(chǔ)路徑,如果不配置這個(gè)那么事物日志會(huì)默認(rèn)存儲(chǔ)到dataDir制定的目錄,這樣會(huì)嚴(yán)重影響zk的性能,當(dāng)zk吞吐量較大的時(shí)候,產(chǎn)生的事物日志、快照日志太多
// clientPort:
這個(gè)端口就是客戶端連接 Zookeeper 服務(wù)器的端口,Zookeeper 會(huì)監(jiān)聽這個(gè)端口,接受客戶端的訪問(wèn)請(qǐng)求。修改他的端口改大點(diǎn)

4.遇到的錯(cuò)誤

在搭建完成后,三個(gè)虛擬機(jī)都出現(xiàn)了錯(cuò)誤。有兩個(gè)問(wèn)題。

4.1 節(jié)點(diǎn)無(wú)法運(yùn)行

在用./zkServer.sh start命令運(yùn)行zookeeper后,zookeeper節(jié)點(diǎn)顯示正常啟動(dòng),但是用zkServer.sh status命令查看zookeeper節(jié)點(diǎn)的狀態(tài)時(shí),發(fā)現(xiàn)并沒(méi)有正常運(yùn)行,出現(xiàn):

Error contacting service. It is probably not running.

我試著重新./zkServer.sh start,卻無(wú)法啟動(dòng),顯示:

already running as process 11854

對(duì)于這個(gè)問(wèn)題,網(wǎng)上有很多答案,試了一遍:

  1. zoo.cfg配置文件中指定目錄卻沒(méi)有創(chuàng)建! 創(chuàng)建相應(yīng)目錄即可。
    //我的目錄配置沒(méi)有問(wèn)題
  2. zoo.cfg中dataDir指定路徑為Myid文件的路徑。Myid內(nèi)容與:server.?=192.168.172.10:12888:13888 中所設(shè)置?是否一致?
    //我的設(shè)置是一致的!
  3. 使用service iptables stop 關(guān)閉防火墻.
    //這個(gè)確實(shí)沒(méi)關(guān),但用的命令不是service iptables stop,而是:

systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall開機(jī)啟動(dòng)

關(guān)閉后確實(shí)起作用了,但是第二天重新啟動(dòng)時(shí),剛開始運(yùn)行還沒(méi)問(wèn)題,到中午吃完飯回來(lái)就又出現(xiàn)了,所以應(yīng)該不是防火墻的問(wèn)題:

Error contacting service. It is probably not running.

  1. 打開zkServer.sh 找到

status)
STAT=echo stat | nc localhost $(grep clientPort "$ZOOCFG" | sed -e 's/.*=//') 2> /dev/null| grep Mode

nclocalhost之間加上 -q 1(是數(shù)字1而不是字母l).如果已存在則去掉。
// 但是我的zkServer.sh中沒(méi)有這一行。

  1. 12181端口被占用
    使用netstat -anp | grep 12181查看,確實(shí)發(fā)現(xiàn)有程序占用這個(gè)端口,但是kill掉以后還是不能啟動(dòng)zookeeper。

于是我不再管虛擬機(jī)1,又依次開啟虛擬機(jī)2 和虛擬機(jī)3,其中虛擬機(jī)2和虛擬機(jī)1一樣,都是:

Error contacting service. It is probably not running.

但是神奇的事情發(fā)生了,我開啟虛擬機(jī)3的時(shí)候,是成功的,值得注意的是這里顯示的zookeeper狀態(tài)時(shí)leader:

[root@localhost bin]# ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/zookeeper-3.4.11/bin/../conf/zoo.cfg
Mode: leader

也就是說(shuō)虛擬機(jī)3所在的zookeeper節(jié)點(diǎn)是leader,然后再開啟虛擬機(jī)2和虛擬機(jī)1,就沒(méi)問(wèn)題了。但是不知道為什么虛擬機(jī)3默認(rèn)為leader,可能我之前在哪里配置過(guò)我不記得了(可能性不大),也可能跟zookeeper選舉leader的機(jī)制有關(guān)系,這個(gè)需要深入了解。

成功運(yùn)行后,三臺(tái)虛擬機(jī),一臺(tái)是leader,另外兩臺(tái)是follower。

4.2 每個(gè)節(jié)點(diǎn)都是standalone的

這個(gè)問(wèn)題是由于zoo.cfg文件中的server寫錯(cuò)了,寫成了servers。所以server寫錯(cuò)可能導(dǎo)致zookeeper運(yùn)行在單機(jī)模式下。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容