这里有一些答案并不完全正确,因此我想让它更清晰。
每个分区都恰好有一个分区领导者来处理该分区的所有读写请求。(更新:从Kafka 2.4.0版本开始,消费者可以从副本中读取)
如果复制因子大于1,则额外的分区副本充当分区跟随者。
Kafka保证每个分区副本都驻留在不同的代理上(无论是领导者还是跟随者),因此最大复制因子是集群中代理的数量。
每个分区跟随者都从分区领导者读取消息(类似于消费者),并且不为该分区的任何消费者提供服务(仅分区领导者提供读/写服务)。
如果分区跟随者没有落后于分区领导者并且没有失去与ZooKeeper的连接(最大滞后时间默认为10秒,ZooKeeper超时时间为6秒,两者均可配置),则其被认为是同步的。
如果分区跟随者滞后或失去了与ZooKeeper的连接,则被认为是不同步的。
当分区的 leader 因任何原因关闭时(例如 broker 关闭),其中一个同步副本将成为新的 leader。
Kafka 文档中的复制部分 对此进行了详细解释。
Confluent 还撰写了一篇关于这个主题的不错的博客文章。
简而言之
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
bin/kafka-topics.sh --bootstrap-server localhost:9092 --topic myTopic --describe
leader: xx
。