主题和分区是Kafka的两个核心概念,分区的划分不仅为Kafka提供了可伸缩性、水平扩展的功能,还通过多副本机制来为Kafka提供数据冗余以提高数据可靠性。
主题创建
主题和分区都是提供给上层用户的抽象,而在副本层面或更加准确地说是Log层面,才有实际物理的存在。同一个分区中的多个副本必须分布在不同的broken中,这样才能提供有效的数据冗余。
修改主题
目前Kafka只支持增加分区数,而不支持减少分区数。
为什么不支持减少分区数?
要实现该功能要考虑的因素很多。比如删除的分区中,消息该如何处理?
如果随着分区一起消息,则消息的可靠性得不到保障。
如果需要保存要考虑怎么保存,直接存储到现有分区的尾部,消息的时间戳就不会递增。如果分散查不到现有的分区,那么在消息量很大的时候,内部的数据复制会占用很大的资源,复制期间还需要考虑主题的可用性。
因此实现这个功能收益比较低,可以重新创建一个分区数较小的主题,然后现有主题中的消息按照既定的逻辑复制过去即可。
如何选择合适的分区数
需要结合具体的业务场景、机器性能来定。
并不是分区数越多,Kafka的吞吐率越高,因为消息的消费还要依赖消费者。且如果分区数越来越多,系统需要的文件句柄就会越多,假设超过系统中设置的文件句柄,可能会报错。(分区会在磁盘创建多个文件进行存储,每个文件需要打开一个文件句柄进行操作)。