大数据-70 Kafka 高级特性 物理存储 日志存储 日志清理: 日志删除与日志压缩

点一下关注吧!!!非常感谢!!持续更新!!!

目前已经更新到了:

  • Hadoop(已更完)
  • HDFS(已更完)
  • MapReduce(已更完)
  • Hive(已更完)
  • Flume(已更完)
  • Sqoop(已更完)
  • Zookeeper(已更完)
  • HBase(已更完)
  • Redis (已更完)
  • Kafka(正在更新…)

章节内容

上节我们完成了如下内容:

  • 日志索引文件
  • 查看物理存储、查看详细的索引文件
  • 消息偏移
  • 偏移量的存储

在这里插入图片描述

日志清理

Kafka提供两种日志清理策略:

  • 日志删除:按照一定的删除策略,将不满足条件的数据进行数据删除
  • 日志压缩:针对每个消息的Key进行整合,对于有相同的Key的不同Value值,只保留最后一个版本。
  • Kafka提供 log.cleanup.policy 参数进行相应设置,默认值:delete。还可以选择compact。
  • 主题级别的配置是:cleanup.policy

日志删除

基于时间

日志删除任务会根据 log.retention.hours / log.retention.minutes / log.retention.ms 设定日志保留的时间节点。如果超过该设定值,就需要进行删除。默认是7天,log.retention.ms 优先级最高。

Kafka依据日志分段中最大的时间戳进行定位。首先要查询日志分段所对应的时间戳文件,查找时间索引文件中最后一个索引项,若最后一条索引项的时间戳字段大于0,则取该值,否则取最近修改时间。

为什么不直接选最近修改时间?

因为日志文件可以有意无意的被修改,并不能真实的反应日志分段的最大时间消息。

删除过程

  • 从日志对象中所维护日志分段的跳跃表中移除待删除的日志分段,保证没有现成对这些日志分段进行读取操作。
  • 这些日志分段上所有文件添加上 .delete 后缀。
  • 交由一个 delete-file 命名的延迟任务来删除这些 .delete 为后缀的文件,延迟执行时间可以通过 file.delete.delay.ms 进行设置。

如果活跃日志分段中存在需要删除的数据?

  • Kafka会切分出一个新的日志分段作为活跃的日志分段,该日志分段不删除,删除原来的日志分段。
  • 先腾出地方,再删除。

基于日志大小

日志删除任务会检查当前日志的大小是否超过设定值,设定项为:log.retention.bytes。单个日志分段的大小由 log.segement.bytes 进行设定。

删除过程

  • 计算需要被删除的日志总大小(当前日志大小(所有分段)减去retention值)
  • 从日志文件第一个LogSegment开始查找可删除的日志分段的文件集合
  • 执行删除

基于偏移量

根据日志分段的下一个日志分段的起始偏移量是否大于等于日志文件的起始偏移量,若是,则可以删除日志分段。
在这里插入图片描述

删除过程

  • 从头开始遍历每个日志分段,日志分段1的下一个日志分段的起始偏移量为21,小于LogStartOffset,将日志分段1加入到删除队列中
  • 日志分段2的下一个日志分段的起始偏移量35,小于LogStartOffset,将日志分段2加入到删除队列中
  • 日志分段3的下一个日志分段的起始偏移量57,小于LogStartOffset,将日志分段3加入到删除队列中
  • 日志分段4的下一个日志分段的起始偏移量71,大于LogStartOffset,则不进行删除。

日志压缩

基础概念

日志压缩是Kafka的一种机制,可以提供较为细粒度的记录保留,而不是基于粗粒度的基于时间保留。
对于具有相同Key,而数据不同,只保留最后一条数据,前面的数据在适合情况下删除。

应用场景

日志压缩特性,就实时计算来说,可以在异常容灾方面有很好的用途。
比如,我们在Spark、Flink中做实时计算时,需要在内存中维护一些数据,这些数据可能是通过聚合了一天或者一周的日志得到的,这些数据一旦由于异常(内存、网络、硬盘)崩溃了,从头开始计算是需要很长时间的。

一个比较可行的方案就是定时将内存里的数据备份到外部存储介质中,当出现崩溃时,再从外部存介质中恢复并继续计算。

