背景:
我给kafka准备了6块盘,但是每次都是其中两块磁盘满了,导致kafka挂掉,本着一劳永逸的原则,今天一定要查到原因在哪里?
我得kafka配置,我有3个主机broker01,broker02,broker03,存储配置如下:
log.dirs=/chunk04/kafka/logs,/chunk05/kafka/logs,/chunk06/kafka/logs,/chunk07/kafka/logs,/chunk08/kafka/logs,/chunk09/kafka/logs
以上这些配置都是没问题,因为官方文档给我也是这样,多个磁盘就用“,”隔开就行了。那问题在哪呢?
于是我先排查每一块磁盘里都存储了哪些topic信息,这个就不截图了,总结下发现的问题:
1、3个节点的集群,每个topic创建的时候是3副本,也就是说“一式三份”,每个节点上都应该有我的topic信息,这个确认没问题,是有的
2、每个节点6块盘,为什么有的盘有app(假设topic名称是app),而有的没有呢?用du -sh *命令,也定位到正是app数据量过大导致我其中两块磁盘满了。
3、查看app的分区信息,命令:
./bin/kafka-topics.sh --topic app --describe --zookeeper 【zk ip】:【zk 端口】
发现这个topic就两个分区,恍然大悟。
我创建两个分区,一般就会按照一个分区对应一个磁盘目录,然后我这个topic数据量又比较大,所有导致两个磁盘满了,而其他磁盘确是很空。
建议:
1、如果你的磁盘很多,例如6块,那创建topic的时候分区如何选择呢? 看这个topic的数据量,如果量非常大,那就分区建大一点,分区数<=磁盘数,最大分区数可以磁盘相同,这样数据才能均衡的分布在这6块磁盘上。
2、如果topic的数据量很小,没必要创建那么多分区,这个也是根据磁盘数量决定。
此次用到命令汇总:
查看topic 列表: ./bin/kafka-topics.sh --zookeeper 【zk ip】:【zk 端口】 --list
查看分区详情:./bin/kafka-topics.sh --topic metrics --describe --zookeeper 【zk ip】:【zk 端口】
删除topic:./bin/kafka-topics.sh --delete --zookeeper 【zk ip】:【zk 端口】 --topic app (用这个命令主要是动态扩容分区不太好使,正好系统停掉kafka又没有那么大影响,如果系统可用性很重要,建议实践下动态扩分区),这个删除topic的命令只是标记,并且还有配置文件中开启 delete.topic.enable=true,然后删除磁盘上的topic信息,然后到Zookeeper上,登录zk的命令: ./zkCli.sh -server 【zk ip】:【zk 端口】,ls /brokers/topics,然后删除对应的节点,命令:rmr /brokers/topics/topicName,这样才算完事。
创建topic: ./bin/kafka-topics.sh --create --zookeeper 【zk ip】:【zk 端口】 --replication-factor 3 --partitions 6 --topic app
其中 --replication-factor 是副本是,注意你的broker节点数量 >= 副本数量,partitions 是分区数,可以登录zk查看broker节点,ls /brokers/ids