繁体   English   中英

动态将新分区添加到 kafka 主题时的键空间行为

[英]Key space behavior when adding new partitions into a kafka topic dynamically

Kafka 支持动态向主题添加新分区。 所以假设最初我有一个主题 T,它有两个分区 P0、P1 和一个包含三个键 K0、K1、K2 的键空间。 进一步假设我在生产者处使用某种 hash 分区器模 2(分区数),将 (K0) 映射到 P0,将 (K1,K2) 映射到 P1。 让我们进一步假设我有两个消费者 C0 代表 P0,C1 代表 P1。 为简单起见,消费者正在做一些基本的基于键的聚合(存储在一些 KV 中)。

一段时间后假设我在 T 中添加了一个新分区 P2。所以现在我的生产者将自动(一旦检测到新的分区数量)使用相同的 hash 分区器模 3。所以现在假设映射键分区变为 ( K0, P0), (K1, P1), (K2, P2)。

  1. 在这种情况下,已经写入 P1 的 K2 值会发生什么(在添加新分区 P2 之前)。 如果我希望始终将所有相同的键记录映射到同一个分区,即使添加了新的主题分区,该怎么办。 也就是说,我不希望我的 K2 记录分布在分区 P1 和 P2 之间。 Kafka 框架是否以某种方式提供了这样的保证? 或者应用程序必须处理这样的要求?

  2. 当新的分区 P2 被添加,并且映射的 key-partitions 变为 (K0, P0), (K1, P1), (K2, P2) 时,会触发一个重新平衡的过程。 作为重新平衡的结果,我们假设 P2 被分配给 C0。 那么 C0 如何从 C1 中的 KV 存储中获取 K2 的最新聚合值,而不是从头开始重新启动 state。 在这种情况下,kafka 是否保证 state 改组给适当的消费者? 还是应该由应用程序处理(如果有)?

谢谢你。

  1. 没有保证。 不移动记录。 旧分区中仍然存在旧密钥。 分区器需要更新以保留旧逻辑

  2. 假设您要询问 Kafka Streams,那么您希望在添加分区后运行应用程序重置命令,并且您最终仍然会得到 state 分布在应用程序的多个实例中,因为您将拥有多个分区上的密钥,所以您需要进行远程密钥库查找

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM