Kafka - 是否可以更改主题的分区计数,同时保持更改对生产者和消费者透明?

Aad*_*mia 9 apache-kafka

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

具体来说,

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

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

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

Lij*_*ohn 11

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

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

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

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

3.添加/删除分区会自动处理跨新分区重新分配消息吗?

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

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

  • 但是我们可以在运行集群中添加分区时保持消息的顺序吗?早些时候可能有 2 个分区,每个分区键有 4 种类型的消息,我们也得到了理想的键散列,因此每个分区都有 2 种类型的消息(分区键)。添加 2 个新分区将开始向旧分区和新分区添加新消息(根据新的密钥哈希算法),但是在分区 #2 中偏移量 2000 处有一条类型为 #4 的消息,而分区 #2 的消费者的当前偏移量只是10 和新的 type#4 消息添加到partition#4 中,它将首先被消耗。但我想维持秩序? (6认同)
  • @amandeep1991 在不停机的情况下保留分区顺序的一个选项:1)避免重新分区,而是创建具有增加分区的第二个主题2)更改消费者仅在第一个主题耗尽后从第二个主题轮询消息 (2认同)

Bit*_*sky 6

  1. 是的,这是完全可能的。你只对你选择的主题执行以下命令:bin/kafka-topics.sh --zookeeper zk_host:port --alter --topic <your_topic_name> --partitions <new_partition_count>。请记住,Kafka 只允许增加分区数,因为减少它会导致数据丢失。

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

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

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

注意:正如我之前提到的,您只能添加分区,无法删除。