原因
有研发同事反馈,kafka集群无法消费了,经查看日志,发现数据磁盘占用100%,修改kafka参数(后续详细说明),删除kafka日志,仍无法启动,经与研发同事商量可以删除topic。
过程
1.与业务同事确定kafka数据保存时间,确定每个分片保存大小,涉及参数:
参数名 | 参数含义 | 默认值 | 此处配置 |
---|---|---|---|
log.retention.hours | 日志保存的时间,可以选择hours,minutes和ms | 168(7day) | 12 |
log.retention.bytes | 删除前日志文件允许保存的最大值 | -1 | 5368709120 |
参数说明:
log.retention.bytes,从网上查看和问同事都说是每台机器限制日志的大小,但是根据反复配置发现,log.retention.bytes可能和每个分片的大小有关,磁盘大小是558G ,根据0.8原则,我配置log.retention.bytes=429496729600(400G)log.retention.hours=12 ,经过一天还是满了,后来把log.retention.bytes改成了5368709120(5G)就莫名的好了,如有不同见解,欢迎指正。
相关参数配置:
log.retention.hours=12(修改)
log.retention.bytes=5368709120(新增)
2.此步骤很重要
如果要删除的topic正在被消费或者生产,那么相关程序需要暂停,否则topic无法被删除,而且使用kafka --delete的时候也不报错,会让人误以为被删除了,但是等删除完,查看list的时候,发现topic还在,涉及参数
参数名 | 参数含义 | 默认值 | 此处配置 |
auto.create.topics.enable | 是否允许自动创建topic | true | false |
delete.topic.enable | 是否物理删除topic | false | true |
参数说明:
只有这两个参数一起配置时,才能达到预想中删除topic的目的。
相关参数配置:
auto.create.topics.enable=false(新增)
delete.topic.enable=true(新增)
3.停止kafka,删除topic的相关数据目录,涉及命令:
sh bin/kafka-server-stop.sh(停止kafka进程)
rm -rf kafka-logs/topic*(删除topic的数据目录)
4..删除kafka使用的zookeeper中该topic的信息,涉及命令:
sh bin/zkCli.sh -server zookeeperip:port(通过客户端进入zookeeper)
ls /brokers/topics/topic(确定要删除的topic的目录)
rmr /brokers/topics/topic(删除的topic的目录)
ps:若删除所有topic,直接删除zookeeper配置data中version-2的目录,重启zookeeper即可。
5.重新启动kafka,涉及命令:
nohup bin/kafka-server-start.sh config/server.properties &(启动kafka)
6.完成之后,重建topic即可。
沉淀
1.部署kafka之前确认每一台的数据盘挂在情况;
2.相关参数部署之前确认好
3.若数据盘满了,可以在确定topic包含2个及以上副本的前提下,删除每台服务器上的不同的副本,优先保证kafka启动出发删除机制。