一、背景

     在使用 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 無法讀取消息的問題。希望這篇文檔能幫助遇到類似問題的開發者快速定位並解決問題