kafka是一個分布式環境下的訊息組件,如果kafka的應用進程被殺或者kafka的機器宕機,那麼kafka訊息組件就無法使用了。
kafka叢集(cluster)
一台機器不夠,那就多搞幾台,首先,啟動zookeeper這個就不多說了.可以參看前文,在啟動kafka的時候,我們在單機類比啟動多個kafka應用.
首先在config目錄,copy兩個server.properties 檔案,這裡我複製三份,分別起名server1.properties ,server2.properties server3.properties
然後修改這三個設定檔,主要修改broker.id=2,port=9094,log.dir=/tmp/kafka-logs-2這三個值,broker.id是用來標記分布式環境中的broker的,要求唯一,port和log.dir一個連接埠,一個log目錄,如果在真實的分布式環境中是不需要修改.這裡單機類比防止連接埠衝突.
分別把broker.id改為1,2,3,log.dir則分別改成kafka-logs-1,kafka-logs-2,kafka-logs-3,然後依次啟動
kafka-server-start.bat ../../config/server1.properties
kafka-server-start.bat ../../config/server2.properties
kafka-server-start.bat ../../config/server3.properties
如果你啟動有報錯,一個就是之前說的那個vm參數太大,另一個可能是你的連接埠沒改好.具體錯誤看下報錯就好了.
然後我們註冊一個topic,叫做replicationtest
kafka-topics.bat --create --zookeeper localhost:2181 --replication-factor 3 --partitions 1 --topic replicationtest
這裡冗餘是3,分區是1,那麼最終各個broker都會保留一份,最多允許N-1,也就是2台broker宕機,服務照樣運行.
註冊之後,這時候
kafka-topics.bat--describe --zookeeper localhost:2181 --topic replicationtest
執行描述命令,看下叢集情況
叢集描述結果
第一行給出了分區的匯總資訊。每個分區行給出分區資訊。
“Leader” 節點是2.
“Replicas” 資訊,在節點2,3,1上,所有的節點資訊.
“Isr” 工作中的複製節點的集合. 也就是活的節點的集合.
其他的就不用解釋了.這裡選出了2是leader,也就是說2這個節點會給消費者提供服務.
然後我們測試一條資訊.
kafka-console-producer.bat --broker-list localhost:7777,localhost:8888,localhost:9999 --topic replicationtest
上面的7777是server1.properties 中設定的.根據個人情況.改改.然後在控制台發發訊息.
然後消費一下.
kafka-console-consumer.bat --zookeeper localhost:2181 --topic replicationtest
這裡的2181是zookeeper的連接埠,不用改.
目前運行結果
然後.我們開始關掉一個broker,在3的控制台裡CTRL,C.然後是否終止操作,輸入Y.
再發一條訊息
broker3宕機
一切正常.我們看一下叢集資訊
broker3宕機叢集
發現Isr中存活的機器少了3.因為3掛了.
然後我們關掉broker2.這時候,會觸發新的leader選舉.期望值1變成leader,再發一條訊息
broker2宕機
可以看到生產者發訊息過程中,產生了異常,因為和2的串連斷開了.但是注意,訊息並沒有丟,因為觸發了新的選舉.可以看到,消費者還是接到了正常的訊息.叢集情況如下
broker2宕機叢集
至此,kafka的broker叢集測試完畢,那麼剩下的問題來了.消費者啟動的時候串連的是zookeeper的地址,如果這台zookeeper掛了呢.
那麼我們需要zookeeper叢集部署.
zookeeper叢集
這就包括兩部分.
是broker本來要能知道這些zookeeper叢集的地址,當一個宕機的時候,才會切換到另一個zookeeper
消費者要知道這些zookeeper的地址,理由同上.
因此步驟如下.可以自己試一試,比較簡單
複製3份zookeeper.properties檔案,命名為 zookeeper1.properties,zookeeper2.properties,zookeeper3.properties,修改檔案中的 dataDir=/tmp/zookeeper和,clientPort=2181,連接埠分別設定為2181,2182,2183.然後啟動三個 zookeeper
修改kafka啟動配置,server1.properties三個檔案中的zookeeper.connect=localhost:2181 這個配置,逗號隔開.最終為 zookeeper.connect=localhost:2181,localhost:2182,localhost:2183,然後啟動
生產者也改下配置中的.metadata.broker.list=localhost:9092,如果使用命令列啟動就不用改了.參數指定也可以.
消費者同理,可以改下設定檔中zookeeper.connect=127.0.0.1:2181,也可以命令列啟動的時候修改.
5.最終就是各種宕機測試了.