【kafka】为什么kafka中的分区数只能增长不能淘汰?

藏宝库编辑 2024-10-2 21:07:15 103 0 来自 中国
当一个主题被创建之后,依然答应我们对其做肯定的修改,好比修改分区个数、修改设置等,这个修改的功能就是由kafka-topics.sh脚本中的alter指令所提供。
我们起首来看怎样增长主题的分区数。
从前面的主题topic-config为例,当前分区数为1,修改为3:


注意上面提示的告警信息:当主题中的消息包罗有key时(即key不为null),根据key来盘算分区的活动就会有所影响。
当topic-config的分区数为1时,不管消息的key为何值,消息都会发往这一个分区中;
当分区数增长到3时,那么就会根据消息的key来盘算分区号,原本发往分区0的消息如今有大概会发往分区1大概分区2中,云云还会影响既定消息的顺序,所以在增长分区数时肯定要三思而后行。
对于基于key盘算的主题而言,发起在一开始就设置好分区数量,制止以后对其举行调解。
如今Kafka只支持增长分区数而不支持淘汰分区数。
好比我们再将主题topic-config的分区数修改为1,就会报出InvalidPartitionException的非常,示比方下:




为什么不支持淘汰分区?



按照Kafka现有的代码逻辑而言,此功能完全可以实现,不外也会使得代码的复杂度急剧增大。
实现此功能须要思量的因素许多,好比删撤除的分区中的消息该作那边理?
如果随着分区一起消散则消息的可靠性得不到保障;
如果须要保存则又须要思量怎样保存,直接存储到现有分区的尾部,消息的时间戳就不会递增,云云对于Spark、Flink这类须要消息时间戳(变乱时间)的组件将会受到影响;
如果分散插入到现有的分区中,那么在消息量很大的时间,内部的数据复制会占用很大的资源,而且在复制期间,此主题的可用性又怎样得到保障?
同时,顺序性题目、事件性题目、以及分区和副本的状态机切换题目都是不得不面临的。
反观这个功能的收益点却是很低,如果真的须要实现此类的功能,完全可以重新创建一个分区数较小的主题,然后将现有主题中的消息按照既定的逻辑复制已往即可。
固然分区数不可以淘汰,但是分区对应的副本数是可以淘汰的,这个着实很好明白,你关闭一个副本时就相称于副本数淘汰了。
不外正规的做法是使用kafka-reassign-partition.sh脚原来实现,详细用法可以自行搜索。


参考 

为什么Kafka中的分区数只能增长不能淘汰?
https://honeypps.com/mq/why-can-paritions-number-of-kafka-only-increase-but-not-decrease/
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-10-18 16:50, Processed in 0.158731 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表