zookeeper集群搭建
kafka是把狀態(tài)保存在zookeeper中的旺罢,首先要搭建zookeeper集群碧绞。盡管kafka本身自帶了zookeeper许蓖,但最好不要使用自帶的zookeeper罪塔。參考這兩個(gè)教程: 教程一(三臺虛擬機(jī)),教程二(兩臺虛擬機(jī))隅忿。
1.軟件環(huán)境
我用了三臺虛擬機(jī)作為服務(wù)器心剥,虛擬機(jī)裝的是CentOS7 64位:
- 192.168.172.10
- 192.168.172.11
- 192.168.172.12
-
Linux服務(wù)器。使用數(shù)量為一臺背桐,三臺优烧,五臺,(2*n+1)链峭。zookeeper集群的工作是超過半數(shù)才能對外提供服務(wù)畦娄,三臺中超過兩臺超過半數(shù),允許一臺掛掉弊仪。最好不要使用偶數(shù)臺熙卡。
例如:如果有4臺,那么掛掉一臺還剩下三臺励饵,如果再掛掉一臺就不能行了驳癌,因?yàn)槭且^半數(shù)。
Java jdk1.8. 因?yàn)閦ookeeper是用Java寫的役听,所以他需要Java環(huán)境颓鲜,CentOS 7默認(rèn)安裝了jdk,所以此處不在安裝禾嫉。
zookeeper3.4.11版。
2.配置與安裝zookeeper蚊丐。
下面的操作是三臺虛擬機(jī)都要做的熙参,并且除了特別指出的,其他部分三臺虛擬機(jī)所做的配置操作是完全相同的
2.1安裝Java
CentOS7自帶jdk麦备,此處無需安裝孽椰。
2.2下載zookeeper
首先要注意的是在生產(chǎn)環(huán)境中目錄結(jié)構(gòu)要定義好昭娩,防止在項(xiàng)目過多的時(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后,通過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ī)則。我們以在第一臺虛擬機(jī)上的操作為例(上面的操作都是在第一臺虛擬機(jī)上升薯,你需要在每臺虛擬機(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就是你所操作的三臺虛擬機(jī)的IP地址涎劈,每臺虛擬機(jī)的zoo.cfg中都需要填入這三個(gè)地址广凸。第一個(gè)端口是master和slave之間的通信端口,默認(rèn)是2888蛛枚,第二個(gè)端口是leader選舉的端口谅海,集群剛啟動的時(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ù)字, 表示這個(gè)是第幾號服務(wù)器坤候,用來標(biāo)識服務(wù)器胁赢,這個(gè)標(biāo)識要寫到快照目錄下面myid文件里
創(chuàng)建myid文件。以現(xiàn)在所在的第一臺虛擬機(jī)192.168.172.10為例白筹,對應(yīng)server.1智末,通過上邊的配置信息可以查到。創(chuàng)建myid文件的目的是為了讓zookeeper知道自己在哪臺服務(wù)器上徒河,例如現(xiàn)在所在的虛擬機(jī)是192.168.172.10系馆,它對應(yīng)的id是1,那么就在myid文件中寫入1.
echo "1" > /opt/zookeeper/zkdata/myid
另外兩臺虛擬機(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 啟動zookeeper
進(jìn)入到zookeeper的bin目錄下
cd /opt/zookeeper/zookeeper-3.4.11/bin/
// 啟動服務(wù) (注意!三臺虛擬機(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.重要配置說明(待補(bǔ)充)
- myid文件和server.myid 在快照目錄下存放的標(biāo)識本臺服務(wù)器的文件代兵,他是整個(gè)zk集群用來發(fā)現(xiàn)彼此的一個(gè)重要標(biāo)識尼酿。
- zoo.cfg配置文件。zoo.cfg文件是zookeeper配置文件植影,在conf目錄里裳擎。
// tickTime:
這個(gè)時(shí)間是作為 Zookeeper 服務(wù)器之間或客戶端與服務(wù)器之間維持心跳的時(shí)間間隔,也就是每個(gè) tickTime 時(shí)間就會發(fā)送一個(gè)心跳思币。
// initLimit:
這個(gè)配置項(xiàng)是用來配置 Zookeeper 接受客戶端(這里所說的客戶端不是用戶連接 Zookeeper 服務(wù)器的客戶端鹿响,而是 Zookeeper 服務(wù)器集群中連接到 Leader 的 Follower 服務(wù)器)初始化連接時(shí)最長能忍受多少個(gè)心跳時(shí)間間隔數(shù)羡微。當(dāng)已經(jīng)超過 5個(gè)心跳的時(shí)間(也就是 tickTime)長度后 Zookeeper 服務(wù)器還沒有收到客戶端的返回信息,那么表明這個(gè)客戶端連接失敗惶我÷杈螅總的時(shí)間長度就是 52000=10 秒
// syncLimit:
這個(gè)配置項(xiàng)標(biāo)識 Leader 與Follower 之間發(fā)送消息,請求和應(yīng)答時(shí)間長度绸贡,最長不能超過多少個(gè) tickTime 的時(shí)間長度盯蝴,總的時(shí)間長度就是52000=10秒
// dataDir:
快照日志的存儲路徑
// dataLogDir:
事物日志的存儲路徑,如果不配置這個(gè)那么事物日志會默認(rèn)存儲到dataDir制定的目錄恃轩,這樣會嚴(yán)重影響zk的性能结洼,當(dāng)zk吞吐量較大的時(shí)候,產(chǎn)生的事物日志叉跛、快照日志太多
// clientPort:
這個(gè)端口就是客戶端連接 Zookeeper 服務(wù)器的端口松忍,Zookeeper 會監(jiān)聽這個(gè)端口,接受客戶端的訪問請求筷厘。修改他的端口改大點(diǎn)
4.遇到的錯(cuò)誤
在搭建完成后鸣峭,三個(gè)虛擬機(jī)都出現(xiàn)了錯(cuò)誤。有兩個(gè)問題酥艳。
4.1 節(jié)點(diǎn)無法運(yùn)行
在用./zkServer.sh start
命令運(yùn)行zookeeper后摊溶,zookeeper節(jié)點(diǎn)顯示正常啟動,但是用zkServer.sh status
命令查看zookeeper節(jié)點(diǎn)的狀態(tài)時(shí)充石,發(fā)現(xiàn)并沒有正常運(yùn)行莫换,出現(xiàn):
Error contacting service. It is probably not running.
我試著重新./zkServer.sh start
,卻無法啟動骤铃,顯示:
already running as process 11854
對于這個(gè)問題拉岁,網(wǎng)上有很多答案,試了一遍:
- zoo.cfg配置文件中指定目錄卻沒有創(chuàng)建惰爬! 創(chuàng)建相應(yīng)目錄即可喊暖。
//我的目錄配置沒有問題 - zoo.cfg中dataDir指定路徑為Myid文件的路徑。Myid內(nèi)容與:
server.?=192.168.172.10:12888:13888
中所設(shè)置撕瞧?
是否一致陵叽?
//我的設(shè)置是一致的! - 使用
service iptables stop
關(guān)閉防火墻.
//這個(gè)確實(shí)沒關(guān)丛版,但用的命令不是service iptables stop
巩掺,而是:
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall開機(jī)啟動
關(guān)閉后確實(shí)起作用了,但是第二天重新啟動時(shí)页畦,剛開始運(yùn)行還沒問題胖替,到中午吃完飯回來就又出現(xiàn)了,所以應(yīng)該不是防火墻的問題:
Error contacting service. It is probably not running.
- 打開zkServer.sh 找到
status)
STAT=echo stat | nc localhost $(grep clientPort "$ZOOCFG" | sed -e 's/.*=//') 2> /dev/null| grep Mode
在nc
與localhost
之間加上 -q 1
(是數(shù)字1
而不是字母l
).如果已存在則去掉。
// 但是我的zkServer.sh中沒有這一行。
- 12181端口被占用
使用netstat -anp | grep 12181
查看刊殉,確實(shí)發(fā)現(xiàn)有程序占用這個(gè)端口,但是kill掉以后還是不能啟動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
也就是說虛擬機(jī)3所在的zookeeper節(jié)點(diǎn)是leader瓢颅,然后再開啟虛擬機(jī)2和虛擬機(jī)1,就沒問題了弛说。但是不知道為什么虛擬機(jī)3默認(rèn)為leader挽懦,可能我之前在哪里配置過我不記得了(可能性不大),也可能跟zookeeper選舉leader的機(jī)制有關(guān)系木人,這個(gè)需要深入了解信柿。
成功運(yùn)行后,三臺虛擬機(jī)醒第,一臺是leader渔嚷,另外兩臺是follower。
4.2 每個(gè)節(jié)點(diǎn)都是standalone的
這個(gè)問題是由于zoo.cfg文件中的server
寫錯(cuò)了稠曼,寫成了servers
形病。所以server
寫錯(cuò)可能導(dǎo)致zookeeper運(yùn)行在單機(jī)模式下。