-------------------------------------------------------------------
| 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、如果不指定容器的網絡模式,會導致容器之間無法進行通信。