当前位置: 首页 > news >正文

Kafka服务端日志详解

文章目录

  • 服务端日志
    • Topic消息存储方式
      • 主体介绍
      • log文件追加记录消息
      • index和timeindex索引文件
    • 日志文件清理
    • Kafka的文件高效读写机制
      • Kafka的文件结构
      • 顺序写磁盘
      • 零拷贝
    • 合理配置刷盘频率
    • 客户端消费进度管理

服务端日志

Kafka的日志信息是通过conf/server.properties文件中的log.dirs配置项来配置的

在这里插入图片描述



Topic消息存储方式

主体介绍

进入到上方配置文件中指定的目录下查看,topic的数据都是以topic名 + partition下标的命名方式保存的

在这里插入图片描述



我们现在进入其中一个partition目录

在这里插入图片描述



  • .index

    日志索引文件,采用的稀疏索引提高查询效率,记录的是消息偏移量offset 和 该消息在.log文件中的位置position

  • .log

    消息保存在.log文件中,是以二进制的方式保存的。可以通过.index和.timeindex两个索引文件加速查找消息

    文件大小是(log.segment.bytes参数设定)默认1GB,新文件名是第一条消息的offset.log

  • .timeindex

    日志索引文件,采用的也是稀疏索引结构,每隔一段时间保存一条索引记录,记录的是消息产生的时间戳timestamp和消息偏移量offset

  • .snapshot

    快照,可以理解为一个备份文件

  • leader-epoch-checkpoint

    Leader partition新上任就会往该文件中写入一个epoch,来保证HW的一致性

  • partition.metadata

    保存着该partition对应的topic_id



最后两个文件可以直接查看,就记录的一些简单的信息

[root@worker1 disTopic-0]# cat leader-epoch-checkpoint 
0
3
5 0
9 6
14 18[root@worker1 disTopic-0]# cat partition.metadata 
version: 0
topic_id: rDUdZBO7RH2GNPgdRXk7Tw



而前三个文件是以二进制的方式保存的,需要通过Kafka提供的kafka-dump-log.sh来查看文件内容,如下所示

# 保存的是消息产生的时间戳 和 消息offset
[root@worker3 testTopic-0]# kafka-dump-log.sh --files 00000000000000000000.timeindex
Dumping 00000000000000000000.timeindex
timestamp: 1723254597947 offset: 51
timestamp: 1723254598224 offset: 102
timestamp: 1723254598501 offset: 152
timestamp: 1723254598816 offset: 201
timestamp: 1723254599085 offset: 250# 保存是的消息的offset 和 该消息在.log文件中对应的position位置
[root@worker3 testTopic-0]# kafka-dump-log.sh --files 00000000000000000000.index
Dumping 00000000000000000000.index
offset: 51 position: 4160
offset: 102 position: 8324
offset: 152 position: 12428
offset: 201 position: 16544
offset: 250 position: 20660
offset: 299 position: 24776# 每一条记录保存的是一批消息信息,只不过我下面刚好都只保存一条消息
[root@worker3 testTopic-0]# kafka-dump-log.sh --files 00000000000000000000.log
baseOffset: 50 lastOffset: 50 count: 1 baseSequence: 0 lastSequence: 0 producerId: 5001 producerEpoch: 0 partitionLeaderEpoch: 0 isTransactional: false isControl: false deleteHorizonMs: OptionalLong.empty position: 4080 CreateTime: 1723254597907 size: 80 magic: 2 compresscodec: none crc: 672861010 isvalid: true
baseOffset: 51 lastOffset: 51 count: 1 baseSequence: 1 lastSequence: 1 producerId: 5001 producerEpoch: 0 partitionLeaderEpoch: 0 isTransactional: false isControl: false deleteHorizonMs: OptionalLong.empty position: 4160 CreateTime: 1723254597947 size: 80 magic: 2 compresscodec: none crc: 3136762717 isvalid: true
baseOffset: 52 lastOffset: 52 count: 1 baseSequence: 2 lastSequence: 2 producerId: 5001 producerEpoch: 0 partitionLeaderEpoch: 0 isTransactional: false isControl: false deleteHorizonMs: OptionalLong.empty position: 4240 CreateTime: 1723254597951 size: 80 magic: 2 compresscodec: none crc: 3076149845 isvalid: true



