温馨提示×

ubuntu kafka配置为何丢消息

小樊
33
2026-09-14 17:33:36
栏目: 智能运维

在 Ubuntu 上部署 Kafka 时“丢消息”,通常不是 Kafka 本身一定会丢,而是配置或使用方式导致消息未被可靠写入/消费。下面按常见原因分类说明,并给出对应解决方案。


一、Producer 端配置导致丢消息(最常见)

1. acks=0acks=1

  • acks=0:生产者发完就当成功,网络问题直接丢
  • acks=1:只等 Leader 写入就返回,Leader 宕机可能丢

✅ 推荐配置:

acks=all

并确保:

min.insync.replicas=2

2. 未启用重试

网络抖动、Leader 切换会导致发送失败。

✅ 推荐:

retries=Integer.MAX_VALUE
retry.backoff.ms=100

并使用:

enable.idempotence=true

3. 异步发送未处理 callback

producer.send(record); // 不关心结果

如果发送失败你不知道。

✅ 正确方式:

producer.send(record, (metadata, exception) -> {
    if (exception != null) {
        // 处理失败
    }
});

二、Broker 端配置问题

1. unclean.leader.election.enable=true

允许非 ISR 副本成为 Leader,会丢消息

✅ 必须关闭:

unclean.leader.election.enable=false

2. 副本数不足

default.replication.factor=1

只有 1 个副本,磁盘坏就丢。

✅ 建议:

default.replication.factor=3
min.insync.replicas=2

3. 磁盘或系统问题(Ubuntu 特有)

  • 使用了 tmpfs / 云盘缓存未刷盘
  • log.flush.* 配置过松

Kafka 依赖 OS page cache,一般没问题,但:

  • 突然断电
  • 云服务器强制停止

可能丢未刷盘数据。

✅ 可选增强:

log.flush.interval.messages=10000
log.flush.interval.ms=1000

三、Consumer 端“假丢消息”

1. 自动提交 offset 太早

enable.auto.commit=true
auto.commit.interval.ms=5000

消费到但还没处理完就提交,宕机就丢。

✅ 推荐:

enable.auto.commit=false

处理完再:

consumer.commitSync();

2. 消费逻辑异常未处理

while (true) {
    consumer.poll();
    // 抛异常,消息没处理
}

✅ 加 try-catch + 重试 / 死信队列


四、Topic / 分区问题

1. Topic 被删除或 retention 太短

log.retention.hours=1

消息被清理。

✅ 根据业务调整:

log.retention.hours=168

2. 消息超过 max.message.bytes

直接被拒。


五、Ubuntu 环境常见坑

  • 防火墙 / 安全组:导致 Producer 以为成功
  • hostname 配置错误:Leader 切换异常
  • Zookeeper / KRaft 不稳定
  • 磁盘 IO 爆满

检查:

df -h
iostat -x 1

六、快速自检清单 ✅

  • [ ] acks=all
  • [ ] min.insync.replicas ≥ 2
  • [ ] enable.auto.commit=false
  • [ ] unclean.leader.election.enable=false
  • [ ] replication.factor ≥ 3
  • [ ] Producer 有 callback / 重试
  • [ ] Consumer 处理完再 commit

如果你愿意,可以贴出:

  • Kafka 版本
  • producer / consumer 配置
  • 日志片段

我可以帮你精确定位是哪一层丢的

0