實(shí)際上 spring cloud 的消息總線用的是 kafka,但是 kafka 依賴(lài) zookeeper 進(jìn)行集群,所以先寫(xiě)怎么配置 zookeeper,這里用的版本是 3.4.9。
zookeeper 單實(shí)例不用多說(shuō),默認(rèn)配置就能跑,這里直接上集群,集群也分真?zhèn)危热鐔螜C(jī)多實(shí)例就是一個(gè)偽集群,這是現(xiàn)在的實(shí)驗(yàn)環(huán)境。
目錄結(jié)構(gòu)如下:
kafka-HA
|--- kafka-node0
| |--- config ( kafka 根目錄的 config 文件夾復(fù)制過(guò)來(lái) )
| |--- log ( kafka 配置指定的 log 文件夾 )
| |--- zk ( zookeeper 根目錄 )
| |--- zk-data ( zookeeper 的 dataDir 文件夾 )
| |--- zk-log ( zookeeper 的 log 文件夾 )
|
|--- kafka-node1
| |--- 同上
|
more node...
其中 config 文件夾是這樣的,真的是 kafka 的 config 復(fù)制過(guò)來(lái),騙你是小狗:
開(kāi)胃菜吃完了,來(lái)點(diǎn)面包。
config 目錄下有份 zookeeper.properties ,這正是 zk 的配置,主要配置只有幾項(xiàng),下面列一列:
- dataDir --> 指定 zk 的數(shù)據(jù)存放目錄
- dataLogDir --> 指定 zk 的 log 目錄
- clientPort --> 指定 zk 的端口號(hào)
重點(diǎn)來(lái)了,小兵一般都沖前鋒,比如前三個(gè)配置,不過(guò)沒(méi)了小兵,大將也不叫大將,比如如果少了 dataDir,那就等著報(bào)錯(cuò)吧。
- tickTime --> 這是 zk 的默認(rèn)時(shí)間單元,默認(rèn)兩毫秒,后面說(shuō) N 個(gè)單位時(shí)間就是 ( tickTime * N ) 毫秒
- initLimit --> 告訴 leader 在 initLimit 個(gè)時(shí)間單元內(nèi),如果 follower 還在躺尸就等于歇菜了
- syncLimit ---> 告訴 leader 跟 follower 發(fā)消息的時(shí)候,如果請(qǐng)求&響應(yīng)超過(guò) syncLimit 個(gè)時(shí)間單元就等于歇菜了
- server.A = ip:B:C ---> A 是一個(gè)數(shù)字,代表第幾號(hào)服務(wù)器,就當(dāng) id 用好了,不能重復(fù);ip 是對(duì)應(yīng)第 A 號(hào)服務(wù)器的 ip;B 是在集群中 leader 和 follower 交流信息的端口號(hào);C 是用來(lái)選舉的端口號(hào)( 風(fēng)水輪流轉(zhuǎn),leader 也可能歇菜,who know? )
納尼?no picture you say a jb?! 小弟不才,下面給大家看看:
這里看到圖里是用 zk-node0 之類(lèi)的 hostname ,一切為了方( bu )便( luo ),別忘了改 hosts 文件,同時(shí)在偽集群的時(shí)候,記得端口不要相同。
接下來(lái)要在 dataDir 指定的目錄下加一份名為 myid 的文件,不用帶后綴,文件內(nèi)容寫(xiě)對(duì)應(yīng)服務(wù)器的 id( 就是配置里面 server.A 的那個(gè) A ),如果你是 *nix 系統(tǒng),直接 echo 0 >> YOUR DATADIR/myid
( 比如有一個(gè)第 0 號(hào)的 zk ),記得每個(gè) zk 都要這么做,最后上個(gè)圖:
不知不覺(jué),連正餐都吃完了,最后來(lái)份甜品。
在上述目錄中,zk 文件夾里面必須包含 zk 源文件( 就是說(shuō)不能是軟連接,硬的也不行 ),因?yàn)?zk 在運(yùn)行時(shí)會(huì)在 zkServer 的上一級(jí)目錄創(chuàng)建 pid 文件,如果是僅僅是連接,實(shí)際上你操作的是同一個(gè)文件夾,而多個(gè) zk 實(shí)例會(huì)相互覆蓋 pid,后果你懂的,我想這也是為什么 zookeeper 安裝時(shí)沒(méi)有把 zkServer 這種啟動(dòng)腳本復(fù)制到 /usr/bin 的原因 。( 逼逼那么多,反正把 zk 的源文件復(fù)制一份過(guò)來(lái)就行了 )
like this:
小杜,是時(shí)候了!
跑到每一個(gè) zk/bin 下執(zhí)行 zkServer start YOUR CONFIG PATH
就行了,這個(gè) path 一定要用絕對(duì)路徑,因?yàn)?zkServer 腳本比較神奇,相對(duì)路徑99.999%會(huì)找不到你給的文件,結(jié)果要么用了默認(rèn)的 zoo.properties 要么就直接拋錯(cuò)罷工( 沒(méi)有找到任何配置文件的情況下 ),可惜我又不會(huì) bash 的語(yǔ)法,不然一番改改改。
比如 zkServer start /Users/finally/deveEnv/kafka-HA/kafka-node0/config/zookeeper.properties
運(yùn)行 zk。
想看有沒(méi)有跑起來(lái)?zkServer status YOUR CONFIG PATH
幫到你,跑起來(lái)的話(huà)你會(huì)看到如下信息:
這里的 Mode 是說(shuō)明這個(gè) zk 實(shí)例的身份,這里是 follower。
zookeeper 到這里,就完成部署了。