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

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
  1. Linux服務(wù)器。使用數(shù)量為一臺背桐,三臺优烧,五臺,(2*n+1)链峭。zookeeper集群的工作是超過半數(shù)才能對外提供服務(wù)畦娄,三臺中超過兩臺超過半數(shù),允許一臺掛掉弊仪。最好不要使用偶數(shù)臺熙卡。

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

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

  3. 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ǔ)充)

  1. myid文件和server.myid 在快照目錄下存放的標(biāo)識本臺服務(wù)器的文件代兵,他是整個(gè)zk集群用來發(fā)現(xiàn)彼此的一個(gè)重要標(biāo)識尼酿。
  2. 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í)間長度就是5
2000=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)上有很多答案,試了一遍:

  1. zoo.cfg配置文件中指定目錄卻沒有創(chuàng)建惰爬! 創(chuàng)建相應(yīng)目錄即可喊暖。
    //我的目錄配置沒有問題
  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í)沒關(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.

  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中沒有這一行。

  1. 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ī)模式下。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末霞幅,一起剝皮案震驚了整個(gè)濱河市漠吻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蝗岖,老刑警劉巖侥猩,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異抵赢,居然都是意外死亡欺劳,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門铅鲤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來划提,“玉大人,你說我怎么就攤上這事邢享∨敉” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵骇塘,是天一觀的道長伊履。 經(jīng)常有香客問我韩容,道長,這世上最難降的妖魔是什么唐瀑? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任群凶,我火速辦了婚禮,結(jié)果婚禮上哄辣,老公的妹妹穿的比我還像新娘请梢。我一直安慰自己,他們只是感情好力穗,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布毅弧。 她就那樣靜靜地躺著,像睡著了一般当窗。 火紅的嫁衣襯著肌膚如雪够坐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天崖面,我揣著相機(jī)與錄音咆霜,去河邊找鬼。 笑死嘶朱,一個(gè)胖子當(dāng)著我的面吹牛蛾坯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播疏遏,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼脉课,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了财异?” 一聲冷哼從身側(cè)響起倘零,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎戳寸,沒想到半個(gè)月后呈驶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡疫鹊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年袖瞻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拆吆。...
    茶點(diǎn)故事閱讀 38,018評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡聋迎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出枣耀,到底是詐尸還是另有隱情霉晕,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站牺堰,受9級特大地震影響拄轻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜伟葫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一哺眯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧扒俯,春花似錦、人聲如沸一疯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽墩邀。三九已至掌猛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間眉睹,已是汗流浹背荔茬。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留竹海,地道東北人慕蔚。 一個(gè)月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像斋配,于是被迫代替她去往敵國和親孔飒。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容