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

时间:2019-01-04 01:58:31

标签: apache-kafka

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

具体地说,

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

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

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

3 个答案:

答案 0 :(得分:2)

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

    • 这里有个陷阱。卡夫卡医生说:
  

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

  1. 是的,如果用bringing down the topic表示deleting the topic
  2. 一旦您增加了分区数量,Kafka就会为订阅该主题的消费者触发重新平衡,并且在随后的民意测验中,分区将分布在各个消费者之间。它对客户端代码是透明的,您不必担心。

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

答案 1 :(得分:2)

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

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

2。是否可以在不降低主题范围的情况下做到这一点?

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

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

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

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

答案 2 :(得分:0)

+还有一件事情,如果您在诸如聚合(利用statestore)之类的客户端中使用有状态操作,则分区的更改将杀死使用者中的所有流线程。这是可以预期的,因为分区的增加可能会破坏有状态的应用程序。因此,请注意更改分区大小,这可能会破坏连接到该主题的有状态使用者。

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