当 Kafka 中的主要领导者出现故障时,客户端如何自动检测到新的领导者?

How client will automatically detect a new leader when the primary one goes down in Kafka?

考虑以下场景:

  1. 我有一个 Kakfa 代理集群(localhost:9002,localhost:9003,localhost:9004,localhost:9005)。
  2. 假设 localhost:9002 是集群的主要(领导)。
  3. 现在我的制作人正在生成数据并将其发送给经纪人(localhost:9002)。
  4. 如果我的主要经纪人(localhost:9002)出现故障,在 Zookeeper 或其他一些共识算法的帮助下,将选出新的领导者(考虑 localhost:9003 现在是新的领导者)。

所以,在上面的场景中,有人可以向我解释 Kafka 客户端(生产者)将如何收到有关新代理配置的通知(localhost:9003)以及它将如何连接到新的领导者并开始再次产生数据。

Kafka 客户端在读取或写入主题时会根据每个请求自动从集群接收必要的元信息,以防领导层发生变化。

一般情况下,客户端会向配置 bootstrap.servers 中列出的 bootstrap 服务器之一发送 (read/write) 请求。这个初始请求(因此称为 bootstrap)returns 主题分区领导者位于哪个代理的详细信息,以便客户端可以直接与该代理通信。每个单独的代理都包含 整个 集群的所有元信息,这意味着还了解其他代理的分区领导者。

现在,如果您的代理人之一出现故障并且主题分区的领导层切换,您的生产者将通过该机制收到通知。

有一个名为 metadata.max.age.msKafkaProducer configuration,您可以修改它以更新制作人的元数据,即使没有发生领导层变动也是如此:

"Controls how long the producer will cache metadata for a topic that's idle. If the elapsed time since a topic was last produced to exceeds the metadata idle duration, then the topic's metadata is forgotten and the next access to it will force a metadata fetch request."


关于您的问题的几点说明:

  • “Kafka 代理集群”这个术语并不存在。您有一个 Kafka 集群,其中包含一个或多个 Kafka 代理

  • 您没有代理作为“集群的主要(领导者)”,但每个 TopicPartition 都有一个领导者。也许您指的是 Controller,它位于集群中的一个代理上。