log文件追加记录消息

  • .log文件是以追加的方式写入新的消息日志。position表示写入位置,size表示消息的总长度,通过这两个值就能从一段二进制中获取到一条具体的消息。
  • Kafka中的消息日志,只允许追加,不允许删除和修改。
  • log文件的固定大小是log.segment.bytes参数设定,默认1GB。新创建的文件是以写入第一条消息的offset作为的文件名



index和timeindex索引文件

index和timeindex索引文件目的都是为了加快从log文件中读取消息的效率,如下图所示,

在这里插入图片描述



  • index和timeindex文件是以相对偏移量的方式建立的log消息日志数据索引

    比如说0000.index和 0947.index索引文件中的内容offset都是以0开始计数的,使用的是第一条消息的相对偏移量,而消息绝对偏移量=文件名+相对偏移量

  • index和timeindex文件采用的是类似于数据的跳表,并不是每一条消息都会记录一条索引。

    log.index.interval.bytes决定.log文件中产生多少大小的消息就生成一条index记录 官网 服务端的参数说明

    log.index.interval.bytes
    The interval with which we add an entry to the offset indexType:	int
    Default:	4096 (4 kibibytes)
    



index文件的作用类似于数据结构中的跳表,他的作用是用来加速查询log文件的效率。而timeindex文件的作用则是用来进行一些跟时间相关的消息处理。比如文件清理。



日志文件清理

Kafka为了防止过多的日志文件给服务器带来过大的压力,他会定期删除过期的log文件。



判断那些日志文件过期了

  • log.retention.check.interval.ms

    定时检测文件是否过期。默认是 300000毫秒,也就是五分钟。 在检查文件是否超时时,是以每个.timeindex中最大的那一条记录为准。

  • log.retention.hours , log.retention.minutes, log.retention.ms 。

    这一组参数表示文件保留多长时间。默认生效的是log.retention.hours,默认值是168小时,也就是7天。如果设置了更高的时间精度,以时间精度最高的配置为准。

官网 服务端的参数说明

# 日志清除程序检查是否有日志符合删除条件的频率(以毫秒为单位)
log.retention.check.interval.ms
Type:	long
Default:	300000 (5 minutes)# 在删除日志文件之前保留它的小时数(以小时为单位),仅次于log.retention.ms属性
log.retention.hours
Type:	int
Default:	168# 在删除日志文件之前保留日志文件的分钟数(以分钟为单位),仅次于log.retention.ms属性。如果没有设置,则使用log.retention.hours中的值
log.retention.minutes
Type:	int
Default:	null# 日志文件删除前保留的毫秒数(以毫秒为单位),如果未设置,则使用log.retention.minutes中的值。如果设置为-1,则不应用时间限制。
log.retention.ms
Type:	long
Default:	null



过期的日志文件如何处理

# 日志清理策略。有两个选项,delete表示删除日志文件。 compact表示压缩日志文件。
log.cleanup.policy
Type:	list
Default:	delete
Valid Values:	[compact, delete]# 日志删除前的最大容量
# 当log.cleanup.policy选择delete时  当总的日志文件大小超过这个阈值后,就会删除最早的日志文件。默认是-1,表示无限大。
log.retention.bytes
Type:	long
Default:	-1



Kafka的文件高效读写机制

Kafka的文件结构

kafka的数据文件结构可以加速日志文件的读取。

Topic下的多个partition采用的是单独记录日志文件,这样加快了topic下的数据读取

通过.index索引文件的稀疏索引结构,进一步加快日志检索速度。



顺序写磁盘

对每个Log文件,Kafka会提前规划固定的大小,这样在申请文件时,可以提前占据一块连续的磁盘空间。

Kafka的log文件只能以追加的方式往文件的末端添加(这种写入方式称为顺序写)



零拷贝

零拷贝是Linux操作系统提供的一种IO优化机制,而Kafka大量的运用了零拷贝机制来加速文件读写。

零拷贝就是配合内核态的复制机制,减少用户态和内核态之间的内容拷贝

