2017-06-16 104 views
1

我想了解卡夫卡消息丢失的以下行为。简而言之,当一个经纪人很早就死去,随后在一些消息处理之后,所有其他经纪人都会死亡。如果首先死亡的经纪人开始上市,那么他们出现后就不会赶上其他经纪人。相反,所有其他经纪人都会报告错误并重置抵消额以匹配第一个经纪人。预期这种行为,以及确保零消息丢失的更改/设置是什么?卡夫卡经纪人对领导层变更的消息丢失情况

卡夫卡版本:2.11-0.10.2.0

重现步骤

  • 开始1个饲养员实例和3个卡夫卡经纪人
  • 创建一个话题的3复制因子和3
  • 分区附加卡夫卡控制台消费者专题
  • 使用的卡夫卡控制台生产者生产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

响应这里:https://kafka.apache.org/documentation/#producerconfigs

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

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

默认情况下的ACK = 1,以便将其设置为 '所有': acks=all在producer.properties文件

3

检查unclean.leader.election.enable =真,如果是这样,将其设置以使只有insync的复制品才能成为领导者。如果允许不同步复制品成为领导者,则消息可能会被截断并丢失。

相关问题