docker kafka集羣搭建

-------------------------------------------------------------------

|       kafka集羣的搭建:

|       1.   問題

|        2.  過程

-------------------------------------------------------------------

問題1:

仔細檢查發現是,ip地址寫錯了,因爲命令是從網上覆制下來,然後進行修改的,修改的過程中可能是手誤寫錯了。

  ERROR Fatal error during KafkaServer startup. Prepare to shutdown (kafka.server.KafkaServer)
kafka.zookeeper.ZooKeeperClientTimeoutException: Timed out waiting for connection while in state: CONNECTING
        at kafka.zookeeper.ZooKeeperClient.$anonfun$waitUntilConnected$3(ZooKeeperClient.scala:259)
        at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)
        at kafka.utils.CoreUtils$.inLock(CoreUtils.scala:253)
        at kafka.zookeeper.ZooKeeperClient.waitUntilConnected(ZooKeeperClient.scala:255)
        at kafka.zookeeper.ZooKeeperClient.<init>(ZooKeeperClient.scala:113)
        at kafka.zk.KafkaZkClient$.apply(KafkaZkClient.scala:1858)
        at kafka.server.KafkaServer.createZkClient$1(KafkaServer.scala:375)
        at kafka.server.KafkaServer.initZkClient(KafkaServer.scala:399)
        at kafka.server.KafkaServer.startup(KafkaServer.scala:207)
        at kafka.server.KafkaServerStartable.startup(KafkaServerStartable.scala:44)
        at kafka.Kafka$.main(Kafka.scala:84)
        at kafka.Kafka.main(Kafka.scala)

出現這個問題導致kafka容器在啓動之後,無法連接到zookeeper集羣,導致連接超時自動停止。

docker run -i -t -d --network host --name wurstmeister-kafka -p 9092:9092 -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=192.168.44.100:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.44.100:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 wurstmeister/kafka 

仔細檢查,發現是ip地址寫錯了,修改後的情況是: 

docker run -i -t -d --network host --name wurstmeister-kafka -p 9092:9092 -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=192.168.232.100:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.232.100:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 wurstmeister/kafka

問題2:

WARNING: Published ports are discarded when using host network mode

因爲同時指定了,docker容器的網絡模式,又指定了 -p 的參數,導致衝突。容器在創建成功後,同樣是自動關閉。

將 -p 參數去掉,或者使用brige橋接模式。

問題3:

 ERROR Error while creating ephemeral at /brokers/ids/0, node already exists and owner '4840915402754' does not match current session '4840915402755' (kafka.zk.KafkaZkClient$CheckedEphemeral)

 ERROR [KafkaServer id=0] Fatal error during KafkaServer startup. Prepare to shutdown (kafka.server.KafkaServer)

org.apache.zookeeper.KeeperException$NodeExistsException: KeeperErrorCode = NodeExists

修改創建容器的時候-e KAFKA_BROKER_ID=0  參數0修改爲其他的值

問題4:

 ERROR [KafkaServer id=2] Fatal error during KafkaServer startup. Prepare to shutdown (kafka.server.KafkaServer)
java.lang.IllegalArgumentException: requirement failed: Configured end points 192.168.232.100:9092 in advertised listeners are already registered by broker 0

說的是192.168.232.100:9092 這臺機器已經有 broker 0 註冊,並且正在監聽

-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.232.102:9092

修改該參數的 ip地址 爲集羣中的其他服務器的 IP地址

+++++++++++++++++++++++++++++++++++++++++++++++++

過程

1. 環境:

zookeeper服務器的搭建(https://blog.csdn.net/yang_zzu/article/details/105618204)搭建kafka實在zookeeper集羣的基礎上進行的,使用的內容基本上一致,不過這邊搭建的時候沒有寫腳本進行簡單的搭建。過程稍微有點麻煩。

在創建kafka 集羣的時候發現,我的防火牆一直是關閉的,但是kafka容器創建成功了,(一般情況下,防火牆關閉容器是無法創建成功,在給容器分配ip地址的時候是需要防火牆進行分配的。)這個我在後面驗證了一下是什麼原因。(沒有找到,只是進行了猜想),有興趣的話本頁面,搜索(猜想)

2. 虛擬機3臺:

192.168.232.100,192.168.232.101,192.168.232.102(使用靜態的ip地址)

3. 拉取鏡像: 

docker pull wurstmeister/kafka

(在網上查找資料發現,不用非得使用wurstmeister/zookeeper,這個zookeeper鏡像,我兩個都下載了,發現wurstmeister/zookeeper鏡像要比 zookeeper大很多,目前搭建kafka集羣是沒有發現連個鏡像有什麼區別,在網上查找資料也沒有明確的說明)

4. 推送鏡像:(將鏡像推送到其他服務器,要比再下載一次快很多)

docker save -o kafka.tar wurstmeister/kafka   (打包鏡像)

scp kafka.tar [email protected]:~  (推送鏡像)(示範,這個是推送到101機器的root用戶根目錄下)

docker load -i kafka.tar  (導入鏡像)(在 root用戶的根目錄下進行操作)

5. 創建容器:

docker run -i -t -d --network host --name wurstmeister-kafka -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=192.168.232.100:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.232.100:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 wurstmeister/kafka
docker run -i -t -d --network host --name wurstmeister-kafka -e KAFKA_BROKER_ID=1 -e KAFKA_ZOOKEEPER_CONNECT=192.168.232.100:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.232.101:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 wurstmeister/kafka
docker run -i -t -d --network host --name wurstmeister-kafka -e KAFKA_BROKER_ID=2 -e KAFKA_ZOOKEEPER_CONNECT=192.168.232.100:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.232.102:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 wurstmeister/kafka

 保證KAFKA_BROKER_ID=0 ,broker的值都不一樣

KAFKA_ZOOKEEPER_CONNECT=192.168.232.100:2181,ip地址是集羣中任意一個ip就行,端口2181根據自己集羣的設置內容進行配置

 監聽的地址KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.232.100:9092,ip地址是集羣中任意一個就行,端口9092根據實際情況進行配置。

測試:

在kafka容器裏面運行命令: 使用 find / -name *.sh 查看腳本在哪個文件夾,在文件內才能執行

生產:
kafka-console-producer.sh --broker-list 192.168.232.100:9092 --topic firstTopic

查詢上傳的數據
kafka-console-consumer.sh --bootstrap-server 192.168.232.100:9092 --topic firstTopic --from-beginning

查看集羣中所有的topic
kafka-topics.sh --bootstrap-server 192.168.232.100:9092 --list

查看topic狀態
kafka-topics.sh --bootstrap-server 192.168.232.100:9092 --describe --topic firstTopic

查看group 列表
kafka-consumer-groups.sh --bootstrap-server 192.168.232.100:9092 --list

查看消費group 的消費記錄
kafka-consumer-groups.sh --bootstrap-server 192.168.232.100:9092 --describe --group firstGroup


-- 對topic的操作,必須使用的是 --zookeeper

修改topic的partion個數
kafka-topics.sh --zookeeper 192.168.232.100:2181 -alter --topic firstTopic --partition 6

刪除topic
kafka-topics.sh --zookeeper 192.168.232.100:2181 --delete --topic firstTopic

手動創建,studentTopic,擁有兩個備份,6個分區
kafka-topics.sh --zookeeper 192.168.232.100:2181 --create --replication-factor 2 --partition 6 --topic studentTopic

從101,102向topic 發送數據,在100成功監聽到數據,可以正常使用

++++++++++++++++++++++++++++++++++++++++++++++++++++++

猜想:

首先懷疑的是 --network host 設置的網絡方式,

容器起來之後,馬上停止了

查看容器的詳細信息,發現沒有分配ip地址 

查看  wurstmeister-kafka 日誌   docker logs wurstmeister-kafka 

 ERROR Fatal error during KafkaServer startup. Prepare to shutdown (kafka.server.KafkaServer)
kafka.zookeeper.ZooKeeperClientTimeoutException: Timed out waiting for connection while in state: CONNECTING

發現是連接zookeeper 超時,導致,kakfa容器自動停止運行,

1、可能是kakfa在創建的時候不需要分配 ip 地址,

2、如果不指定容器的網絡模式,會導致容器之間無法進行通信。

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章