Kafka:如何保障发送时数据不丢失

1. 需要设置几个关键的参数,如下:

unclean.leader.election.enable=false

  • 在哪里设置:(broker / topic)
  • 默认值:true(在 Kafka 0.11.0.0 中默认值已更改为 false
  • 有效值:[true, false]

min.insync.replicas=副本数-1

  • 在哪里设置:(broker / topic)
  • 默认值:1
  • 有效值:[1, …]

acks=all

  • 在哪里设置:producer
  • 默认值:1
  • 有效值:[all, -1, 0, 1]

必须设置以上所有参数,这样在调用 get() 返回发送结果时,无异常则可认为消息已成功写入 Kafka,无丢失。

producer.send(new ProducerRecord(topic, key, value)).get();

2. 解释

我们首先考虑在使用上述参数默认值的情况下,消息为什么会丢失。
- unclean.leader.election.enable=true
- min.insync.replicas=1
- acks=1

设置 1 表示当该分区所有副本代理都下线的情况下,Kafka 会选第一个上线的代理作为 leader,而不管它下线之前是不是在 ISR1 中,那么如果这个新 leader 下线之前并不是 leader 或者不在 ISR 中,有一部分消息便丢失了。
设置 2 和 设置 3 共同作用。即生产时,只要 leader 确认消息已收到,即认为该消息已成功写入 Kafka。因为需要 leader 确认同时满足最小同步副本数为 1 的设置。

如果我们把设置 3 更改为acks=all,消息仍然有可能丢失。
一方面是设置 1 的影响,另一方面,更改后的设置 3 要求生产时,需要得到该分区所有在线副本代理的确认,这里重点是只要在线,如果该分区当时只有 leader 在线,也满足设置 2,那么就会认为消息已成功写入 Kafka。

所以我们需要在上一步的基础上把设置 1 禁用,设置 2 更改为min.insync.replicas=副本数-1,这样便达到了消息发送成功的最强保障。
禁用设置 1 ,Kafka 会在该分区所有副本代理都下线的情况下,从 ISR 中选择第一个上线的代理作为 leader。
更改后的设置 2 和设置 3 共同作用,要求生产时,需要得到该分区所有在线副本代理的确认,并且确认数要大于等于(副本数-1),这样就保证了每次生产,有绝大多数副本代理确认收到消息后才认为消息已成功写入 Kafka。这样如果在非常情况下进行 leader 选举,Kafka 既能很快恢复,也保障了数据不丢失。

参考:
http://kafka.apache.org/0102/documentation.html#design_uncleanleader
http://kafka.apache.org/0102/documentation.html#design_ha


  1. 已同步的副本集。即该分区当前活着并且已跟上 leader 的副本们。
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值