领导变革的卡夫卡经纪人消息丢失情景

时间:2017-06-16 19:00:14

标签: apache-kafka apache-zookeeper messaging offset

我试图理解Kafka中消息丢失的以下行为。简而言之,当经纪人在某些消息处理之后及之后死亡时,所有其他经纪人都会死亡。如果首先死亡的经纪人启动,那么它们出现后就无法赶上其他经纪人。相反,所有其他代理报告错误并重置其偏移量以匹配第一个代理。是否期望这种行为以及确保零消息丢失的更改/设置是什么?

Kafka版本:2.11-0.10.2.0

可重复的步骤

  • 启动了1个zookeeper实例和3个kafka经纪人
  • 创建了一个复制因子为3且分区为3
  • 的主题
  • 将kafka-console-consumer附加到主题
  • 使用Kafka-console-producer生成2条消息
  • 杀死两名经纪人(1& 2)
  • 发送了两条消息
  • 杀死最后剩下的经纪人(0)
  • 培养未见过最后两条消息的经纪人(1)
  • 调出看过最后两条消息的经纪人(2)并显示错误
[2017-06-16 14:45:20,239] INFO Truncating log my-second-topic-1 to offset 1. (ka
fka.log.Log)
[2017-06-16 14:45:20,253] ERROR [ReplicaFetcherThread-0-1], Current offset 2 for
 partition [my-second-topic,1] out of range; reset offset to 1 (kafka.server.Rep
licaFetcherThread)
  • 最后连接kafka-console-consumer,它会看到两条消息,而不是发布的四条消息。

2 个答案:

答案 0 :(得分:3)

检查unclean.leader.election.enable = true,如果是,请将其设置为false,以便只有insync的副本才能成为领导者。如果允许不同步副本成为领导者,则消息可能会被截断并丢失。

答案 1 :(得分:2)

此处回复:https://kafka.apache.org/documentation/#producerconfigs

  

在考虑完成请求之前,生产者要求领导者收到的确认数量。这可以控制发送记录的持久性。允许以下设置:

     
      
  • acks = 0如果设置为零,那么生产者将不会等待来自服务器的任何确认。该记录将立即添加到套接字缓冲区并视为已发送。在这种情况下,不能保证服务器已经接收到记录,并且重试配置将不会生效(因为客户端通常不知道任何故障)。为每条记录返回的偏移量始终设置为-1。
  •   
  • acks = 1这意味着领导者会将记录写入其本地日志,但无需等待所有粉丝的完全确认即可做出回应。在这种情况下,如果领导者在确认记录后立即失败,但在关注者复制之前,记录将会丢失。
  •   
  • acks = all这意味着领导者将等待完整的同步副本集以确认记录。这保证了只要至少一个同步副本仍然存活,记录就不会丢失。这是最强有力的保证。这相当于acks = -1 setting。
  •   

默认情况下,acks = 1,因此将其设置为' all' : 您的producer.properties文件中的acks=all