在Apache Kafka中,什么是分区的领导者?

10
我知道有其他帖子试图回答这个问题,但那里的答案没有帮助。>
4个回答

28

这里有一些答案并不完全正确,因此我想让它更清晰。

每个分区都恰好有一个分区领导者来处理该分区的所有读写请求。(更新:从Kafka 2.4.0版本开始,消费者可以从副本中读取
如果复制因子大于1,则额外的分区副本充当分区跟随者。
Kafka保证每个分区副本都驻留在不同的代理上(无论是领导者还是跟随者),因此最大复制因子是集群中代理的数量。

每个分区跟随者都从分区领导者读取消息(类似于消费者),并且不为该分区的任何消费者提供服务(仅分区领导者提供读/写服务)。
如果分区跟随者没有落后于分区领导者并且没有失去与ZooKeeper的连接(最大滞后时间默认为10秒,ZooKeeper超时时间为6秒,两者均可配置),则其被认为是同步的。
如果分区跟随者滞后或失去了与ZooKeeper的连接,则被认为是不同步的。
当分区的 leader 因任何原因关闭时(例如 broker 关闭),其中一个同步副本将成为新的 leader。

Kafka 文档中的复制部分 对此进行了详细解释。
Confluent 还撰写了一篇关于这个主题的不错的博客文章


谢谢!据我所知,acks配置仅涉及生产者何时收到发送确认,但与此无关,如果一个分区没有足够的同步跟随者分区,则该分区可能不可用。因此,即使对于acks=0,如果由于太多的不同步分区而导致分区不可用,则生产者将无法向该主题生成任何新消息。无论如何,我将进一步挖掘并尝试用可信来源支持这个解释。如果我们发现我错了,我会更新答案 :) - Ofek Hod
2
我查阅了文档,你说得完全正确,文档中写道:“如果生产者请求较少严格的确认,则即使不同步副本的数量低于最小值(例如仅为领导者),消息也可以被提交和消费。” 我删除了关于最小同步副本的最后一部分。我认为在这个问题中添加更多关于此和acks参数的信息并不相关。如果您认为我应该添加解释,请告诉我! - Ofek Hod
我觉得现在可以了 :) - H.Ç.T
这个答案即使在2020年3月24日也已经过时了。Kafka 2.4.0于2019年12月16日发布,支持从副本中消费。请参见KIP-392 - Kenji Noguchi
如果分区的领导者死亡或宕机,它的追随者中的一个如何成为领导者?分区领导者选举是否需要强制执行?还是自动的? - GvSharma
显示剩余2条评论

9

简而言之

kafka的leader是分区本身还是broker?

分区的leader是Kafka Broker


分区领导者

这在Kafka文档中已经明确说明:

每个分区都有一个充当“领导者”的服务器和零个或多个充当“追随者”的服务器。领导者处理该分区的所有读写请求,而追随者则被动地复制领导者。如果领导者失败,则其中一个追随者将自动成为新的领导者。每个服务器都充当某些分区的领导者和其他分区的追随者,因此负载在群集内得到了很好的平衡。

因此,分区领导者实际上是负责处理该特定分区的所有读写请求的代理


分区领导者选举

为特定分区分配领导者的过程称为分区领导者选举。该过程在创建主题/分区时或分区领导者(即代理)由于任何原因不可用时发生。

此外,您可以使用首选副本领导者选举工具强制进行首选副本选举:

使用复制,每个分区可以有多个副本。分区的副本列表称为“分配的副本”。此列表中的第一个副本是“首选副本”。当创建主题/分区时,Kafka 确保跨主题的分区的“首选副本”在集群中的代理商之间均匀分布。在理想情况下,给定分区的领导者应该是“首选副本”。这保证了集群中代理商之间的领导负载平衡。但是,随着时间的推移,由于受控关闭、崩溃、机器故障等原因,领导负载可能变得不平衡。此工具有助于恢复集群中代理商之间的领导平衡。

要执行此操作,请运行以下命令:

bin/kafka-preferred-replica-election.sh --zookeeper localhost:12913/kafka --path-to-json-file topicPartitionList.json

其中topicPartitionList.json的内容应该像下面这样:

{
 "partitions":
  [
    {"topic": "topic1", "partition": 0},
    {"topic": "topic1", "partition": 1},
    {"topic": "topic1", "partition": 2},
    {"topic": "topic2", "partition": 0},
    {"topic": "topic2", "partition": 1}
  ]
}

如何找到哪个经纪人是分区领导者

为了找到哪个经纪人作为分区领导者,以及哪些经纪人作为同步副本(ISR),您需要运行以下命令:

kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic myTopic

输出应该与以下内容完全相同:
Topic:myTopic       PartitionCount:4        ReplicationFactor:1     Configs:
    Topic: myTopic      Partition: 0    Leader: 2       Replicas: 2     Isr: 2
    Topic: myTopic      Partition: 1    Leader: 3       Replicas: 3     Isr: 3
    Topic: myTopic      Partition: 2    Leader: 4       Replicas: 4     Isr: 4
    Topic: myTopic      Partition: 3    Leader: 0       Replicas: 0     Isr: 0

3
“分区领袖”概念适用于 Kafka 主题的复制因子大于1的情况(这也意味着我们的集群必须具有大于或等于复制因子的经纪人数量)。
在这种情况下,当生产者将任何消息推送到主题的分区时,请求首先会到达分区的领袖(在 Kafka 集群中所有复制的分区中)。它存储消息并首先将消息复制到其他跟随者分区,然后向生产者发送消息确认。
只有在完成上述过程之后,特定的消息才能供消费者使用。
我建议参考官方link以获得更深入的理解。

0
在Kafka中,所有主题分区都有一个领导者,如果复制因子大于1,则领导者有追随者。可以使用以下命令检查分区领导者:
bin/kafka-topics.sh --bootstrap-server localhost:9092 --topic myTopic --describe

在此命令的输出中,分区领导者的代理 ID 显示为 leader: xx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接