Kafka分区和Kafka副本有什么区别?

What is the difference between Kafka partitions and Kafka replicas?

我创建了 3 个 Kafka 代理设置,代理 ID 为 20、21、22。然后我创建了这个主题:

bin/kafka-topics.sh --zookeeper localhost:2181 \
  --create --topic zeta --partitions 4 --replication-factor 3

导致:

当生产者向主题 zeta 发送消息“hello world”时,消息首先被 Kafka 写入哪个分区?

“hello world”消息在所有 4 个分区中都被复制了吗?

3 个broker 中的每个broker 都包含所有4 个分区?在上面的上下文中,这与 3 的副本因子有什么关系?

如果我有 8 个消费者 运行 在他们自己的进程或线程中并行订阅 zeta 主题,Kafka 如何分配分区或代理来并行服务这些?

复制和分区是两个不同的东西。

Replication 将在更高 availability/durability 的集群中复制相同的数据。 分区 是 Kafka 在集群中分布非冗余数据的方式,它随着分区的数量而扩展。

When a producer sends message "hello world" to topic zeta, to which partition the message first gets written to by Kafka?

当您向主题发送“hello world”消息时,默认情况下,您的生产者会应用基于该消息密钥的哈希算法(如 hash(key) % number_of_partitions)。如果您没有提供密钥,生产者将进行循环,因此无法预测消息将发送到哪些分区。我猜如果它是第一条消息,它将在分区 0 中结束。

The "hello world" message gets replicated in all 4 partitions?

这条消息将被复制到所有副本但不会复制到 4 个分区

您会在代理 20、21、22 上找到该消息。但是,每个分区都有一个领导者负责对该分区的所有读写操作。在您的屏幕截图中,您还可以找到每个分区的领导者的代理 ID。从 Leader: 21 分区 0 可以看出该分区的领导者位于代理 21.

Each broker among the 3 brokers contain all the 4 partitions? How is that related to replica factor of 3 in above context?

由于您已将复制因子设置为 3,同时集群中共有 3 个代理,所有三个代理都包含所有四个分区。同样,分区和副本之间存在差异。您可以拥有一个包含单个代理的 Kafka“集群”,并且主题中仍然有 20 个分区。

If I have 8 consumers running in their own processes or threads in parallel subscribed to zeta topic, how partitions or brokers are assigned by Kafka to serve these in parallel?

这里要看这8个消费者是否属于同一个消费者组。重要的是要知道来自特定消费者组的一个消费者线程最多可以读取一个分区。

如果所有 8 个消费者都属于同一组,则其中 4 个将从一个分区读取(仅从分区领导者读取)而其他四个将空闲。

Kafka 主题在内部分为多个分区。 分区允许您通过跨多个代理拆分特定主题中的数据来并行化主题 另一方面,副本是您希望在发生故障时实现容错的每个分区的副本数 每个分区都有一个首选领导者,负责处理来自 kafka 客户端的所有写入和读取请求。

如果领导节点出现故障,ISR(同步副本)列表中的一个副本将被提升为领导者,直到首选领导节点恢复并且它赶上自失败。

回答您的问题:

When a producer sends message "hello world" to topic zeta, to which partition the message first gets written to by Kafka?

生产者负责选择将哪条记录分配给主题内的哪个分区。这可以简单地以循环方式完成以平衡负载,或者可以根据一些语义分区函数来完成。

The "hello world" message gets replicated in all 4 partitions?

消息“hello world”将只写入 1 个主题分区,然后复制到该分区的所有副本。

Each broker among the 3 brokers contain all the 4 partitions? How is that related to replica factor of 3 in above context?

每个代理将成为 1 个分区的领导者,其他 3 个将包含该分区的副本。在你的输出中,如果你注意到 ISR 列表,列表中的第一个 id 是分区的当前领导者,另外 2 个是该分区副本所在的跟随者

If I have 8 consumers running in their own processes or threads in parallel subscribed to zeta topic, how partitions or brokers are assigned by Kafka to serve these in parallel?

如果8个消费者都在同一个消费者组中,只有4个会收到数据。这是因为分区数是4。Kafka确保每个分区只分配给消费者组中的1个消费者。当分配了分区的消费者崩溃时,分区将重新分配给另一个消费者。 如果消费者都是独立客户端,则主题的所有 4 个分区都分配给每个消费者。

希望对您有所帮助:)