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

ace*_*ace 7 apache-kafka kafka-producer-api

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

bin/kafka-topics.sh --zookeeper localhost:2181 \
  --create --topic zeta --partitions 4 --replication-factor 3
Run Code Online (Sandbox Code Playgroud)

结果是:

在此输入图像描述

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

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

3 个代理中的每个代理都包含所有 4 个分区?这与上述上下文中的复制因子 3 有何关系?

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

mik*_*ike 7

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

复制将在集群中复制相同的数据,以获得更高的可用性/持久性。分区是 Kafka 在集群中分布非冗余数据的方式,它随着分区的数量而扩展。

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

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

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

这一消息将在所有副本中复制,但不会复制到 4 个分区

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

3 个代理中的每个代理都包含所有 4 个分区?这与上述上下文中的复制因子 3 有何关系?

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

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

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

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


小智 7

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

如果领导节点发生故障,ISR(同步副本)列表中的副本之一将被提升为领导节点,直到首选领导节点恢复并捕获自故障以来生成的所有新数据。

回答您的疑问:

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

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

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

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

3 个代理中的每个代理都包含所有 4 个分区?这与上述上下文中的复制因子 3 有何关系?

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

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

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

我希望这可以帮到你 :)