我正在调查Kafka,以评估其对我们用例的适用性。您能否帮助我了解Kafka在更改现有主题的分区数方面有多灵活?
具体地说,
理想情况下,我希望更改对生产者和消费者透明。卡夫卡会确保这一点吗?
更新: 从我到目前为止的理解来看,Kafka的设计似乎不允许这样做,因为它必须更改消费者组到分区的映射。正确吗?
答案 0 :(得分:2)
是的,这完全有可能。您只需针对所选主题执行以下命令:bin/kafka-topics.sh --zookeeper zk_host:port --alter --topic <your_topic_name> --partitions <new_partition_count>
。请记住,Kafka只允许增加分区数,因为减少分区数会导致数据丢失。
请注意,分区的一种用例是语义分区 数据,添加分区不会更改 现有数据,因此如果他们依赖于此,可能会打扰消费者 划分。也就是说,如果数据按hash(key)%进行分区 number_of_partitions,则该分区可能是 通过添加分区改组,但Kafka不会尝试 自动以任何方式重新分配数据。
bringing down the topic
表示deleting the topic
。注意:如前所述,您只能添加分区,无法删除。
答案 1 :(得分:2)
1。是否可以在不拆除群集的情况下更改分区数量?
是的,kafka支持在运行时增加分区数量,但由于其设计,不支持减少分区数量
2。是否可以在不降低主题范围的情况下做到这一点?
是的,前提是您要增加分区。
3。添加/删除分区会自动在新分区之间重新分配消息吗?
如前所述,不支持删除分区。
当增加分区数量时,现有消息将与以前一样被保留在相同的分区中,新分区将仅考虑新消息(也取决于您的分区器逻辑)。增加主题的分区将触发集群重新平衡,在此过程中,消费者和生产者将收到有关主题的更新元数据的通知。生产者将在收到更新的元数据后开始向新分区发送消息,而消费者重新平衡器将在消费者组之间重新分配分区,并从上次提交的偏移量恢复消耗。所有这些都将在后台进行,因此您无需在客户端进行任何更改。侧面
答案 2 :(得分:0)
+还有一件事情,如果您在诸如聚合(利用statestore)之类的客户端中使用有状态操作,则分区的更改将杀死使用者中的所有流线程。这是可以预期的,因为分区的增加可能会破坏有状态的应用程序。因此,请注意更改分区大小,这可能会破坏连接到该主题的有状态使用者。