Kafka Log存储解析以及索引机制

news2024/11/22 13:39:09

1.概述

  在Kafka架构,不管是生产者Producer还是消费者Consumer面向的都是Topic。Topic是逻辑上的概念,而Partition是物理上的概念。每个Partition逻辑上对应一个log文件,该log文件存储是Producer生产的数据。Producer生产的数据被不断追加到该log文件末端,且每条数据都有自己的offset。Kafka对于log文件是采取分片和索引机制。

2.Kafka的topic

启动kafka集群,集群中有三台Broker; 设置3个分区,3个副本;

2.1 创建hy-test-topic

bin/kafka-topics.sh --bootstrap-server hadoop102:9092 --create --replication-factor 3 --partitions 3 --topic hy-test-topic

2.2 发送消息到topic

public static void main(String[] args) {
    //1.创建kakfa生产者的配置对象
    Properties prop = new Properties();
    //2.给生产者配置对象添加配置信息
    prop.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,"hadoop102:9092");
    prop.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,"org.apache.kafka.common.serialization.StringSerializer");
    prop.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,"org.apache.kafka.common.serialization.StringSerializer");
    prop.put(ProducerConfig.BATCH_SIZE_CONFIG, 16384);
    prop.put(ProducerConfig.LINGER_MS_CONFIG, 1);
    prop.put(ProducerConfig.BUFFER_MEMORY_CONFIG,33554432);
    //3.创建生产者对象
    KafkaProducer<String, String> kafkaProducer = new KafkaProducer<>(prop);
    //4.调用send方法,发送消息
    for (int i = 0; i < 5; i++) {
        kafkaProducer.send(new ProducerRecord<String,String>("hy-test-topic",Integer.toString(i),Integer.toString(i)));
    }
    //5.关闭资源
    kafkaProducer.close();
}

查看log.dirs

在这里插入图片描述

2.3 查看topic的分区和副本

bin/kafka-topics.sh --bootstrap-server hadoop102:9092 --describe --topic hy-test-topic

在这里插入图片描述
可以看出:

  • 分区Partition-0 在broker.id=4中,其余都是副本 Replicas 2,3
  • 分区Partition-1 在broker.id=2中,其余都是副本 Replicas 3,4
  • 分区Partition-2 在broker.id=3中,其余都是副本 Replicas 4,2

通过zookeeper查看leader在那个broker上

[zk: localhost:2181(CONNECTED) 14] get /kafka/brokers/topics/hy-test-topic/partitions/0/state

{"controller_epoch":49,"leader":4,"version":1,"leader_epoch":0,"isr":[4,2,3]}

2.4 分区文件

在这里插入图片描述
在这里插入图片描述

名称描述类型默认
log.segment.bytes单个日志文件的最大大小int1073741824(1G)

继续发送消息会生成新的segment

在这里插入图片描述

可以看出

  • 第一个segment文件00000000000000000000.log快要达到 log.segment.bytes时,开始创建 00000000000000001187.log
  • .log.index.timeindex文件是一起出现; 并且名称是以文件第一个offset命名的。
  • .log存储消息文件
  • .index存储消息的索引
  • .timeIndex,时间索引文件,通过时间戳做索引

2.5 分区下文件内容

使用kafka自带工具bin/kafka-run-class.sh 来读取分区下的文件内容

2.5.1 消息文件.log
bin/kafka-run-class.sh kafka.tools.DumpLogSegments --files 00000000000000000000.log

在这里插入图片描述

最后一行显示的是

baseOffset: 1186  position: 1072277020 CreateTime: 1695792070168
2.5.2 消息索引文件.index
bin/kafka-run-class.sh kafka.tools.DumpLogSegments --files 00000000000000000000.index

在这里插入图片描述

offset: 1186 position: 1072277020
2.5.3 时间索引文件.timeindex
/opt/module/kafka/bin/kafka-run-class.sh kafka.tools.DumpLogSegments --files 00000000000000000000.timeindex

在这里插入图片描述

2.5.4 Kafka如何查找指定offset的Message

借用博主@lizhitao 博客上的一张图来展示是如何查找Message的。

在这里插入图片描述

