0

0

kafka 有几种数据保留的策略?

小老鼠

小老鼠

发布时间:2025-09-05 08:41:02

|

734人浏览过

|

来源于php中文网

原创

Kafka数据保留策略基于时间(log.retention.ms)和大小(log.retention.bytes),可单独或组合使用,配合log.cleanup.policy设置delete或compact策略,实现过期数据清理。

kafka 有几种数据保留的策略?

Kafka的数据保留策略主要基于时间和大小两种维度。时间维度是指数据在Kafka集群中保留的最长时间,超过这个时间的数据会被删除。大小维度是指每个Topic或者Partition允许存储的最大数据量,当数据量超过这个限制时,Kafka会根据配置的策略删除旧的数据。这两种策略可以单独使用,也可以组合使用,以满足不同的业务需求。

解决方案 Kafka的数据保留策略主要通过以下几个配置项来控制:

  • log.retention.ms
    : 控制消息保留的最长时间,单位是毫秒。例如,设置为
    604800000
    表示保留7天。
  • log.retention.bytes
    : 控制每个Partition允许保留的最大数据量,单位是字节。例如,设置为
    1073741824
    表示保留1GB。
  • log.cleanup.policy
    : 控制数据清理策略,可选值为
    delete
    compact
    delete
    表示直接删除过期数据,
    compact
    表示对数据进行压缩,只保留每个Key的最新值。

具体来说,Kafka会定期检查每个Partition的数据,判断是否满足删除条件。检查的频率由

log.retention.check.interval.ms
配置项控制,默认值为300000毫秒(5分钟)。

log.cleanup.policy
设置为
delete
时,Kafka会直接删除满足以下任一条件的数据:

  1. 消息的写入时间超过
    log.retention.ms
    设置的值。
  2. Partition的总数据量超过
    log.retention.bytes
    设置的值。

log.cleanup.policy
设置为
compact
时,Kafka会定期对Partition的数据进行压缩,只保留每个Key的最新值。压缩的过程由Log Compactor线程负责,它会扫描Partition的数据,找出重复的Key,然后只保留最新的值。压缩的频率由
log.cleaner.enable
log.cleaner.threads
配置项控制。需要注意的是,
compact
策略需要依赖Key的存在,并且会增加Kafka的CPU和IO负载。

如果同时设置了

log.retention.ms
log.retention.bytes
,Kafka会优先满足先达到的条件。例如,如果设置
log.retention.ms=604800000
(7天)和
log.retention.bytes=1073741824
(1GB),那么当Partition的数据量达到1GB或者消息的写入时间超过7天时,Kafka就会开始删除数据。

实际应用中,需要根据业务需求选择合适的数据保留策略。例如,对于需要长期保存的数据,可以选择较大的

log.retention.ms
log.retention.bytes
值;对于只需要保留最新状态的数据,可以选择
compact
策略。

Kafka如何处理消息过期但未被立即删除的情况?

即使消息满足了删除条件,Kafka也不会立即删除它们。这是因为Kafka的数据存储结构是基于日志的,删除操作会影响性能。Kafka采用了一种批量删除的策略,它会定期扫描日志文件,找出可以删除的消息,然后一次性删除。这个过程由Log Cleaner线程负责。

具体来说,Kafka会将日志文件分成多个Segment,每个Segment包含一部分消息。当Segment中的所有消息都满足删除条件时,Kafka才会删除整个Segment文件。如果Segment中只有部分消息满足删除条件,Kafka会将这些消息标记为已删除,但不会立即删除它们。这些被标记为已删除的消息会在后续的压缩过程中被清理掉。

因此,即使消息已经过期,它们仍然会占用一定的存储空间,直到被Log Cleaner线程清理掉。这可能会导致实际的存储空间使用量超过

log.retention.bytes
设置的值。

此外,如果消费者消费速度慢于生产者生产速度,也可能导致消息堆积,从而加速消息的过期。为了避免这种情况,可以考虑增加消费者数量,或者优化消费者的消费逻辑。

如何动态修改Kafka的保留策略?