使用日志压缩来替代这些外部存储有哪些优势和好处?

  • Kafka即是数据源又是存储工具,可以简化技术栈,降低维护成本
  • 使用外部存储介质的话,需要将存储的Key记录下来,恢复的时候再使用这些Key将数据取回,实现起来有一定的工程难度和复杂度。使用Kafka的日志压缩特性,只需要把数据写入Kafka,等异常出现恢复任务再读回内存就可以了
  • Kafka对于磁盘的读写做了大量的优化工作,比如磁盘顺序读写。相对于外部存储介质没有索引查询等工作量负担,可以实现高性能。同时,Kafka的日志压缩机制可以充分利用廉价的磁盘,不用依赖昂贵的内存来处理,在性能相似的情况下,实现非常高的性价比(仅针对异常处理和容灾的场景)。

日志压缩实现细节

主题的 cleanup.policy 需要设置为:compact
Kafka后台线程会定时将Topic遍历两次:

  • 记录每个Key的Hash值最后一次出现的偏移量
  • 第二次检查每个Offset对应的Key是否在后面的日志中出现过,如果出现了就删除对应的日志。

日志压缩允许删除,除最后一个key外,删除先前出现的所有该Key对应的记录,在一段时间后从日志中清理以释放空间。
注意:日志压缩与Key有关,确保每个消息的Key不为Null。

压缩是在Kafka后台通过定时重新打开Segment来完成的,Segment压缩细节如下图所示:
在这里插入图片描述
日志压缩可以确保:

  • 任何保持在日志头部以内的使用者都将看到所写的每条消息,这些消息将具有顺序偏移量。
  • 可以使用Topic的min.compation.lag.ms属性来保证消息在被压缩之前必须经过的最短时间,也就是说,它为每个消息(未压缩)头部停留的时间提供下一个下限。可以使用Topic的max.compactiton.lag.ms属性来保证从收到消息符合压缩条件之间的最大延时
  • 消息始终保证顺序,压缩永远不会重新排序消息,只是删除一些而已
  • 消息的偏移量永远不会改变,它是日志中位置的永久标识
  • 从日志开始的任何使用者将至少看到所有记录的最终状态,按记录的顺序写入。
  • 另外,如果使用者在比Topic的log.cleaner.delete.retention.ms短的时间内到达日志的头部,则会看到已删除的所有的delete标记, 保留时间默认是24小时。

默认情况下,启动日志清理器,若需要启动特定Topic的日志清理,请添加特定的属性。

日志清理器配置

配置日志清理器,这里为大家总结了以下几点:

  • log.cleanup.policy设置compact,Broker的配置,影响集群中所有Topic
  • log.cleaner.min.compaction.lag.ms,用于防止对更新超过最小信息进行压缩,如果没有设置,除最后一个Segment之外,所有Segment都有资格进行压缩。

Kafka的日志压缩原理并不复杂,就是定时把所有的日志读取两遍,写一遍,而CPU的速度超过磁盘不是问题,只要日志的量对应的读取两遍和写入一遍的时间在接受范围内,那么它的性能就是可以接受的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/394762.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

K8S资源之NameSpace

作用 隔离资源(默认不隔离网络) 查看所有的NS kubectl get ns创建NS kubectl create ns hello删除NS kubectl delete ns hello

VUE基础快速入门

VUE 和 VUE-Cli VUE 是一种流行的渐进式JavaScript框架,用于构建Web用户界面它具有易学、轻量级、灵活性强、高效率等特点,并且可以与其他库和项目集成是目前最流行的前端框架之一VUE-Cli 称为“VUE脚手架”,它是由VUE官方提供的客户端,专门为…

简单Qt贪吃蛇项目

目录 先看效果 项目介绍 界面一:游戏大厅界面 界面二:关卡选择界面​编辑 界面三:游戏界面 游戏大厅页面 游戏关卡选择页面 游戏房间页面 封装贪吃蛇数据结构 初始化游戏房间界面 设置窗口大小、标题、图标等 蛇的移动 初始化贪…

RocketMQ Dashboard安装

RocketMQ Dashboard 是一个基于 Web 的管理工具,用于监控和管理 RocketMQ 集群。它提供了一个用户友好的界面,使管理员能够轻松地查看和操作 RocketMQ 系统中的各种组件和状态。 主要功能包括: 集群管理: 监控和管理 NameServer 和 Broker …

大数据-65 Kafka 高级特性 分区 Broker自动再平衡 ISR 副本 宕机恢复再重平衡 实测

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

【vulnhub】W34kn3ss 1靶机

安装靶机 下载地址:https://www.vulnhub.com/entry/w34kn3ss-1,270/# 信息收集 靶机扫描 nmap 192.168.93.0/24 打开端口为22、80、443 网址访问 目录扫描 dirsearch -u http://192.168.93.162 在网址后面拼接扫到的目录,在/test目录下发现信息 提…