传统的一次硬件IO是这样工作的。如下图所示:

在这里插入图片描述



零拷贝主要有两种实现机制

1、mmap文件映射机制

不再将整个文件复制进用户态,而是用户态只持有一个文件的映射信息,通过这个映射信息控制内核态的文件读写。

java中大量使用该方式 ,可以参考下JDK中的DirectByteBuffer实现机制

适用于文件不超过2G的文件,所以Kafka将日志文件设计成1G

在这里插入图片描述



2、sendfile文件传输机制

用户态连文件索引都不读取,直接向内核态发送一个sendfile指令,让内核态去进行文件拷贝

例如当Consumer要从Broker上poll消息时,Broker不需要对消息进行任何的加工,用户态就只需要往内核态发一个sendfile指令,而不需要有任何的数据拷贝过程。Kafka大量的使用了sendfile机制,用来加速对本地数据文件的读取过程。

在这里插入图片描述

JDK中8中java.nio.channels.FileChannel类提供了transferTo和transferFrom方法,底层就是使用了操作系统的sendfile机制。



合理配置刷盘频率

应用程序读取文件是从内核态的pageCache中读取的,保存文件是最终只能保存到pageCache中,应用程序不能直接操作pageCache。而pageCache中的数据如果还没有来得及刷盘持久化到磁盘,服务器忽然非正常断电,那么pageCache中的数据就会丢失。

应用程序唯一能做的就是频繁的调用OS提供的fsync()通知OS进行刷盘操作,但是则会降低应用的执行性能。所以应用程序需要在数据安全和高性能上做取舍。

Kafka在服务端设计了几个参数,来控制刷盘的频率:

这里可以看到,Kafka为了最大化性能,默认是将刷盘操作交由了操作系统进行统一管理。

# 多长时间进行一次强制刷盘。默认是Long.MAX。
flush.ms
Type:	long
Default:	9223372036854775807
Valid Values:	[0,...]# 表示当同一个Partiton的消息条数积累到这个数量时,就会申请一次刷盘操作。默认是Long.MAX。
log.flush.interval.messages
Type:	long
Default:	9223372036854775807
Valid Values:	[1,...]#当一个消息在内存中保留的时间,达到这个数量时,就会申请一次刷盘操作。他的默认值是空。如果这个参数配置为空,则生效的是下一个参数。
log.flush.interval.ms
Type:	long
Default:	null# 日志刷新程序检查是否需要将日志刷新到磁盘的频率(以毫秒为单位),默认也是Long.MAX。
log.flush.scheduler.interval.ms
Type:	long
Default:	9223372036854775807



客户端消费进度管理

消费者消费消息的进度被保存在一个名称为__consumer_offsets内置的topic中,该topic默认会创建50个分区partition

在这里插入图片描述



该topic在zookeeper也能查看到相应的信息,只不过zookeeper上只是简单记录了partition的Leader和ISR列表,并没有看见真实消费者的消费进度

在这里插入图片描述



既然这也是一个topic下的partition,我们启动一个消费者来消费其中的消息看看

可以看到下面记录的消息内容就是一个key-value的格式,key为消费者组+topic+partition 而value保存则offset和一些元数据信息

也就是说这里记录了消费者组在某个topic下的partition的消息消费偏移量offset

[root@worker1 ~]# kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic __consumer_offsets --from-beginning --formatter "kafka.coordinator.group.GroupMetadataManager\$OffsetsMessageFormatter"[test,disTopic,0]::OffsetAndMetadata(offset=6, leaderEpoch=Optional[5], metadata=, commitTimestamp=1723081907174, expireTimestamp=None)
[test,disTopic,3]::OffsetAndMetadata(offset=6, leaderEpoch=Optional[7], metadata=, commitTimestamp=1723081907275, expireTimestamp=None)
[test,disTopic,1]::OffsetAndMetadata(offset=3, leaderEpoch=Optional[1], metadata=, commitTimestamp=1723081907275, expireTimestamp=None)
[test,disTopic,2]::OffsetAndMetadata(offset=11, leaderEpoch=Optional[4], metadata=, commitTimestamp=1723081907275, expireTimestamp=None)
[test,disTopic,0]::OffsetAndMetadata(offset=6, leaderEpoch=Optional[5], metadata=, commitTimestamp=1723081907275, expireTimestamp=None)
[test,disTopic,3]::OffsetAndMetadata(offset=6, leaderEpoch=Optional[7], metadata=, commitTimestamp=1723081907377, expireTimestamp=None)
[test,disTopic,1]::OffsetAndMetadata(offset=3, leaderEpoch=Optional[1], metadata=, commitTimestamp=1723081907377, expireTimestamp=None)