Kafka允许动态修改Topic级别的保留策略,而无需重启Broker。这可以通过Kafka的

kafka-configs.sh
脚本或者Kafka AdminClient API来实现。

AyWeb企业网站管理系统2.6.3 多站多语言版
AyWeb企业网站管理系统2.6.3 多站多语言版

系统特色:1.一个系统在一个域名空间上,制作多个网站,每个网站支持简繁英等语言2.静态页面使得网站在巨大访问量面前变得游刃有余3.内置中英繁等语言,可扩展多种语言4.内置简繁转换功能,支持全站数据繁简转换5.网站搜索/数据备份/搜索引荐优化/文件管理...6.NET平台能够保证系统稳定及安全,并且效率更高7.集成RSS订阅,网站地图,使得搜索引荐更加青睐您的网站8.公告,留言,链接,招聘,搜索都是

下载

例如,要将Topic "my-topic"的保留时间修改为14天,可以使用以下命令:

./kafka-configs.sh --zookeeper localhost:2181 --alter --entity-type topics --entity-name my-topic --add-config retention.ms=1209600000

这个命令会将

retention.ms
配置项的值修改为1209600000毫秒(14天)。

需要注意的是,动态修改配置项可能会影响Kafka的性能。例如,如果将保留时间设置得过短,Kafka会频繁地删除数据,从而增加IO负载。因此,在修改配置项之前,应该仔细评估其对Kafka性能的影响。

另外,动态修改配置项只会影响新写入的数据,不会影响已经存在的数据。如果需要修改已经存在的数据的保留策略,需要手动删除这些数据。

除了时间和大小,还有没有其他的数据保留策略?

除了时间和大小,Kafka还可以根据消息的Offset来保留数据。这可以通过设置

log.segment.bytes
log.segment.ms
配置项来实现。

log.segment.bytes
控制每个Segment文件的大小,当Segment文件达到这个大小时,Kafka会创建一个新的Segment文件。
log.segment.ms
控制Segment文件的创建时间,当Segment文件创建时间超过这个时间时,Kafka也会创建一个新的Segment文件。

通过控制Segment文件的大小和创建时间,可以间接地控制消息的Offset范围。例如,如果设置

log.segment.bytes=1073741824
(1GB)和
log.segment.ms=604800000
(7天),那么每个Segment文件最多包含1GB的数据,或者最多保留7天的数据。

当需要根据Offset来保留数据时,可以先计算出需要保留的Offset范围,然后根据这个范围来设置

log.segment.bytes
log.segment.ms
的值。

需要注意的是,根据Offset来保留数据可能会导致数据丢失。例如,如果某个Segment文件中的消息的Offset范围不连续,那么删除这个Segment文件可能会导致部分消息丢失。因此,在使用这种策略时,需要仔细评估其对数据完整性的影响。

相关专题

更多
kafka消费者组有什么作用
kafka消费者组有什么作用

kafka消费者组的作用:1、负载均衡;2、容错性;3、广播模式;4、灵活性;5、自动故障转移和领导者选举;6、动态扩展性;7、顺序保证;8、数据压缩;9、事务性支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

167

2024.01.12

kafka消费组的作用是什么
kafka消费组的作用是什么

kafka消费组的作用:1、负载均衡;2、容错性;3、灵活性;4、高可用性;5、扩展性;6、顺序保证;7、数据压缩;8、事务性支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

149

2024.02.23

rabbitmq和kafka有什么区别
rabbitmq和kafka有什么区别

rabbitmq和kafka的区别:1、语言与平台;2、消息传递模型;3、可靠性;4、性能与吞吐量;5、集群与负载均衡;6、消费模型;7、用途与场景;8、社区与生态系统;9、监控与管理;10、其他特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

200

2024.02.23

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

389

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

572

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

480

2023.08.10

数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

269

2023.11.13

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

209

2023.12.29

C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

6

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
SQL优化与排查(MySQL版)
SQL优化与排查(MySQL版)

共26课时 | 2.3万人学习

Linux负载均衡视频教程
Linux负载均衡视频教程

共7课时 | 1.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号