比如:要查找绝对offset为7的Message:

  • 首先是用二分查找确定它是在哪个LogSegment中,自然是在第一个Segment中。
  • 打开这个Segment的index文件,用二分查找找到offset小于或者等于指定offset的索引条目中最大的那个offset。自然offset为6的那个索引是我们要找的,通过索引文件我们知道offset为6的Message在数据文件中的位置为9807。
  • 打开数据文件,从位置为9807的那个地方开始顺序扫描直到找到offset为7的那条Message。

该机制是建立在offset是有序的。索引文件被映射到内存中,所以查找的速度还是很快的。

Kafka的Message存储采用了分区(partition),分段(LogSegment)和稀疏索引来达到了查找的高效性。

参考链接:https://cloud.tencent.com/developer/article/1846773

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

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

相关文章

CSP-J第二轮试题-2021/2/3年-注意事项

参考: https://blog.csdn.net/Keven_11/article/details/126388791 https://www.cnblogs.com/-Wallace-/p/cpp-stl.html 2021年真题要求 2022年真题要求 考试注意事项 优先注意&#xff1a; 1.使用freopen。 #include <bits/stdc.h> #include<cstdio>//必须包含…

晨控CK-FR08系列读写器与LS可编程逻辑控制器MODBUSRTU连接手册

晨控CK-FR08系列读写器与LS可编程逻辑控制器MODBUSRTU连接手册 晨控CK-FR08是一款基于射频识别技术的高频RFID标签读卡器&#xff0c;读卡器工作频率为13.56MHZ&#xff0c;支持对I-CODE 2、I-CODE SLI等符合ISO15693国际标准协议格式标签的读取。读卡器内部集成了射频部分通信…

spring-boot入门之如何利用idea创建一个spring-boot项目

1.创建流程&#xff01;&#xff01;&#xff01; 选择新建项目&#xff0c;这里我们需要注意是基于maven建立的和java版本和jdk版本要对应 这里我们是基于web项目创建的记得选择这个框架。 2.测试程序 编写hello测试类 我们需要通过程序的入口进行启动程序。idea已经为我们自…

【算法练习Day7】反转字符串替换空格反转字符串中的单词左旋转字符串

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 反转字符串反转字符串 I…

【洛谷 P1644】跳马问题 题解(深度优先搜索)

跳马问题 题目背景 在爱与愁的故事第一弹第三章出来前先练练四道基本的回溯/搜索题吧…… 题目描述 中国象棋半张棋盘如图 1 1 1 所示。马自左下角 ( 0 , 0 ) (0,0) (0,0) 向右上角 ( m , n ) (m,n) (m,n) 跳。规定只能往右跳&#xff0c;不准往左跳。比如图 1 1 1 中所…

修改switch Nand无线区码 以支持高频5G 信道

环境&#xff1a;NS switch 问题&#xff1a;日版&#xff0c;港版无法连接大于44信道的5G WIFI 解决办法&#xff1a;修改PRODINFO.dec的WIFI 区域码 背景&#xff1a;我的switch是最早买的港版的一批&#xff0c;WIFI 只能连接日本的信道&#xff0c;家里的路由器是大陆的&am…

CentOS7安装Oracle XE记录

本文仅是CentOS7安装Oracle XE记录&#xff0c;供参考 1、下载安装包 oracle-xe-11.2.0-1.0.x86_64.rpm.zip 2、安装 &#xff08;1&#xff09;第一次安装 [rootnode1 opt]# cd oracle-xe/ [rootnode1 oracle-xe]# ll 总用量 309884 -rw-r--r-- 1 root root 317320273 6月…

软件设计模式系列之十七——解释器模式

1 模式的定义 解释器模式是一种行为型设计模式&#xff0c;它用于将一种语言或表达式解释为对象。该模式通过定义语言的文法规则&#xff0c;并使用解释器来解释和执行这些规则&#xff0c;将复杂的语言转换为对象的操作。 在软件开发中&#xff0c;解释器模式常用于处理类似…

初识ebpf

介绍eBPF技术 当代计算机系统中&#xff0c;性能、安全性和可观察性是至关重要的关键因素。为了应对这些挑战&#xff0c;Linux 内核引入了一种名为eBPF&#xff08;extended Berkeley Packet Filter&#xff09;的强大技术。eBPF 不仅仅是一种网络数据包过滤器&#xff0c;它…

轻松拿下Offer!20个Salesforce管理员顾问的基础面试问题

