前言
本意利用kafka实现一个类似redis发布订阅的模式,比redis多了一个数据分区的功能。kafka里面的数据我们是不需要存储的,因此我们需要配置对应的删除策略
Kafka版本号
2.8.1
数据清理策略
kafka有两种数据清理策略,delete删除和compact压缩,默认是删除。
delete:一般是使用按照时间保留的策略,当不活跃的segment的时间戳是大于设置的时间的时候,当前segment就会被删除
compact: 日志不会被删除,会被去重清理,这种模式要求每个record都必须有key,然后kafka会按照一定的时机清理segment中的key,对于同一个key只保留罪行的那个key.同样的,compact也只针对不活跃的segment
segment
简介
kafka每个主题有1个或者多个分区组成,对于kakfa生产者和消费者,最多指定推送或者消费哪个具体分区就行。不过kafka在数据存储中,分区又是一个或者多个segment组成。
生成segment的相关配置
log.segment.bytes: 每个segment的大小,达到这个大小会产生新的segment, 默认是1G
log.segment.ms: 配置每隔n ms产生一个新的segment,默认是168h,也就是7天
其他配置
log.retention.ms
segment的最后写入record的时间-当前时间 > retention.ms 的segment会被删除,默认是168h, 7天
ps:这句话很重要,多读几遍去理解它。之前博主就是误以为类似segment不会存活到我所配置的时间,其实是只要没有新segment产生+不停地往该segment写数据就不会删除该段。
如果满足删除条件的话,segment也不会立即删除,只是会打上delete标签。
log.retention.check.interval.ms
每隔多久检查一次是否有可以删除的log,默认是300s,5分钟,删除上面说的打上delete标签的segment
我的配置
因为我是docker部署的,我是将这些当作环境变量写在了docker-compose里面:
version:"3.0"
services:
kafka:
environment:
# segment最后一次写入的时间 减去当前时间大于40s的话,会被打上删除标签
KAFKA_LOG_RETENTION_MS:40000
# 10M分一次segment
KAFKA_LOG_SEGMENT_BYTES:10485760
# 每60s将打上删除标签的segment删除
KAFKA_LOG_RETENTION_CHECK_INTERVAL_MS:60000
版权归原作者 柯腾_ 所有, 如有侵权,请联系我们删除。