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

Apache kafka Kafka分区和Kafka副本之间有什么区别?,apache-kafka,kafka-producer-api,Apache Kafka,Kafka Producer Api,我创建了3个Kafka代理设置,代理id为20,21,22。然后我创建了这个主题: bin/kafka-topics.sh——zookeeper本地主机:2181\ --创建--主题zeta--分区4--复制因子3 这导致: 当制作人向topic zeta发送消息“hello world”时,Kafka会首先将消息写入哪个分区 “hello world”消息会在所有4个分区中复制吗 3个代理中的每个代理都包含所有4个分区?在上面的上下文中,这与副本因子3有什么关系 如果我有8个并行运行在自己

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

bin/kafka-topics.sh——zookeeper本地主机:2181\
--创建--主题zeta--分区4--复制因子3
这导致:

当制作人向topic zeta发送消息“hello world”时,Kafka会首先将消息写入哪个分区

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

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


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

复制和分区是两件不同的事情。

复制将跨群集复制相同的数据,以提高可用性/耐用性分区是Kafka跨集群分发非冗余数据的方法,它随分区的数量而扩展

当制作人向topic zeta发送消息“hello world”时,Kafka会首先将消息写入哪个分区

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

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

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

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

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

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

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

这取决于这8位消费者是否属于同一消费群体。重要的是要知道一个分区最多只能由一个使用者线程从特定的使用者组中读取


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

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

在先导节点发生故障的情况下,ISR(同步副本)列表中的一个副本将提升为先导,直到首选先导节点恢复,并捕获自故障以来生成的所有新数据

回答您的问题:

当制作人向topic zeta发送消息“hello world”时,Kafka会首先将消息写入哪个分区

制作人负责选择将哪个记录分配给主题中的哪个分区。这可以简单地以循环方式来平衡负载,也可以根据某种语义划分函数来完成

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

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

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

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

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

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

我希望这有帮助:)