卡夫卡2.2.0中现有ISR的领导人选举失败

时间:2019-07-19 13:52:23

标签: apache-kafka

我有一个3节点的kafka-cluster(经纪人版本2.2.0),具有以下配置/部署详细信息:

  • 每个主题的分区数:我们的应用程序主题的3-4个分区。 __consumer_offsets个分区由Kafka自行确定-100个分区
  • ReplicationFactor:2(包括主题:__consumer_offsets主题)
  • 经纪人ID为:0, 12
  • 关闭某个节点时,相应的Zookeeper实例也会关闭。也就是说,部署更多是因为单个设备在每个设备上运行一对Kafka + ZK

我正在测试单节点中断行为,并且关闭了broker-id 0(以及对应的共置ZK实例)

我观察到的是: 在降低broker-id 0之前,下面是通过describe-topic CLI为主题__consumer_offsets检索的分布。行为也与我们的应用主题相同

enter image description here

降低broker-id 0后,相同分区的相同输出如下所示:

*enter image description here*

现在,主要关注的是Leader: -1"。 当ISR broker-id 2是有效的broker-id 2并且也是时,2, 5, 8是某些分区(例如上面的分区broker-id 2)的领导者,而0, 3, 6, 9存活,为什么分区-broker-id 2不选择broker-id 1作为这些分区的领导者?

我试图查找是否存在双重故障-即。多个经纪人同时下跌。但是,在20, 3, 6, 9

的日志中找不到相同的证明

如上所述,我希望分区broker-id 2broker-id 0崩溃时具有broker-id 2作为领导者。

请澄清

  • 为什么无法达到期望的水平
  • 还请指出是否有任何特定的代理日志消息可以扫描,以了解为什么在这种情况下0, 3, 6, 9没有被选为分区OnInput的领导者
  • 单节点中断以外的任何其他情况都可能导致这种情况
  • 我还检查了ZK集合是否完好,并且当一个节点下降时,它仅在两个节点上都能正常工作

1 个答案:

答案 0 :(得分:1)

我怀疑问题出在不干净的领导者选举(缺乏领导者)和较小的ISR(在同步副本中):

代理0崩溃后,

分区0无领导者。它也将0显示为ISR集的单个(!)成员-这意味着kafka元数据状态代理0具有唯一的用户数据(原始生产者已确认),而该数据在其他任何地方都找不到。允许除0以外的任何代理成为该分区的领导者将导致数据丢失-如果/当0重新加入时,它将截断其数据的“头”以匹配新领导者的身份-从而删除此唯一数据。您需要启用不干净的领导者选举设置。

例如,分区1从代理0过渡到代理1,这意味着在代理0崩溃之后,已经为集群成功选择了新的kafka控制器。

您可以探索以防止这种情况发生的其他选择是:增加代理方的最小值(以及您的总体复制因子,否则丢失任何代理将使分区变为只读状态)和/或增加acks设置您的制作人方面

有关这些设置的更多详细信息,请参见https://www.cloudera.com/documentation/kafka/latest/topics/kafka_ha.html