Kafka服务信息:
- 平台:Amazon MSK
- Kafka版本:3.6.0
- Brokers数量:3
常用配置需求:
- 数据保留3天,过期数据删除;
- 副本数要大于2;
- partitions默认是3,有特殊需求可以单独在topic级别设置;
- minISR大于1
broken配置说明
参数 | 描述 | 默认值 | 备注 |
---|---|---|---|
log.cleanup.policy | 旧日志的保留策略,可选:[compact, delete] | delete | delete: 删除旧数据, compact: 压缩,每个topic 的每个分区中,保留每个key的最新值value,压缩后key顺序不变 |
log.retention.hours | 日志保存的最大时间,单位:小时 | 168 | 优先级 log.retention.ms > log.retention.minutes>log.retention.hours |
log.retention.minutes | 日志保存的最大时间,单位:分钟 | null | 优先级 log.retention.ms > log.retention.minutes>log.retention.hours |
log.retention.ms | 日志保存的最大时间,单位:毫秒 | null | 优先级 log.retention.ms > log.retention.minutes>log.retention.hours |
log.segment.bytes | 单个日志文件的大小 | 1073741824 | |
log.roll.hours | 日志文件轮换时间,单位:小时 | 168 | 优先级 log.roll.ms > log.roll.hours |
log.roll.ms | 日志文件轮换时间,单位:毫秒 | null | 优先级 log.roll.ms > log.roll.hours |
min.insync.replicas | 消息持久化的最小副本数 | 1 | 当producer acks=all或-1时, 表示producer message至少有多少个副本数据同步成功才算成功 |
使用情景描述
日志清理策略不生效
如果设置了log.retention.hours=72(3天),会发现数据量较大的topic会按照设置值定期清理,而某些较小的(几十MB)中会有超过3天未被删除的message,这可能与segment轮换有关。
Kafka日志的清理策略依赖于两个因素:log.segment.bytes和log.segment.ms。当segment.bytes达到指定大小(如1GB),或segment.ms到期(默认7天)时,Kafka会轮换日志文件。如果topic的大小小于1GB且未达到7天,日志将不会轮换,retention.ms不会生效。只有等到segment.ms到期,Kafka才会轮换新文件并清理旧文件。
保证大于3个broker的集群重启时不会丢失数据
配置broker:min.insync.replicas >= 2的同时,需要保证producer配置acks=all或-1:
- broker配置表示:至少有多少个副本数据同步成功,才能确认此小时是否持久化成功,否则producer段会抛出异常。
- producer需配置 ack = all 或者-1时,如果 In-Sync Replicas (ISR) 小于min.insync.replicas的值时,则消息的写入会抛异常(NotEnoughReplicas or NotEnoughReplicasAfterAppend)。
文章写完后,发现别人写的一篇文章写的挺好挺详细,可以参考链接
附:
时间换算表
天 | 小时 | 毫秒 |
---|---|---|
1 天 | 24 小时 | 86400000 毫秒 |
2 天 | 48 小时 | 172800000 毫秒 |
3 天 | 72 小时 | 259200000 毫秒 |
4 天 | 96 小时 | 345600000 毫秒 |
5 天 | 120 小时 | 432000000 毫秒 |
6 天 | 144 小时 | 518400000 毫秒 |
7 天 | 168 小时 | 604800000 毫秒 |
通用配置
auto.create.topics.enable=true
default.replication.factor=3
min.insync.replicas=2
num.io.threads=8
num.network.threads=5
num.partitions=3
num.replica.fetchers=2
log.retention.hours=72
replica.lag.time.max.ms=30000
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
socket.send.buffer.bytes=102400
unclean.leader.election.enable=true
zookeeper.session.timeout.ms=18000