【问题标题】:Kafka - is it possible to alter Topic's partition count while keeping the change transparent to Producers and Consumers?Kafka - 是否可以更改主题的分区数,同时保持更改对生产者和消费者透明?
【发布时间】:2019-10-31 12:44:47
【问题描述】:

我正在对 Kafka 进行调查,以评估它是否适合我们的用例。您能否帮助我了解 Kafka 在更改现有主题的分区数量方面有多灵活?

具体来说,

  1. 是否可以在不拆除集群的情况下更改分区数量?
  2. 是否可以在不降低话题的情况下做到这一点?
  3. 添加/删除分区是否会自动负责在新分区之间重新分配消息?

理想情况下,我希望更改对生产者和消费者透明。 Kafka 能确保这一点吗?

更新: 根据我目前的理解,Kafka 的设计似乎不允许这样做,因为它必须更改消费者组到分区的映射。对吗?

【问题讨论】:

    标签: apache-kafka


    【解决方案1】:

    1.是否可以在不拆除集群的情况下更改分区数?

    是的,kafka 支持在运行时增加分区数,但由于其设计,不支持减少分区数

    2.有没有可能在不降低话题的情况下做到这一点?

    是的,前提是您要增加分区。

    3.添加/删除分区会自动负责在新分区之间重新分配消息吗?

    如前所述,不支持删除分区。

    当您增加分区数量时,现有消息将保留在与以前相同的分区中,只有新消息会被考虑用于新分区(也取决于您的分区器逻辑)。增加主题的分区将触发集群重新平衡,其中消费者和生产者将收到主题的更新元数据通知。生产者将在收到更新的元数据后开始向新分区发送消息,消费者重新平衡器将在消费者组之间重新分配分区并从上次提交的偏移量恢复消费。所有这些都将在后台发生,因此您不必在客户端进行任何更改侧面

    【讨论】:

    • 但是我们可以在运行集群中添加分区的同时保持消息的顺序吗?可能早些时候有 2 个分区,并且每个分区键有 4 种类型的 msgs,我们也得到了理想的键散列,因此每个分区都有 2 种类型的 msgs(分区键)。添加 2 个新分区将开始向旧分区和新分区添加新消息(根据新密钥散列算法),但分区#2 中有一个类型为 #4 的消息,偏移量为 2000,并且分区#2 的消费者当前偏移量只是10 和新的 type#4 msg 被添加到 partition#4 中,它将首先被消耗。但我想维持秩序?
    【解决方案2】:
    1. 是的,完全有可能。您只需针对您选择的主题执行以下命令:bin/kafka-topics.sh --zookeeper zk_host:port --alter --topic <your_topic_name> --partitions <new_partition_count>。请记住,Kafka 只允许增加分区数量,因为减少它会导致数据丢失。

      • 这里有一个问题。 Kafka 文档说以下内容:

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

    1. 是的,如果bringing down the topic 是指deleting the topic
    2. 一旦您增加了分区计数,Kafka 将触发重新平衡,对于订阅该主题的消费者,并且在随后的轮询中,分区将分布在消费者之间。它对客户端代码是透明的,您不必担心。

    注意:如前所述,您只能添加分区,无法删除。

    【讨论】:

      【解决方案3】:

      +另外一件事,如果您在客户端中使用有状态操作,例如聚合(使用 statestore),分区的更改将杀死消费者中的所有流线程。这是预期的,因为分区的增加可能会破坏有状态的应用程序。所以要小心改变分区大小,它可能会破坏连接到主题的有状态消费者。

      好读:Why does kafka streams threads die when the source topic partitions changes ? Can anyone point to reading material around this?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-05
        • 2017-10-17
        • 2022-06-14
        • 2018-01-07
        • 2019-10-16
        • 1970-01-01
        • 1970-01-01
        • 2021-07-28
        相关资源
        最近更新 更多