分布式专题——23 Kafka日志索引详解 - 指南

news/2025/9/28 10:42:21/文章来源:https://www.cnblogs.com/tlnshuju/p/19116269

分布式专题——23 Kafka日志索引详解 - 指南

2025-09-28 10:38  tlnshuju  阅读(0)  评论(0)    收藏  举报

1 Kafka 的日志文件记录机制

  • Kafka 的日志文件记录机制是其能支撑高吞吐、高性能、高可扩展的核心所在,对业界影响巨大;
  • 每个 Broker 节点的消息数据(称为 Log 日志)是无状态的,这种无状态设计让 Kafka 集群易于水平扩展,比如可通过工具(如 kafka-reassign-partitions.sh)将无状态数据从旧 Broker 转移到新 Broker 以替换服务(数据转移并非简单复制粘贴,因底层是二进制文件,操作复杂)。

1.1 Topic存储消息的方式

1.1 log 文件记录消息的方式

  • 追加写入:在每个文件内部,Kafka 以追加的方式将消息写入 log 日志文件。Kafka 中的消息日志只允许追加操作,不支持删除和修改。因此,只有文件名最大的一个 log 文件是当前用于写入消息的日志文件,其他文件都是不可修改的历史日志;
  • 固定大小与文件命名:每个 log 文件保持固定的大小。当当前文件无法再记录新消息时,会重新创建一个 log 文件,并且以这个新 log 文件写入的第一条消息的偏移量来命名。这种设计是为了更方便地进行文件映射,从而加快读取消息的效率。

1.2 index和timeindex文件加速读取log消息日志

在这里插入图片描述

2 文件清理机制

  • Kafka 为避免过多日志文件给服务器带来压力,会定期删除过期的 log 文件,涉及以下配置属性:

    • log.retention.check.interval.ms:定时检测文件是否过期的时间间隔,默认是 300000 毫秒(即 5 分钟);

    • log.retention.hourslog.retention.minuteslog.retention.ms:这一组参数用于设置文件保留的时间。默认生效的是 log.retention.hours,默认值为 168 小时(即 7 天)。如果设置了更高时间精度的参数,以时间精度最高的配置为准;

    • 检查文件是否超时时,以每个 .timeindex 文件中最大的那条记录为准;

  • 过期日志文件的处理

    • log.cleanup.policy:日志清理策略,有两个选项。delete 表示删除日志文件;compact 表示压缩日志文件;

    • log.cleanup.policy 选择 delete 时,还有一个参数 log.retention.bytes,用于表示所有日志文件的大小。当总的日志文件大小超过这个阈值后,就会删除最早的日志文件,默认值是 -1,表示无大小限制;

    • 压缩日志文件不会直接删除日志文件,但会造成消息丢失。压缩过程中会将 Key 相同的日志进行压缩,只保留最后一条。

3 客户端消费进度管理

4 Kafka 的文件高效读写机制

4.1 Kafka 的文件结构

4.2 顺序写磁盘

  • 这一特性和操作系统有关,主要由硬盘结构决定;
  • 对于每个 log 文件,Kafka 会提前规划固定的大小,这样在申请文件时,能够提前占据一块连续的磁盘空间;
  • Kafka 的 log 文件只能以追加的方式往文件的末端添加(这种写入方式称为顺序写)。新的数据写入时,可直接往之前申请的磁盘空间中写入,无需再去磁盘其他地方寻找空闲空间(普通的读写文件需要先寻找空闲的磁盘空间,再写入,这种写入方式称为随机写)。因为磁盘的空闲空间可能不连续,存在很多文件碎片,所以随机写的效率会很低;
  • Kafka 官网测试数据表明,同样的磁盘,顺序写速度能达到 600M/s,基本与写内存的速度相当;而随机写的速度只有 100K/s,两者差距很大。

4.3 零拷贝

