Kafka - 故障排除.NotEnoughReplicasException

Nag*_*Nag 2 apache-kafka confluent-platform

我开始看到以下错误

[2020-06-12 20:09:01,324] ERROR [ReplicaManager broker=3] Error processing append operation on partition __consumer_offsets-10 (kafka.server.ReplicaManager)
org.apache.kafka.common.errors.NotEnoughReplicasException: The size of the current ISR Set(3) is insufficient to satisfy the min.isr requirement of 2 for partition __consumer_offsets-10    
Run Code Online (Sandbox Code Playgroud)

我的设置是拥有三个经纪人,并且所有经纪人都已上线。在出现此错误之前我做了几件事

我在所有代理中将 min.isr 配置为 2。我创建了一个复制因子为 3 的主题,并开始从 ack = 1 且两个代理关闭的生产者生成消息。我召集了所有经纪人并开始消费。

  1. 如何解决此错误
  2. 消费者也无法看到此消息(不知道为什么,该消息应该被视为“已提交”,因为当生产者运行时一个代理已启动)

几个事实

有趣的是,WRT 首选的领导者战略并未发生重新平衡

$ kafka-topics --zookeeper 127.0.0.1:2181 --topic stock-prices --describe                             
  Topic: stock-prices     PartitionCount: 3       ReplicationFactor: 3    Configs: min.insync.replicas=2
  Topic: stock-prices     Partition: 0    Leader: 1       Replicas: 1,3,2 Isr: 1,2,3            
  Topic: stock-prices     Partition: 1    Leader: 1       Replicas: 2,1,3 Isr: 1,2,3            
  Topic: stock-prices     Partition: 2    Leader: 1       Replicas: 3,2,1 Isr: 1,2,3
Run Code Online (Sandbox Code Playgroud)

Thi*_*ruG 7

这是你的问题:

您已设置min.insync.replicas=2,这意味着您需要至少两个启动并运行的代理才能将消息发布到主题。如果您辜负了 2 名经纪人,那么您就只剩下一名经纪人了。这意味着您的insync.replica要求没有得到满足。

这与消费者无关,因为这是关于经纪人的。当您设置时acks=1,这意味着当消息发布到一个代理时,您的生产者会得到确认。(它不会确认所有副本均已创建)。

所以问题是,当单个代理(领导者)收到消息时,您的生产者会确认已收到消息。但领导者无法放置副本,因为没有任何代理进行同步。

完成此操作的一种方法是设置acks=all,这样在所有副本完成之前,您的生产者不会得到确认。它将重试,直到至少 2 个同步副本在线。