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

7

我创建了3个Kafka代理,分别使用20、21、22作为broker id。然后我创建了这个话题:

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

导致如下结果:

输入图像描述

当生产者向Zeta主题发送“Hello World”消息时,Kafka将消息写入哪个Partition?

“Hello World”消息被复制到所有4个Partitions中?

3个代理服务器中的每个代理服务器都包含所有4个Partitions吗?这与上文中的副本因子3有什么关系?

如果我有8个消费者在它们自己的进程或线程中并行运行并订阅Zeta主题,则Kafka将如何分配分区或代理服务器以并行为其提供服务?

2个回答

7

复制和分区是两个不同的概念。

复制将相同的数据在集群之间进行复制,以提高可用性/持久性。 分区是Kafka分发不冗余数据到集群的方式,并且它随着分区数量的增加而扩展。

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

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

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

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

您可以在经纪人20、21、22中找到消息。但是,每个分区都有一个负责从该分区读取和写入的领导者。从分区0的Leader:21您可以看出该分区的领导者位于经纪人21上。

3个代理中的每个代理都包含所有4个分区?在上下文中,这与3的副本因子有何关系?

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

如果我有8个消费者在它们自己的进程或线程中并行运行,并订阅zeta主题,那么Kafka如何分配分区或代理以并行提供服务?

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

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


7
Kafka主题(topics)内部被划分为若干个分区(partitions)。分区允许你通过将特定主题内的数据分割到多个代理(brokers)上,从而并行处理主题。另一方面,备份副本(replica)是每个分区所需的副本数,以实现容错,防止故障发生。每个分区都有一个首选领导者(preferred leader),该领导者处理来自Kafka客户端的所有写入和读取请求。
如果领导节点失败,则ISR(同步副本)列表中的其中一个副本将被提升为领导者,直到首选领导者节点恢复并赶上在失败期间生成的所有新数据。
回答您的问题:
当生产者向主题zeta发送消息“hello world”时,Kafka将消息写入哪个分区?
生产者负责选择将哪个记录分配给主题内的哪个分区。这可以根据某些语义分区函数进行简单的轮询负载平衡,也可以按照其他方法进行分区。
“hello world”消息会被复制到所有四个分区吗?
“hello world”消息仅会被写入1个主题分区,并稍后复制到该分区的所有副本。
三个代理中的每个代理都包含全部4个分区?这与上下文中的副本因子3有何关系?
每个代理将是1个分区的领导者,而另外3个代理将包含该分区的备份副本。如果您注意到ISR列表中的第一个ID是该分区的当前领导者,而其他2个则是副本所在的跟随者。
如果我有8个消费者在各自独立的进程或线程中并行运行并订阅zeta主题,Kafka如何分配分区或代理以并行服务它们?
如果所有8个消费者都属于同一消费者组,则只有其中4个会接收数据。这是因为分区数为4。Kafka确保每个分区仅分配给消费者组中的1个消费者。当已分配分区的消费者崩溃时,分区将重新分配给另一个消费者。如果这些消费者都是独立客户端,则主题的所有4个分区将分配给每个消费者。
希望这对您有所帮助 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接