4.4 合理配置刷盘频率

  • 缓存数据断电会丢失,若缓存中的数据未及时写入硬盘(刷盘),服务突然崩溃时就可能丢失消息。通常认为最安全的方式是写一条数据就刷一次盘(同步刷盘),刷盘操作在 Linux 系统中对应 fsync 系统调用;

    fsync, fdatasync - synchronize a file's in-core state with storage device

    上面这是 Linux 系统中关于 fsyncfdatasync 函数的手册页(Manual Page)相关内容

    • 这里的in-core state指的是操作系统内核态的缓存,即 PageCache,这是应用程序接触不到的缓存;
    • 应用程序打开文件时,内容从 PageCache 中读取;修改文件内容时,也是先写到 PageCache 里,之后操作系统会通过自身缓存管理机制,在未来某个时刻将 PageCache 里的内容统一写入磁盘;
    • 对于缓存断掉导致数据丢失的问题,应用程序无法决定数据何时写入硬盘,只能尽量频繁通知操作系统进行刷盘操作,但这会降低应用执行性能,且不能百分百保证数据安全,应用程序在这个问题上只能取舍;
  • Kafka 在 Broker 端设计了一系列参数来控制刷盘频率:

    • flush.ms:指定强制刷盘的时间间隔。例如设置为 1000,就会在 1000 毫秒后执行 fsync。一般建议不设置该参数,利用复制(replication)保证数据持久性,让操作系统的后台刷盘能力发挥作用,因为这样更高效;

    • log.flush.interval.messages:表示同一个 Partition 的消息数积累到该数量时,就会申请一次刷盘操作,默认是 Long.MAX

    • log.flush.interval.ms:当一个消息在内存中保留的时间达到该数量时,就会申请一次刷盘操作,默认值为空,若为空则生效下一个参数;

    • log.flush.scheduler.interval.ms:检查是否有日志文件需要进行刷盘的频率,默认是 Long.MAX

  • 为了最大化性能,Kafka 默认将刷盘操作交由操作系统统一管理;

  • Kafka 没有实现写一个消息就进行一次刷盘的“同步刷盘”机制,无法保证非正常断电情况下的消息安全,这是所有应用程序都面临的问题;

    • RabbitMQ 官网明确提出服务端并不完全保证消息不丢失,若要提升消息安全性,需通过 Publisher Confirms 机制让客户端参与验证;
    • RocketMQ 提供了“同步刷盘”的配置选项,但每来一个消息就调用一次刷盘操作,服务器难以承受,后续可关注 RocketMQ 如何实现同步刷盘。

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

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

相关文章

Agent的九种设计模式 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

牛客刷题-Day6

动态规划1:线性dp、背包问题,区间 https://ac.nowcoder.com/acm/contest/24213?from=acdiscuss牛客刷题-Day5 今日刷题:\(1026-1030\) 1026 合并回文子串 题目描述 输入两个字符串 \(A\) 和 \(B\),合并成一个串 \…

长治网站制作小程序企业网站 响应式 案例

维秘柔情内裤性感/舒适/健康/透气 复制代码 维秘柔情不仅仅是商品质材料和考究的设计,更是一个坚守生活美学的理念,总有一款维秘柔情告诉你的身体密码。从此之前所用,皆为将就。从此之前所见,皆为平常。 在内裤不再是遮掩的这个时…

临潼城市建设局网站珠海建设网站的公司哪家好

洞悉技术的本质,享受科技的乐趣 第一篇,我的感受就是 耗叔是一个热爱技术,可以通过代码找到快乐的技术人。 作为it从业者,我们如何可以通过代码找到快乐呢?这是一个问题? 至少目前,我还没有这种…

python占用指定比例CPU

# author: xiaoyang # date: 2025/09/28import os import sys import time from multiprocessing import Processdef ac_cpu(timeout=None):t0 = time.time()while timeout and time.time() - t0 < timeout:1024 **…

Modbus RTU TCP 拓扑

Modbus RTU TCP 拓扑关键词:Modbus-RTU-Master&Modbus-RTU-Slave, station Modbus-TCP-Server&Modbus-TCP-Client Socket-TCP-Server&TCP-Client, host

数字化转型浪潮下:10款主流项目管理工具横向测评与选型指南

数字化转型浪潮下:10款主流项目管理工具横向测评与选型指南 在数字化转型加速推进的当下,项目管理工具已成为企业提升协作效率的关键基础设施。根据Gartner最新调研数据显示,2023年全球项目管理软件市场规模已达59.…

借助Aspose.Email,使用 Python 将 EML 转换为 MHTML

