Apache kafka 如果消息直接发布到Kafka中的分区,则进行分区复制

Apache kafka 如果消息直接发布到Kafka中的分区,则进行分区复制,apache-kafka,kafka-producer-api,Apache Kafka,Kafka Producer Api,根据我的理解,生产者和消费者向包含leader分区的leader代理进行写和读操作。将记录写入前导分区后,记录将跨跟随分区复制 我最近读到,生产者可以显式地写入特定分区。这是否可能?如果可能,复制是否会发生在其他分区上,因为它可能不是前导分区 我最近读到,生产者可以显式地写入特定分区。这可能吗[……] 是的,这是真的。您可以通过实现partitioner来定义自定义partitioner,并在KafkaProducer配置partitioner.class中声明它 以下是Java中自定义分区器的

根据我的理解,生产者和消费者向包含leader分区的leader代理进行写和读操作。将记录写入前导分区后,记录将跨跟随分区复制

我最近读到,生产者可以显式地写入特定分区。这是否可能?如果可能,复制是否会发生在其他分区上,因为它可能不是前导分区

我最近读到,生产者可以显式地写入特定分区。这可能吗[……]

是的,这是真的。您可以通过实现partitioner来定义自定义partitioner,并在KafkaProducer配置partitioner.class中声明它

以下是Java中自定义分区器的示例:

公共类MyPartitioner实现了分区器{ public void configureMap配置{} 公共无效关闭{} public int partitionString主题,对象键,字节[]键字节, 对象值,字节[]值字节,群集{ 列表分区=cluster.partitionsForTopictopic; int numPartitions=partitions.size; 如果keyBytes==null | |!字符串的键实例 抛出新的InvalidRecordExceptionRecord没有字符串键; 如果字符串key.equalsmyKey 返回0;//此键将始终转到分区0 //其他记录将使用散列函数转到其余分区 返回Math.absUtils.2keybytes%numPartitions-1+1; } } […]如果是,复制会发生在其他分区上吗,因为它可能不是前导分区

您将分区与副本混合在一起。这是两个独立的概念,因为分区将主题的数据分布到多个位置以实现并行性,而复制实际上是跨集群复制数据以提高持久性


使用自定义分区器仍将确保KafkaProducer仅与分区头通信并将数据写入分区头


请记住,主题中的每个分区都有一个分区前导。一个主题中的分区数与分区数一样多。

是的,可以显式写入特定分区。 每个分区都有一个先导节点,其余节点都是跟随节点。 当您写入一个分区时,它将写入该分区的先导节点,跟随节点复制该数据

例如,如果您启动一个包含3个代理节点broker1、broker2、broker3的集群,假设您创建了一个包含3个分区0、1、2的主题,并将其配置为具有2个副本

在这种情况下,每个代理将是一个分区的领导者,而另两个分区的副本。比如说:

partition 0 has leader as broker1 and replicas as broker2 and broker3
partition 1 has leader as broker2 and replicas as broker1 and broker3
partition 2 has leader as broker3 and replicas as broker1 and broker2
当您写入分区0时,它会写入到它的前导节点broker1,然后复制到其他节点,类似地,也会复制到其他分区


尽管broker2是分区1的领导者,但它是分区0和2的追随者,需要从分区0或分区2复制的任何消息都将写入broker2,因为它只是分区1的前导。

使用自定义分区器仍将确保KafkaProducer只与分区前导通信并将数据写入分区。