微型导轨:光学仪器精准定位的支撑者

微型导轨是指宽度在25mm以下的导轨系统,通常由导轨和滑块组成,具有体积小、重量轻、精度高、噪音低、寿命长等特点。主要用于支撑和定位光学元件,如镜子、透镜、滤光片等。微型导轨通过提供高精度的运动控制,‌有利于提高设备的性…

【Tessent IJATG Users Manual】【Ch5】IJTAG Network Insertion

The IJTAG Network Insertion FlowIJTAG Network Insertion ExampleModification of the IJTAG Network Insertion Flow How to Edit or Modify a DftSpecificationEdit or Modify MethodDftSpecification Examples IJTAG Network Insertion 可以将已有的 instrument 连接起来&…

Docker学习(6):Docker Compose部署案例

一、docker-compose部署mysql 1、准备镜像 2、编写my.cnf配置文件 # 服务端参数配置 [mysqld] usermysql # MySQL启动用户 default-storage-engineINNODB # 创建新表时将使用的默认存储引擎 character-set-serverutf8mb4 # 设置mysql服务端默认字符集…

离线+树状数组,ABC253 F - Operations on a Matrix

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 F - Operations on a Matrix 二、解题报告 1、思路分析 我们通过差分树状数组,可以轻松解决操作1 操作3我们也可以通过树状数组来获取对应列的值 关键是操作2会对操作3造成影响 所以我们先对…

【Linux】yum软件包管理器(使用、生态、yum源切换)

目录 1.yum-软件包管理器😸1.1yum使用方法1.2什么是yum?😸1.3yum的周边生态1.4yum源切换1.4.1 查看系统本身yum源1.4.2 软件源1.4.3yum源配置 1.yum-软件包管理器 以下操作需要联网的情况下进行 😸1.1yum使用方法 安装软件时由于需…

【学习笔记】Day 7

一、进度概述 1、DL-FWI基础入门培训笔记 2、inversionnet_train 试运行——未成功 二、详情 1、InversionNet: 深度学习实现的反演 InversionNet构建了一个具有编码器-解码器结构的卷积神经网络,以模拟地震数据与地下速度结构的对应关系。 (一…

03 库的操作

目录 创建查看修改删除备份和恢复查看连接情况 1. 创建 语法 CRATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] …] create_specification:  CHARACTER SET charset_name  CPLLATE collation_name 说明: 大写的标识关键…

基于YOLOv8的小麦种子品质检测系统

基于YOLOv8的小麦种子品质检测系统 (价格85) 包含 [bad seed, healthy seed, impurity] 3个类 通过PYQT构建UI界面,包含图片检测,视频检测,摄像头实时检测。 (该系统可以根据数据训练出的yolov8的权重文件,运用在…

【多线程-从零开始-捌】代码案例2—阻塞队列

什么是阻塞队列 阻塞队里是在普通的队列(先进先出队列)基础上,做出了扩充 线程安全 标准库中原有的队列 Queue 和其子类,默认都是线程不安全的 具有阻塞特性 如果队列为空,进行出队列操作,此时就会出现阻…

vue2知识点4(组件 全局组件 局部组件 父子组件的生命周期钩子函数 父子组件之间的数据传递 局部路由)

目录 一、组件 1. 介绍 2. 全局组件 使用全局组件 实例和组件之间的数据不互通 组件复用 data函数式和data对象的区别: 注意 3. 局部组件 全局组件和局部组件的区别: 注册多个子组件(局部组件) 4. 父子组件的生命周期钩子函数 加载渲染过程…

RIP路由协议之网络工程师软考中级

几种常见的路由协议 路由协议名称路由协议分类(工作原理)协议分类(工作区域)路由算法RIP距离矢量IGPBellman-FordOSPF-ISIS链路状态IGPDijkstraBGP路径向量EGP/ IGP称为内部网关协议(I人,内向&#xff09…

python判断和循环语句

python判断语句 1、单个条件判断 if 条件:满足条件要做的事情1满足条件要做的事情2 else:不满足条件要做的事情3不满足条件要做的事情2 2、多个条件判断(满足条件1就不会判断条件2) else可以省略不写 if 条件1:满足条件1要做的事情a满足条件1要做的事…

爆款短视频素材去哪里找?做抖音短视频爆款热门素材网站分享

爆款短视频素材寻宝:哪里是创作者的宝藏地? 在短视频创作的世界里,找到高质量的素材是打造爆款视频的关键。无论你是初入短视频领域的新手,还是拥有庞大粉丝群的资深创作者,选择合适的视频素材网站可以极大提升你的视…