而这些Offset数据,其实也是可以被消费者修改的,在之前章节已经演示过消费者如何从指定的位置开始消费消息。而一旦消费者主动调整了Offset,Kafka当中也会更新对应的记录。

另外,这个系统Topic里面的数据是非常重要的,因此Kafka在消费者端也设计了一个参数来控制这个Topic应该从订阅关系中剔除。

public static final String EXCLUDE_INTERNAL_TOPICS_CONFIG = "exclude.internal.topics";
private static final String EXCLUDE_INTERNAL_TOPICS_DOC = "Whether internal topics matching a subscribed pattern should " +"be excluded from the subscription. It is always possible to explicitly subscribe to an internal topic.";
public static final boolean DEFAULT_EXCLUDE_INTERNAL_TOPICS = true;

相关文章:

Kafka服务端日志详解

文章目录 服务端日志Topic消息存储方式主体介绍log文件追加记录消息index和timeindex索引文件 日志文件清理Kafka的文件高效读写机制Kafka的文件结构顺序写磁盘零拷贝 合理配置刷盘频率客户端消费进度管理 服务端日志 Kafka的日志信息是通过conf/server.properties文件中的log…...

C++ 数据语义学——进程内存空间布局

进程内存空间布局 1. 栈(堆栈/栈区)2. 堆(堆区)3. BSS段4. 数据段5. 代码段进程内存空间布局示意图可执行文件的内存布局示例代码 当把一个可执行文件加载到内存后,就变成了一个进程。这个虚拟空间(内存&am…...

【数据结构】六、图:2.邻接矩阵、邻接表(有向图、无向图、带权图)

二、存储结构 文章目录 二、存储结构❗1.邻接矩阵1.1无向图❗邻接矩阵-无向图代码-C 1.2有向图❗邻接矩阵-有向图代码-C 1.3带权图1.4性能分析1.5相乘 ❗2.邻接表2.1无向图2.2有向图❗邻接表-C 邻接矩阵VS邻接表邻接矩阵邻接表 ❗1.邻接矩阵 图的邻接矩阵(Adjacency Matrix) 存…...

财务会计与管理会计(三)

文章目录 销售回款提成表MATCH函数的模糊查询在提成类业务中的应用 营业收入分类数据分析OFFSET函数在制作图表数据中的应用 自动生成销售记录对账单VLOOKUP函数的应用 销售回款提成表 MATCH函数的模糊查询在提成类业务中的应用 G3INDEX(I$1:M$1,MATCH(E3,H3:M3,1)) G3INDEX(…...

【数据结构和算法】(基础篇三)——栈和队列

栈和队列 栈(Stack)和队列(Queue)是两种非常基本的数据结构,它们主要用于存储和检索元素。尽管它们都用于管理一组数据项,但它们的访问规则和数组都是不同的。 栈 栈是一种后进先出(Last In,…...

Linux截图工具gsnap移植arm平台过程记录

Linux截图工具gsnap移植arm平台过程记录 最近工作中一款新产品开发接近尾声,需要写文档截图产品图形,找了一款开源的Linux截屏工具gsnap,将其移植到ARM产品中,这里记录一下移植过程。 gsnap 这个工具源代码就是一个C语言源文件&a…...

密码学知识点02

#来自ウルトラマンレオ(雷欧) 1 常见加密方式 2 对称加密 采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。 常见加密算法: DES : Data…...

实现Pytest测试用例按顺序循环执行多次

要实现测试用例按顺序循环执行多次,可以使用 pytest 的自定义装饰器或插件。这里有两种方法可以实现这个需求: 方法一:使用 pytest-repeat 插件 pytest-repeat 插件允许你重复执行测试用例。你可以使用 --count 参数来指定每个测试用例的执…...

SVN工作原理和使用示例

SVN(Subversion)是另一种版本控制系统,用于管理项目文件及其变更历史。与Git不同,SVN是集中式版本控制系统,这意味着所有版本控制操作都集中在一个中央服务器上。以下是SVN的工作原理和基本使用示例。 目录 SVN 工作…...

云服务器部署Java+Vue前后端分离项目

1、申请一个云服务器 选择云服务器:阿里云、腾讯云、百度云、京东云、华为云等等,我使用的是阿里云服务器。 2、远程链接服务器 使用FinalShell工具或者其他远程工具,使用SSH链接,主机地址要填写阿里云服务的公网ip,如…...

C++的7种设计模式原则

一、设计模式前言 设计模式(Design Patterns)的“模式”指的是一种在软件设计中经过验证的、解决特定问题的方案。它们不是具体的代码,而是解决常见设计问题的抽象方案或模板。设计模式提供了一种标准的方式来组织代码,以提高代码…...

24.8.5数据结构|栈

栈-弹夹 1、定义: 栈就是特殊的线性表,与之前的线性表的区别就是增加了约束,只允许在一端插入和删除,就这麽简单。 2、基本操作 栈的插入操作叫:入栈{进栈、压栈};栈的删除:出栈{退栈&#x…...

LeetCode算法题训练

力扣刷题训练 开始记录力扣的刷题之路 刷题思路来自灵茶山艾府 入门题单: 「新」动计划 编程入门编程基础 0 到 1 训练方法 A 滑动窗口(定长/不定长/多指针)二分算法(二分答案/最小化最大值/最大化最小值/第K小&#xff09…...

Python | Leetcode Python题解之第326题3的幂

题目: 题解: class Solution:def isPowerOfThree(self, n: int) -> bool:return n > 0 and 1162261467 % n 0...

手机CPU性能天梯图(2024年8月),含安兔兔/GB6/3DMark跑分

原文地址(高清无水印原图/持续更新/含榜单出处链接): 2024年8月手机处理器天梯图 2024年8月1日更新日志:由于近期并未有新处理器发布,故只做常规更新;移除鲁大师天梯图;补充其它天梯图数量。 -…...

通过实际的例子和代码演示,可以更好地理解 `optional` 的使用方式和应用场景

当然,让我们通过一些实际的例子来演示 std::optional 的使用方式和应用场景。 场景 1:函数返回值 假设我们有一个函数,它尝试从字符串中解析一个整数,但如果字符串不是一个有效的整数,我们希望返回一个错误状态。 #…...

Java 电商秒杀系统优化实战:实现进阶示例详解与 RabbitMQ 配置

上一篇博客介绍了使用消息队列、异步处理等技术构建 Java 电商秒杀系统的基本思路,本文将进一步优化代码实现,并提供更详细的代码示例和 RabbitMQ 配置,助您构建更健壮、高效的秒杀系统。 一、 代码优化 1. 接口限流 在 SeckillController…...

路径规划 | 基于狼群算法的无人机路径规划(Matlab)

目录 效果一览基本介绍程序设计参考文献 效果一览 基本介绍 路径规划 | 基于狼群算法的无人机路径规划(Matlab) 狼是一种群居性动物,社会分工明确,通过承担各自的责任与团结协作,共同促进整个狼群的生存与发展。狼群算…...

13-python函数返回值和装包的后续提取数据方法——解包

1.1 参数解包 不定长参数简单来讲就是装包,把多个参数装到一个元组或者装到字典中,就叫做装包 Ctrld可以快速向下复制 传递实参时,也可以在序列类型的参数前添加星号,这样他会自动将序列中的元素依次作为参数传递 注意&#x…...

I. 对线

https://codeforces.com/gym/103186/problem/I 一开始感觉操作挺复杂的 但是写过Chino的数列 - 洛谷 发现可以通过矩阵来实现swap操作,就想能不能用线段树维护矩阵来写 有三排兵线,我们维护区间和,因此初始矩阵就有了 接下来分析每个操作的…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...