kafka日志索引存储及Compact压实机制深入剖析-kafka 商业环境实战

本文主要是介绍kafka日志索引存储及Compact压实机制深入剖析-kafka 商业环境实战,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

版权声明:本套技术专栏是作者(秦凯新)平时工作的总结和升华,通过从真实商业环境抽取案例进行总结和分享,并给出商业应用的调优建议和集群环境容量规划等内容,请持续关注本套博客。版权声明:禁止转载,欢迎学习。QQ邮箱地址:1120746959@qq.com,如有任何商业交流,可随时联系。

1 kafka日志特点

  • kafka日志不是松散的结构化请求日志,错误日志或其他日志。

  • 类似于关系型数据库中的记录,只能按照时间顺序在日志尾部追加写入日志,存储的不可能是原生消息,而是消息集合或者消息batch(10版V2)。

  • 每一条日志都会被分配一个唯一的且顺序增加的记录号,作为定位该消息的位移标识。

  • kafka的日志设计都是以分区为单位进行的。

  • 对于每一个分区日志都会进一步细分为日志段(log segment file)以及日志段索引文件。每个目录下面有三个日志文件,xxx.log是消息集文件, xxx.index 偏移量索引文件 ,xxx.timeindex 时间戳索引文件:

      00000000000000000000.index  00000000000000000000.log  00000000000000000000.timeindex
    
  • kafka日志是按照topic来组织的,每个topic可以分成多个的partition。名字为 -<分区号>,即:page_visits-0。比如:有5个partition的名为page_visits的topic的目录结构为:

  • kafka topic 对应的 partition是分段的,每个段叫LogSegment,包括了一个数据文件和一个索引文件,下图是某个partition目录下的文件:

  • 注意第二条消息368769.log表示该日志段的第一条消息位移是368769,同时也说明上一个日志段包含了368768条消息。

  • 日志段文件的大小是有上限的,默认大小是1GB,当日志段文件填满记录后,kafka会创建一组新的日志段文件和索引文件。

  • kafka 分区日志还包含.index和.timeindex。注意这里的.index索引是稀疏索引(Sparse index file),默认是日志写入大小达到4KB时,才会在.index中增加一个索引项。可以通过log.index.interval.bytes来设置这个间隔大小。

  • 索引文件的打开方式:只读模式和读写模式。当前日志段的索引文件可以以读写模式打开,非当前的日志段文件只能以只读方式打开。

  • 索引文件的大小默认值是10MB,可以通过参数log.index.size.max.bytes来设置索引文件的最大文件大小。

  • 索引文件项格式如下所示,要求每一个索引项必须占用8个字节,log.index.size.max.bytes且必须是8的整数倍,否则会回退到8的整数倍。

  • 举例如下:若用户需要查找相对位移为4的消息,那么首先会通过二分查找算法找到小于4的最大索引项是4597。那么kafka就会从.log文件中从4597开始查找,直到最后找到4597。如果想要增加索引项的密度。可以设置log.index.interval.bytes,默认是4KB。

2 日志留存清理策略

2.1 日志的留存

log.retention.bytes 删除前日志文件允许保存的最大值,默认是-1,表示kafka不会对log进行大小方面的限制。

log.retention.hours 日志保存的时间,可以选择 hours,minutes和ms。默认是7天。

2.2 日志的清理和压实Compact

针对每个消息的key进行整合,对于有相同key的的不同value值,只保留最后一个版本

  • log.cleanup.policty

    日志清理保存的策略只有delete和compact两种,其中delete是默认值,就是日志留存的机制决定的。另外一个是compact则解决的是压实问题。从0.10.1.0版本开始,可以同时指定两种策略:log.cleanup.policty =delete,compact 表示可以同时为Topic执行普通的留存策略,也对其执行log comaction策略。

  • log.cleaner.enable:

    表示开启日志清理机制,自0.9开始默认为true。若要使用compact,则必须设置log.cleaner.enable=true

  • log.cleaner.min.compaction.lag.ms:

    默认是0,表示除了当前日志段,所有日志段都是可以清理的。但是假如设置log.cleaner.min.compaction.lag.ms=10min,则下午2点为当前时间时,13:50之后的日志段不被清理。

2.3 日志的合并

经过一次次清理后,各个segment大小会慢慢变小。为了避免日志目录下有过多的小文件,kafka在每次日志清理后会进行小文件日志合并。kafka会保证合并后的segment大小不超过segmentSize(通过log.segments.bytes设置,默认值是1G),且对应的索引文件占用大小之和不超过maxIndexSize(可以通过broker端参数log.index.interval.bytes设置,默认值为10MB)

3 结语

愉快的周末即将结束,挣扎完后,依然需要昂首前行,辛苦成文,各自珍惜!谢谢!

版权声明:本套技术专栏是作者(秦凯新)平时工作的总结和升华,通过从真实商业环境抽取案例进行总结和分享,并给出商业应用的调优建议和集群环境容量规划等内容,请持续关注本套博客。版权声明:禁止转载,欢迎学习。QQ邮箱地址:1120746959@qq.com,如有任何商业交流,可随时联系。

秦凯新 201811252328

这篇关于kafka日志索引存储及Compact压实机制深入剖析-kafka 商业环境实战的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/441265

相关文章

SpringBoot3.X 整合 MinIO 存储原生方案

《SpringBoot3.X整合MinIO存储原生方案》本文详细介绍了SpringBoot3.X整合MinIO的原生方案,从环境搭建到核心功能实现,涵盖了文件上传、下载、删除等常用操作,并补充了... 目录SpringBoot3.X整合MinIO存储原生方案:从环境搭建到实战开发一、前言:为什么选择MinI

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

浅谈mysql的not exists走不走索引

《浅谈mysql的notexists走不走索引》在MySQL中,​NOTEXISTS子句是否使用索引取决于子查询中关联字段是否建立了合适的索引,下面就来介绍一下mysql的notexists走不走索... 在mysql中,​NOT EXISTS子句是否使用索引取决于子查询中关联字段是否建立了合适的索引。以下

Python办公自动化实战之打造智能邮件发送工具

《Python办公自动化实战之打造智能邮件发送工具》在数字化办公场景中,邮件自动化是提升工作效率的关键技能,本文将演示如何使用Python的smtplib和email库构建一个支持图文混排,多附件,多... 目录前言一、基础配置:搭建邮件发送框架1.1 邮箱服务准备1.2 核心库导入1.3 基础发送函数二、

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

PowerShell中15个提升运维效率关键命令实战指南

《PowerShell中15个提升运维效率关键命令实战指南》作为网络安全专业人员的必备技能,PowerShell在系统管理、日志分析、威胁检测和自动化响应方面展现出强大能力,下面我们就来看看15个提升... 目录一、PowerShell在网络安全中的战略价值二、网络安全关键场景命令实战1. 系统安全基线核查

C++ Log4cpp跨平台日志库的使用小结

《C++Log4cpp跨平台日志库的使用小结》Log4cpp是c++类库,本文详细介绍了C++日志库log4cpp的使用方法,及设置日志输出格式和优先级,具有一定的参考价值,感兴趣的可以了解一下... 目录一、介绍1. log4cpp的日志方式2.设置日志输出的格式3. 设置日志的输出优先级二、Window

Spring事务传播机制最佳实践

《Spring事务传播机制最佳实践》Spring的事务传播机制为我们提供了优雅的解决方案,本文将带您深入理解这一机制,掌握不同场景下的最佳实践,感兴趣的朋友一起看看吧... 目录1. 什么是事务传播行为2. Spring支持的七种事务传播行为2.1 REQUIRED(默认)2.2 SUPPORTS2

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.