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

时间:2020-07-30 06:24:00

标签: 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

导致:

enter image description here

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

“ hello world”消息是否在所有四个分区中复制?

3个代理中的每个代理都包含所有4个分区?在上述情况下,它与3的复制因子有什么关系?

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

2 个答案:

答案 0 :(得分:1)

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

复制将在整个集群中复制相同的数据,以提高可用性/耐久性。 分区是Kafka在整个群集中分配非冗余数据的方式,并且会随着分区数量的增加而扩展。

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

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

“ hello world”消息是否在所有四个分区中复制?

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

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

3个代理中的每个代理都包含所有4个分区?在上述情况下,它与3的复制因子有什么关系?

在将复制因子设置为3的同时,群集中总共有3个代理,所以所有三个代理都包含所有四个分区。同样,分区和副本之间是有区别的。您可能只有一个经纪人就拥有一个Kafka“集群”,但在该主题中仍然有20个分区。

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

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

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

答案 1 :(得分:1)

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

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

要回答您的查询:

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

生产者负责选择将哪个记录分配给主题中的哪个分区。可以以循环方式完成此操作,仅是为了平衡负载,也可以根据某些语义分区函数来完成。

“ hello world”消息是否在所有四个分区中复制?

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

3个代理中的每个代理都包含所有4个分区?在上述情况下,它与3的复制因子有什么关系?

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

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

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

我希望这会有所帮助:)