kafka分区是否可以分布在多个kafka集群节点上?

Can kafka partitions be spread across multiple kafka cluster nodes?

我的应用程序有一个在 spring.kafka.bootstrap-servers 属性 中指定的 kafka 集群节点列表,并监听所有这些节点上的主题。

如果我要在这些节点之一上创建一个主题,假设有 5 个分区,这些分区会分布在这些多个节点上还是会在单个节点上创建?另外,如何找出主题分区实际存在于哪个节点?

您实际上并没有在 Kakfa 集群的某个特定节点中创建主题。当您发出创建主题的请求时,分区将自动分布在属于集群的所有节点上,副本也会分布。这就是 Kafka 处理高可用性的方式。如果其中一个节点宕机,其他某个节点拥有所有需要的数据,因此不会出现宕机或对集群用户造成影响。

您可以发出这样的 --describe 命令:

> bin/kafka-topics.sh --describe --bootstrap-server localhost:9092 --topic my-replicated-topic

    Topic:my-replicated-topic   PartitionCount:1    ReplicationFactor:3 Configs:
        Topic: my-replicated-topic  Partition: 0    Leader: 1   Replicas: 1,2,0 Isr: 1,2,0

这将为您提供主题的分区列表,它们位于何处,哪个节点是该分区的领导者(当消费者需要该分区的数据时,他们被告知从中消费),以及一些更多信息,例如同步副本状态或 ISR 和复制因子。

Kafka 官方文档中有更多信息 here and here

请记住,当您的客户端连接到 bootstrap-server 时,它并未指定完整的代理列表 从中读取数据 。它只是指定一个(或多个)代理,从中提取关于集群的信息。当客户端 reads/writes 从给定的主题和分区直接完成到持有该数据的相关代理时( 不管 在 bootstrap 中指定的特定代理).您可以查看有关此过程的更多信息 here and here.

就像另一个答案所说的那样,主题不是由特定节点拥有或创建的,而是完全为集群创建的。 每当创建主题时,分区就会在集群节点之间进行划分。每个分区都有一个领导节点和副本节点。生产者写入领导节点,Kafka 在内部复制副本节点上的数据。消费者从其领导节点消费分区的数据。

为了在 Kafka 中更好地 understanding/visualisation 主题分区分布,您可以使用像 Kafdrop 这样的工具 您可以按照 repo 的自述部分中的步骤进行设置。 您可以从 here 下载最新的二进制文件。 在 UI 中,您可以看到主题的每个分区的领导节点和副本节点。

设置非常简单,我个人觉得这个工具非常有用!