Log Cleanup 策略

在Kafka中,存在数据过期的机制,称为data expire。如何处理过期数据是根据指定的policy(策略)决定的,而处理过期数据的行为,即为log cleanup。

在Kafka中有以下几种处理过期数据的策略:

·       log.cleanup.policy=delete(Kafka中所有用户创建的topics,默认均为此策略)

o   根据数据已保存的时间,进行删除(默认为1周)

o   根据log的max size,进行删除(默认为-1,也就是无限制)

·       log.cleanup.policy=compact(topic __consumer_offsets 默认为此策略)

o   根据messages中的key,进行删除操作

o   在active segment 被commit 后,会删除掉old duplicate keys

o   无限制的时间与空间的日志保留

自动清理Kafka中的数据可以控制磁盘上数据的大小、删除不需要的数据,同时也减少了对Kafka集群的维护成本。

那Log cleanup 在什么时候发生呢?

·       首先值得注意的是:log cleanup 在partition segment 上发生

·       更小/更多的segment,也就意味着log cleanup 发生的频率会上升

·       Log cleanup 不应该频繁发生=> 因为它会消耗CPU与内存资源

·       Cleaner的检查会在每15秒进行一次,由log.cleaner.backoff.ms 控制

log.cleanup.policy=delete

log.cleanup.policy=delete 的策略,根据数据保留的时间、以及log的max size,对数据进行cleanup。控制数据保留时间以及log max size的参数分别为:

·       log.retention.hours:指定数据保留的时常(默认为一周,168)

o   将参数调整到更高的值,也就意味着会占据更多的磁盘空间

o   更小值意味着保存的数据量会更少(假如consumer 宕机超过一周,则数据便会再未处理前即丢失)

·       log.retention.bytes:每个partition中保存的最大数据量大小(默认为-1,也就是无限大)

o   再控制log的大小不超过一个阈值时,会比较有用

在到达log cleanup 的条件后,cleaner会自动根据时间或是空间的规则进行删除,新数据仍写入active segment:

针对于这个参数,一般有以下两种使用场景,分别为:

·       log保留周期为一周,根据log保留期进行log cleanup:

o   log.retention.hours=168 以及 log.retention.bytes=-1

·       log保留期为无限制,根据log大小进行进行log cleanup:

o   log.retention.hours=17520以及 log.retention.bytes=524288000

其中第一个场景会更常见。

Log Compaction

Log compaction用于确保:在一个partition中,对任意一个key,它所对应的value都是最新的。

这里举个例子:我们有个topic名为employee-salary,我们希望维护每个employee当前最新的工资情况。

左边的是compaction前,segments中的数据,右边为compaction 后,segments中的数据,其中有部分key对应的value有更新:

可以看到在log compaction后,相对于更新后的key-value message,旧的message被删除。

Log Compaction 有如下特点:

·       messages的顺序仍然是保留的,log compaction 仅移除一些messages,但不会重新对它们进行排序

·       一条message的offset是无法改变的(immutable),如果一条message缺失,则offset会直接被跳过

·       被删除的records在一段时间内仍然可以被consumers访问到,这段时间由参数delete.retention.ms(默认为24小时)控制

需要注意的是:Kafka 本身是不会组织用户发送duplicate data的。这些重复数据也仅会在一个segment在被commit 的时候做重复数据删除,所以consumer仍会读取到这部分重复数据(如果客户端有发的话)。

Log Compaction也会有时失败,compaction thread 可能会crash,所以需要确保给Kafka server 足够的内存用于做这些操作。如果log compaction异常,则需要重启Kafka(此为一个已知的bug)。

Log Compaction也无法通过API手动触发(至少到现在为止是这样),只能server端自动触发。

下面是一个 Log Compaction过程的示意图:

正在写入的records仍会被写入Active Segment,已经committed segments会自动做compaction。此过程会遍历所有segments中的records,并移除掉所有需要被移除的messages。

Log compaction由上文提到的log.cleanup.policy=compact进行配置,其中:

·       Segment.ms(默认为7天):在关闭一个active segment前,所需等待的最长时间

·       Segment.bytes(默认为1G):一个segment的最大大小

·       Min.compaction .lag.ms(默认为0):在一个message可以被compact前,所需等待的时间

·       Delete.retention.ms(默认为24小时):在一条message被加上删除标记后,在实际删除前等待的时间

