磁盘占用过大优化

生产环境服务器目前生产上kafka占用磁盘地方过大。因为数据量大建议优化。

目前kafka 使用的是默认配置,默认配置中有两项配置可优化

log.retention.hours 清理超过指定时间清理

log.retention.bytes 超过指定大小后,删除旧的消息

目前默认配置 存放时间是7天而且大小无限大,我们可以将存放时间缩小且设定默认大小(存在风险是可能会丢数据)

配置字段名 含义 默认值
log.cleanup.policy 日志清理保存的策略(delete|compact)两种 delete
log.retention.hours 日志保存的时间(hours,minutes,ms)三种可选 168(7day)
log.retention.bytes 删除前日志允许保存的最大值 -1(无限)
log.segment.delete.delay.ms 日志文件被真正删除前的保留时间 60000(60s)
log.cleanup.interval.mins 每隔一段时间多久调用一次清理的步骤 10
log.retention.check.interval.ms 周期性检查是否有日志符合删除的条件(新版本用) 300000

注:日志的真正清除时间。当删除的条件满足以后,日志将被“删除”,但是这里的删除其实只是将该日志进行了“delete”标注,文件只是无法被索引到了而已。但是文件本身,仍然是存在的,只有当过了log.segment.delete.delay.ms 这个时间以后,文件才会被真正的从文件系统中删除。

以上配置只对默认配置,属于全局配置,并不一定对全部topic起效,如果以上配置对你的topics不起效果,说明该topics有独立的特殊配置,用以下命令查询该topics的特殊配置(重载配置)

先查看topic的描述信息

1
2
3
4
5
6
#假设localhost:2182是zookeeper的ip和端口,__consumer_offsets是要查询的topics
$ bin/kafka-configs.sh --zookeeper localhost:2182 --entity-type topics --entity-name __consumer_offsets --describe

# 假如输出结果
Configs for topics:__consumer_offsets are segment.bytes=104857600,cleanup.policy=compact,compression.type=uncompressed
# 则说明segment.bytes、cleanup.policy、compression.type这三个配置项是针对topics的,server.conf配置log.cleanup.policy, log.segment.bytes 没有起效

如果想让该配置跟随server.conf配置,则执行以下命令,一个个删除特殊配置

1
$ bin/kafka-configs.sh --zookeeper localhost:2182 --entity-type topics --entity-name __consumer_offsets --alter --delete-config cleanup.policy

如果想修改,则用以下命令

1
$ bin/kafka-configs.sh --zookeeper localhost:2182  --entity-type topics --entity-name __consumer_offsets --alter --delete-config cleanup.policy=delete

然后你就会发现,日志基本被清空了!!!