在 Ubuntu 上部署 Kafka 时“丢消息”,通常不是 Kafka 本身一定会丢,而是配置或使用方式导致消息未被可靠写入/消费。下面按常见原因分类说明,并给出对应解决方案。
acks=0 或 acks=1acks=0:生产者发完就当成功,网络问题直接丢acks=1:只等 Leader 写入就返回,Leader 宕机可能丢✅ 推荐配置:
acks=all
并确保:
min.insync.replicas=2
网络抖动、Leader 切换会导致发送失败。
✅ 推荐:
retries=Integer.MAX_VALUE
retry.backoff.ms=100
并使用:
enable.idempotence=true
producer.send(record); // 不关心结果
如果发送失败你不知道。
✅ 正确方式:
producer.send(record, (metadata, exception) -> {
if (exception != null) {
// 处理失败
}
});
unclean.leader.election.enable=true允许非 ISR 副本成为 Leader,会丢消息。
✅ 必须关闭:
unclean.leader.election.enable=false
default.replication.factor=1
只有 1 个副本,磁盘坏就丢。
✅ 建议:
default.replication.factor=3
min.insync.replicas=2
log.flush.* 配置过松Kafka 依赖 OS page cache,一般没问题,但:
可能丢未刷盘数据。
✅ 可选增强:
log.flush.interval.messages=10000
log.flush.interval.ms=1000
enable.auto.commit=true
auto.commit.interval.ms=5000
消费到但还没处理完就提交,宕机就丢。
✅ 推荐:
enable.auto.commit=false
处理完再:
consumer.commitSync();
while (true) {
consumer.poll();
// 抛异常,消息没处理
}
✅ 加 try-catch + 重试 / 死信队列
log.retention.hours=1
消息被清理。
✅ 根据业务调整:
log.retention.hours=168
max.message.bytes直接被拒。
检查:
df -h
iostat -x 1
如果你愿意,可以贴出:
我可以帮你精确定位是哪一层丢的。