一、背景
在使用 Kafka 4.x 版本(KRaft 模式)時,我們遇到了一個令人困惑的問題:雖然 Producer 發送消息沒有報錯,但使用 `kafka-console-consumer.sh` 和 `--group` 參數時,Consumer 卻無法讀取任何消息。本文將詳細描述該問題的現象、分析原因,並提供完整的解決方案。
二、問題現象
1. Producer 成功發送消息
執行以下命令發送一條消息:
echo "hello kafka" | /opt/kafka4/bin/kafka-console-producer.sh --topic test-topic --bootstrap-server 10.0.81.53:29092
Producer 端沒有任何錯誤輸出,看起來消息已成功發送。
2. Consumer 無法讀取消息
嘗試使用 kafka-console-consumer.sh 讀取消息:
timeout 5s /opt/kafka4/bin/kafka-console-consumer.sh \
--bootstrap-server 10.0.81.53:29092 \
--topic test-topic \
--group temp-group-verify-$(date +%s) \
--from-beginning \
--max-messages 1
輸出結果為:
Processed a total of 0 messages
3. Topic 狀態正常
檢查 test-topic 的狀態:
/opt/kafka4/bin/kafka-topics.sh --describe --topic test-topic --bootstrap-server 10.0.81.53:29092
結果顯示 Leader 和 ISR 均正常:
Topic: test-topic PartitionCount: 1 ReplicationFactor: 1 Configs: segment.bytes=1073741824
Topic: test-topic Partition: 0 Leader: 1 Replicas: 1 Isr: 1
三、分析與解決
1. 驗證消息是否真正寫入
首先,我們需要確認消息是否真的寫入到了 Kafka 中。通過查看磁盤上的日誌文件:
ls -lh /data/kafka4/test-topic-0/*.log
發現日誌文件大小為 70 字節,表明有數據寫入。
接着使用 kafka-dump-log.sh 工具驗證日誌內容:
/opt/kafka4/bin/kafka-dump-log.sh --files /data/kafka4/test-topic-0/00000000000000000000.log --print-data-log
輸出顯示確實有四條消息存在。
2. 使用更可靠的生產者工具
為了進一步驗證,使用 kafka-producer-perf-test.sh 發送消息:
/opt/kafka4/bin/kafka-producer-perf-test.sh --topic test-topic --num-records 1 --record-size 5 --throughput 1 --producer-props bootstrap.servers=10.0.81.53:29092 acks=all
成功發送一條消息,但消費者仍然無法讀取。
3. 手動創建 __consumer_offsets 主題
由於 Kafka 在 KRaft 模式下不會自動創建 __consumer_offsets 主題,手動創建它:
/opt/kafka4/bin/kafka-topics.sh --create \
--topic __consumer_offsets \
--partitions 50 \
--replication-factor 1 \
--bootstrap-server 10.0.81.53:29092 \
--config compression.type=uncompressed \
--config cleanup.policy=compact
4. 再次啓動消費者並驗證
重新啓動消費者:
/opt/kafka4/bin/kafka-console-consumer.sh \
--bootstrap-server 10.0.81.53:29092 \
--topic test-topic \
--group final-test-group \
--from-beginning &
sleep 5
kill %1
這次消費者成功讀取了所有消息,並且 __consumer_offsets 主題也已創建。
四、最終配置建議
為了確保 Kafka 正常運行,建議在 server.properties 文件中添加以下配置:
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
default.replication.factor=1
auto.create.topics.enable=true
然後重啓 Kafka 服務。
五、結論
通過手動創建 __consumer_offsets 主題並調整 Kafka 配置,成功解決了 KRaft 模式下 Consumer 無法讀取消息的問題。希望這篇文檔能幫助遇到類似問題的開發者快速定位並解決問題