【问题标题】:Can kafka partitions be spread across multiple kafka cluster nodes?kafka 分区可以分布在多个 kafka 集群节点上吗?
【发布时间】:2020-10-08 03:28:16
【问题描述】:
我的应用程序有一个在 spring.kafka.bootstrap-servers 属性中指定的 kafka 集群节点列表,并监听所有这些节点上的主题。
如果我要在其中一个节点上创建一个主题,假设有 5 个分区,这些分区会分布在这些多个节点上,还是会在单个节点上创建?另外,如何找出主题分区实际存在于哪个节点上?
【问题讨论】:
标签:
java
spring-boot
apache-kafka
confluent-platform
kafka-cluster
【解决方案1】:
就像另一个答案所说,一个主题不是由特定节点拥有或创建的,它是为集群创建的。
每当创建主题时,分区就会在集群节点之间进行划分。每个分区都有一个领导节点和副本节点。生产者写入领导节点,Kafka 在内部复制副本节点上的数据。消费者从其领导节点消费一个分区的数据。
为了更好地理解/可视化 Kafka 中的主题分区分布,您可以使用 Kafdrop 等工具
您可以按照 repo 的自述文件部分中的步骤进行设置。
您可以从here 下载最新的二进制文件。
在 UI 中,您可以看到主题的每个分区的领导者和副本节点。
设置非常简单,我个人认为该工具非常有用!
【解决方案2】:
您实际上并没有在 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 和 here 中有更多信息。
请记住,当您的客户端连接到bootstrap-server 时,它并没有指定完整的代理列表从中读取数据。它只是指定一个(或多个)代理,从中提取关于集群的信息。当客户端从给定主题和分区读取/写入时,直接对保存该数据的相关代理完成(不管引导程序中指定的特定代理)。你可以在here和here看到更多关于这个过程的信息。