·       Min.Cleanable.dirty.ratio(默认为0.5):若是设置的更高,则会有更高效的清理,但是更少的清理操作触发。若是设置的更低,则清理的效率稍低,但是会有更多的清理操作被触发

Apache Kafka(十二)Log Cleanup 策略的更多相关文章

  1. 【Apache Kafka】二、Kafka安装及简单示例

    (一)Apache Kafka安装 1.安装环境与前提条件   安装环境:Ubuntu16.04   前提条件: ubuntu系统下安装好jdk 1.8以上版本,正确配置环境变量 ubuntu系统下安 ...

  2. Apache Kafka(二)- Kakfa 安装与启动

    安装并启动Kafka 1.下载最新版Kafka(当前为kafka_2.12-2.3.0)并解压: > wget http://mirror.bit.edu.cn/apache/kafka/2.3 ...

  3. Apache Kafka学习 (二) - 多代理(broker)集群

    1. 配置server.properties > cp config/server.properties config/server-1.properties> cp config/ser ...

  4. Apache Kafka系列(二) 命令行工具(CLI)

    Apache Kafka命令行工具(Command Line Interface,CLI),下文简称CLI. 1. 启动Kafka 启动Kafka需要两步: 1.1. 启动ZooKeeper [roo ...

  5. Java设计模式(十二) 策略模式

    原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...

  6. Kafka设计解析(二十二)Flink + Kafka 0.11端到端精确一次处理语义的实现

    转载自 huxihx,原文链接 [译]Flink + Kafka 0.11端到端精确一次处理语义的实现 本文是翻译作品,作者是Piotr Nowojski和Michael Winters.前者是该方案 ...

  7. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  8. Apache Kafka简介与安装(二)

    Kafka在Windows环境上安装与运行 简介 Apache kafka 是一个分布式的基于push-subscribe的消息系统,它具备快速.可扩展.可持久化的特点.它现在是Apache旗下的一个 ...

  9. How-to: Do Real-Time Log Analytics with Apache Kafka, Cloudera Search, and Hue

    Cloudera recently announced formal support for Apache Kafka. This simple use case illustrates how to ...

随机推荐

  1. JAVA8对象属性的计算

    Men men = new Men(); men.setName("UU"); men.setAge("56"); Men men1 = new Men(); ...

  2. IIS7配置asp程序

    Windows 中IIS7.IIS7.5是默认不安装的,所以在安装完Windows Vista/windows 7/windows 2008之后如果需要安装IIS7/iis7.5的话,就要自己动手了. ...

  3. cf1266D

    注意到每一个的点出入流是不会变的,因此本质是让构造一张图满足这个出入流并且边上的流量之和最少,显然流量是平衡的,也就是所有节点的出入流之和为0 因此我们可以直接暴力的选择让负数点向正数点连边,连之后就 ...

  4. 关于Hosts与network的异同之处

    1.hosts文件,路径:/etc/hosts,此文间是在网络上使用的,用于解析计算机名称和IP地址的映射关系,功能相当于windows下面的c:\windows\system32\drivers\e ...

  5. 【剑指Offer】60、按之字形顺序打印二叉树

    题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 题解:BFS 主要的方法与BFS写法没什么区 ...

  6. Qt Gui 第八章

    一.QGradient 该类是渐变画刷相关的类,有三个子类,分别是QConicalGradient.QRadialGradient和QLinearGradient 1.QConicalGradient ...

  7. string类型的应用场景 —— Redis实战经验

    string类型是实战中应用最多的数据类型,Redis的一些特性决定了string类型的应用场景. 1. Redis的数据是共享的 如果将用户信息存储在web服务的本地缓存,则每个web服务都会缓存一 ...

  8. JSP+Servlet开发物流管理系统 源码

    开发环境: Windows操作系统开发工具:Myeclipse+Jdk+Tomcat+MYSQL数据库 运行效果图:

  9. 51nod(1174 区间中最大的数)(ST表模板题)

    1174 区间中最大的数 1.0 秒 131,072.0 KB 0 分 基础题   给出一个有N个数的序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有数中,最大的数是多少. 例如: 1 ...

  10. 利用MongoDB进行地理坐标查询

    BS的应用在生活中已经非常常见,我们打车,叫外卖,查个地图之类的都会查询附近的相关坐标位置,mongodb提供了原生的二维地图查询,极大地方便了大家的开发. 假定我们有一个定义了位置信息的集合loca ...