如果您正在寻找编程式​​电子邮件文件处理方法,那么本指南非常适合您。Aspose.Email是一个强大的电子邮件文件转换 SDK。它提供电子邮件管理、编辑和转换功能。在本篇教程中,我们将学习如何借助Aspose.Emai使用 Pyt…

简述电子商务网站开发的基本流程总部在深圳的互联网公司

来源&#xff1a;物联网智库整理发布摘要&#xff1a;当互联网的上半场结束之后&#xff0c;所有的互联网下半场都是重生意。随着AIoT越来越热门&#xff0c;这一概念已然成为巨头、资本以及新兴企业竞相角逐的热点。2019年注定是AIoT具有重要发展的一年&#xff0c;仅仅在刚过…

python+springboot+django/flask的医院食堂订餐系统 菜单发布 在线订餐 餐品管理与订单统计系统 - 教程

python+springboot+django/flask的医院食堂订餐系统 菜单发布 在线订餐 餐品管理与订单统计系统 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: bl…

计算机网络学习笔记 - 浪矢

最近在看b站计算机网络微课堂的课,对我一个数学系的学生而言,感觉讲的非常生动形象,所以忍不住做了点笔记。 首先是计算机网络体系结构的划分:包括OSI体系结构和TCP/IP体系结构,OSI结构是将网络接口层细分为了物理…

数据结构以及LeetCode常用方法 - 浪矢

序: 马上要秋招了,作为一个数学系的学生想找一份研发类的工作确实需要做一些准备,现在开始重新梳理一下CS的知识。首先,从高中学NOIP常用的数据结构开始吧,从易到难慢慢来~ 目录存储结构数组链表常用方法线性数据…

App Store 上架完整流程解析,iOS 应用发布步骤、ipa 文件上传工具、TestFlight 测试与苹果审核经验

本文全面解析 App Store 上架流程,涵盖账号注册、证书管理、应用打包、ipa 文件上传、TestFlight 测试到苹果审核与发布的完整步骤,结合实战案例,总结高效实用的 iOS 应用发布经验。在移动互联网行业中,App Store …

使用 Zig 编写英文数字验证码识别工具

一、项目概述 英文数字验证码识别是一项实用性强的图像处理任务,常见于反自动化注册与安全验证系统中。本项目使用 Zig 语言调用外部 OCR 引擎(Tesseract),并进行基础文件读写与错误处理,完成验证码识别功能。 二…

建设部勘察设计网站建筑八大员证有哪些

在软件开发领域&#xff0c;敏捷开发和V模型开发是两种主要的开发方法。它们之间的差异主要体现在开发过程的结构和组织方式上。在以下讨论中&#xff0c;我们将深入探讨这两种方法的特点和差异。 敏捷开发 敏捷开发是一种迭代和增量的软件开发方法&#xff0c;它强调灵活性和…

北京矿建建设集团有限公司 网站搜索引擎推广的效果

2017年10月25日中圳德兴(北京)防锈材料有限公司成为美国RUST-X中国总经销商。RUST-X采用先进的VCI气相防锈技术自主研发一系列VCI气相防锈产品&#xff0c;产品主要特点是&#xff1a;具有接触防锈和不接触防锈双重保护屏障,所有产品均无毒、环保、可生物降解。RUST-X拥有500多…

怎么用ppt做网站网站建设职位有什么

文章目录 《TVM编译器原理与实践》编辑推荐内容简介作者简介目录前言/序言获取方式 随着人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;在全世界信息产业中的广泛应用&#xff0c;深度学习模型已经成为推动AI技术革命的关键。TensorFlow、PyTorch、MX…

可口可乐网站建设目的丽江建设工程信息网站

驱动 以来内核编译&#xff0c;依赖内核执行 驱动可以同时执行多份代码 没main 驱动是依赖内核的框架和操作硬件的过程 一&#xff0c;Linux系统组成 app: [0-3G] ---------------------------------系统调用&#xff08;软中断…

购物网站主页怎么做c 网站开发案例

一、说明 与常规数学一样&#xff0c;数组算术本质上是关于加法、减法、乘法和除法。在 中NumPy&#xff0c;此类操作是按元素执行的 [2]&#xff1a; NumPy 是 Numerical Python 的缩写&#xff0c;是 Python 生态系统中一个功能强大的库&#xff0c;它提供对大型多维数组和矩…