先是Salesforce第二财季业绩远超预期&#xff0c;股价大涨&#xff0c;后是首席执行官Marc Benioff表示将在各部门招聘3300名员工&#xff0c;生态系统呈现欣欣向荣的态势&#xff0c;Salesforce也成为越来越多人的职业选择。 管理员作为入门级的岗位&#xff0c;是小白和新手…

黑豹程序员-再不怕猪队友把配置文件上传git暴露数据库密码了

问题&#xff1a; 项目中含有配置文件&#xff0c;而配置文件中含有数据库的用户名和密码。而团队猪队友不论三七二十一玩git时全都上传git。git上开放给外部用户。外部用户获得数据库ip地址&#xff0c;用户名&#xff0c;密码。如果运维猪队友数据库为方便直接对外网开放。那…

CSS笔记——Display属性元素分类(行内、块,行内块)CSS默认样式及解决方案

1、display属性 ​ 可取值&#xff1a; ​ none 影藏&#xff08; 自身及其后代&#xff0c;一般用block值恢复&#xff09; ​ block 块元素 ​ inline 行内元素 ​ inline-block 行内块元素 ​ list-item (l列表元素的display值&#xff0c;实际效果比块元素多了列表的项目符…

洗地机性价比高的是哪款?高性价比洗地机排名

洗地机已成为当下备受欢迎的智能家电之一&#xff0c;但在挑选合适的洗地机时&#xff0c;面对各种新词汇和功能选择&#xff0c;可能会让人感到困惑。因此&#xff0c;为了帮助大家在购买洗地机时不踩坑&#xff0c;我们基于市面上主流品牌的综合分析对比&#xff0c;总结出来…

C++项目笔记--基于TensorRT搭建一个YoloV5服务器

目录 1--项目描述 2--项目地址 3--编译运行 4--测试结果 5--补充说明 1--项目描述 ① 基于 C/S 模型来构建 TCP 服务器和 TCP 客户端。 ② 使用 Epoll 来监控服务器和客户端之间的连接。 ③ 服务器和客户端约定使用相同的数据传输协议&#xff0c;头部分别使用 4 个字节来…

Windows下配置MySQL源码调试环境

Windows下配置MySQL源码调试环境 环境准备编译安装MySQL DeBug版MySQL初始化安装VS Code插件调试 参考链接&#xff1a; https://zhuanlan.zhihu.com/p/651665372 https://zhuanlan.zhihu.com/p/606732848 环境准备 # 创建存放源码的根目录 mkdir -p /root/code# 进入存放源码…

凹凸贴图和法线贴图的渲染效果对比

1、什么是凹凸贴图 凹凸贴图&#xff08;bump mapping&#xff09;是一种计算机图形学中的渲染技术&#xff0c;用于在给定的表面上模拟微小的凹凸纹理。通过在表面法线方向上微调每个像素的光照值&#xff0c;可以给平滑的表面增加视觉上的凹凸感。 在凹凸贴图中&#xff0c;每…

“押宝高手”乐视视频再出手,看中商业传奇剧《大盛魁》

作为最早开始版权采购的长视频平台&#xff0c;乐视视频一向擅长“押宝”优质内容。从《甄嬛传》到《白鹿原》等&#xff0c;乐视拿下了众多经典古装剧、年代剧的版权。 9月&#xff0c;乐视视频再次出手拿下的历史传奇剧《大盛魁》开始热播。该剧由王新民导演执导&#xff0c…

如何开始着手一篇Meta分析 | Meta分析的流程及方法

Meta分析是针对某一科研问题&#xff0c;根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法&#xff0c;对来源不同的研究成果进行收集、合并及定量统计分析的方法&#xff0c;最早出现于“循证医学”&#xff0c;现已广泛应用于农林生态&#xff0c;资源环境等方面。…

CMake、QMake和编译器的关系

目前这是小编理解的关系&#xff0c;在window中使用到GCC编译器的变体之后&#xff0c;为了方便编译&#xff0c;qt就使用了qmake&#xff0c;而CMake相比qmake更加强大&#xff0c;目前小编在VS中用于生成vs项目工程。 小编理解应该不是很透彻&#xff0c;如果有人看出问题&am…

layui+java spring 实现图片文件新增到数据库

项目场景&#xff1a; layuijava spring 实现图片文件新增到数据库 解决方案&#xff1a; 1.首先layui是个不再更新的网址有想了解的可以浏览官网 表格组件 table - Layui 文档 2.官网内有专门的组件 代码直接粘过来即可 <!DOCTYPE html> <html> <head> …