【问题标题】:Kafka, Re-Partitions, locality and ordering卡夫卡,重新分区,位置和排序
【发布时间】:2018-12-11 17:22:22
【问题描述】:

我有一个关于在 Kafka 中重新分区的问题...

假设我有一个主题,它在 3 个代理 Kafka 集群上有 3 个分区,复制因子为 3,这意味着每个代理将有一个主分区,其他 2 个代理将复制这个分区,我知道里面一个分区,只要分区分配策略保持不变,保证在分区内有序投递。

我的问题是,假设我认为 3 个分区不够,我决定再添加一个分区和一个代理,那么会发生什么?如果分区策略这样,已经在分区中的消息是否会被转移到新分区,或者它们将留在旧分区中并且只有新记录会写入新分区?

如果在创建新分区后重新排列所有分区,是否会保留交付顺序?

【问题讨论】:

    标签: apache-kafka


    【解决方案1】:

    请注意,分区的一个用例是对数据进行语义分区,添加分区不会更改现有数据的分区,因此如果消费者依赖该分区,这可能会打扰他们。也就是说,如果数据按 hash(key) % number_of_partitions 进行分区,那么这个分区可能会通过添加分区而被打乱,但 Kafka 不会尝试以任何方式自动重新分配数据。

    https://kafka.apache.org/documentation/#basic_ops_modify_topic

    【讨论】:

    • 这带来了一个更有趣的问题,如果我有一个适用于上述场景的 Kafka Stream 应用程序,当我搜索密钥先前指向分区 3 的特定数据时,添加了新分区,它应该是实际上在分区 4 和请求上,而分区策略保持不变并且将指向分区 4,将无法找到数据?
    • 我猜这是开发人员需要编写自己的 Partitioner.java 实现的情况之一,我还没有找到任何线索如何正确地做到这一点。
    • 您使用 Kafka Streams,假设您有 2 个实例。在您的场景中,您有 3 个分区,因此您将有 3 个任务分布在这 2 个实例上,假设:实例 1:[task_1] 实例 2:[task_2,task_3] 现在您有 4 个分区,因此您将拥有另一个将要分发的任务(不确定它是自动添加还是我们需要重新启动两个应用程序),在这里它将被放置在实例 1 中(这样负载至少会均匀)。
    • 问题无法解决,你有数据分布在分区1,现在在分区4,所以对于同一个key,一部分数据在这两个分区.
    • 现在这取决于你正在开发的主题和应用程序,如果你的应用程序从这个主题中读取,然后做一些事情并写入另一个接收器主题,分区号保持不变,然后分区 [1, 4] 中的数据将继续转到 sink topic 上的同一分区。但是,如果您提到的主题实际上是接收器主题,那么您将不得不从该主题中读取消息并写入另一个主题!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    • 2021-03-01
    • 1970-01-01
    • 2022-12-07
    • 1970-01-01
    相关资源
    最近更新 更多