kafaka的消息存储机制
消息的物理结构
就是每一条消息在log中都存了啥
关键字 | 解释说明 |
---|---|
8 byte offset | 在parition(分区)内的每条消息都有一个有序的id号,这个id号被称为偏移(offset),它可以唯一确定每条消息在parition(分区)内的位置。即offset表示partiion的第多少message |
4 byte message size | message大小 |
4 byte CRC32 | 用crc32校验message |
1 byte “magic" | 表示本次发布Kafka服务程序协议版本号 |
1 byte “attributes" | 表示为独立版本、或标识压缩类型、或编码类型。 |
4 byte key length | 表示key的长度,当key为-1时,K byte key字段不填 |
K byte key | 可选 |
value bytes payload | 表示实际消息数据。 |
offset: 3 position: 211 CreateTime: 1606446771205 isvalid: true keysize: -1 valuesize: 7 magic: 2 compresscodec: NONE producerId: -1 producerEpoch: -1 sequence: -1 isTransactional: false headerKey s: [] payload: 4567890
基本概念
1 在kafka中,topic是一个逻辑概念
2 每一个topic的所有message 是依据partition进行物理存储的
3 partition对应的实体为目录,命名topicName-序列,序列从0开始
举个例子,有个叫做pet的topic,3个分区,则其目录结构如下
drwxr-xr-x 2 root root 215 12月 1 10:27 pet-0
drwxr-xr-x 2 root root 215 12月 1 09:51 pet-1
drwxr-xr-x 2 root root 215 12月 1 09:51 pet-2
4分区内数据按segment进行存储,(1个分区内可以有N个segment)
比如我们进入上面的pet-0分区,结果如下
-rw-r--r-- 1 root root 10485760 12月 1 09:44 00000000000000000000.index
-rw-r--r-- 1 root root 4851 12月 1 17:29 00000000000000000000.log
-rw-r--r-- 1 root root 10485756 12月 1 09:44 00000000000000000000.timeindex
-rw-r--r-- 1 root root 34 12月 1 09:44 00000000000000000000.txnindex
-rw-r--r-- 1 root root 240 12月 1 09:44 00000000000000000054.snapshot
-rw-r--r-- 1 root root 28 12月 1 10:27 leader-epoch-checkpoint
5 segment对应2个文件,xxxx.log 与xxxx.index
- .index文件存储kv堆,稀疏存储. k为log文件中的第几条消息的几, value是这个消息针对于这个文件的偏移量.
- .log文件存储的是真正的消息, log最大1G,多了会分裂
查看这个index,还是不容易的!
[root@mypc01 pet-0]# kafka-run-class.sh kafka.tools.DumpLogSegments --files /usr/local/kafka /data/kafka-logs/pet-0/00000000000000000000.index --print-data-log
Dumping /usr/local/kafka/data/kafka-logs/pet-0/00000000000000000000.index
offset: 0 position: 0[root@mypc01 pet-0]# kafka-run-class.sh kafka.tools.DumpLogSegments --files /usr/local/kafka /data/kafka-logs/pet-0/00000000000000000000.log --print-data-log
Dumping /usr/local/kafka/data/kafka-logs/pet-0/00000000000000000000.log
Starting offset: 0
offset: 0 position: 0 CreateTime: 1606445146516 isvalid: true keysize: -1 valuesize: 0 magic: 2 co mpresscodec: NONE producerId: -1 producerEpoch: -1 sequence: -1 isTransactional: false headerKeys: [] payload:
offset: 1 position: 68 CreateTime: 1606445348572 isvalid: true keysize: -1 valuesize: 5 magic: 2 c ompresscodec: NONE producerId: -1 producerEpoch: -1 sequence: -1 isTransactional: false headerKeys : [] payload: gaoyu
offset: 2 position: 141 CreateTime: 1606445368962 isvalid: true keysize: -1 valuesize: 2 magic: 2 compresscodec: NONE producerId: -1 producerEpoch: -1 sequence: -1 isTransactional: false headerKey s: [] payload: 66
offset: 3 position: 211 CreateTime: 1606446771205 isvalid: true keysize: -1 valuesize: 7 magic: 2 compresscodec: NONE producerId: -1 producerEpoch: -1 sequence: -1 isTransactional: false headerKey s: [] payload: 4567890
offset: 4 position: 286 CreateTime: 1606448835680 isvalid: true keysize: -1 valuesize: 2 magic: 2 compresscodec: NONE producerId: -1 producerEpoch: -1 sequence: -1 isTransactional: false headerKey s: [] payload: 10
消费者如何查找信息?
1 依据offset的值,查找index索引文件.因为index文件的命名是以上一个文件的最后一个offset命名的,所以,利用二分法可以很快找到索引文件
2 找到索引文件后,依据offset找到匹配范围的position
3 拿到position后,再到对应的log文件中,从position处开始找offset对应的消息,将每条消息的offset与目标offset进行比较,直到找到消息.
log过大的怎么办?
有大小和时间限制;
有大小限制,超过1G就会创建新文件.
有时间限制,如果保留策略设置为2天,一条记录发布后两天内,可以随时被消费,两天过后这条记录会被抛弃并释放磁盘空间。Kafka的性能和数据大小无关,所以长时间存储数据没有什么问题.
log文件和index文件的offset有何不同?
index文件中offset是稀疏存储的,log文件中不是这样的
log文件和index文件如何命名的?
log文件换index文件一一对应
而log文件的命名以其第一条记录的offset值为准
图解
总结
- kafka消息存储在分区目录下的log文件中,索引存在分区下面的索引文件中
- 消费者依据offset找到索引文件然后再去依据offset找到position,再利用position取log文件查找消息
kafaka的消息存储机制相关推荐
- RocketMQ:消息存储机制详解与源码解析
文章目录 消息存储机制 1.前言 2.核心存储类:DefaultMessageStore 3.消息存储流程 4.消息存储文件 5.存储文件内存映射 5.1.MapperFileQueue 5.2.Ma ...
- RocektMQ 消息存储机制原理
RocektMQ 消息存储机制 RocketMQ 作为一款优秀的分布式消息中间件,可以为业务方提供高性能低延迟的稳定可靠的消息服务.其核心优势是可靠的消费存储.消息发送的高性能和低延迟.强大的消息堆积 ...
- 融云发送自定义消息_数据源管理 | Kafka集群环境搭建,消息存储机制详解
一.Kafka集群环境 1.环境版本 版本:kafka2.11,zookeeper3.4 注意:这里zookeeper3.4也是基于集群模式部署. 2.解压重命名 tar -zxvf kafka_2. ...
- 数据源管理 | Kafka集群环境搭建,消息存储机制详解
本文源码:GitHub·点这里 || GitEE·点这里 一.Kafka集群环境 1.环境版本 版本:kafka2.11,zookeeper3.4 注意:这里zookeeper3.4也是基于集群模式部 ...
- kafka消息存储机制和原理
消息的保存路径 消息发送端发送消息到 broker 上以后,消息是如何持久化的? 数据分片 kafka 使用日志文件的方式来保存生产者和发送者的消息,每条消息都有一个 offset 值来表示它在分区中 ...
- RocketMQ 消息存储机制分析
- ActiveMQ的消息存储(八)
1.队列存储 Queues采取先进先出模式,同一时间,消息只会发送给某一个消费者,只有当该消息被消费并告知已收到时,它才能在代理的存储中被删除. 而对于持久性Topic来说,每一个消费者都会获取消息的 ...
- input hidden的值存储在哪儿_kafka内核:消息存储模块的工作机制
Medium网站:How Kafka's Storage Internals Work 本篇文章介绍kafka消息存储机制: 首先提出以下问题: 一个partition为什么被分割为多个segment ...
- rocketmq,索尔,qf,视频
一 业务:电商 - 订单系统 二 需求 订单系统中 用户只需要知道:下订单.下单成功.用户支付.支付成功 用户不需要知道:下订单成功后的那些步骤: 创建订单 扣减库存 加积分 派发优惠卷 同步的通信方 ...
最新文章
- 2021-04-06 neo4j Service stop failed - service ‘neo4j’ not found 请问怎么解决?
- mysql 查询日志介绍
- 【Vue】脚手架 Vue CLI 的使用
- ubuntu: ssh: connect to host ubuntu port 22: No route to host
- asp.net core策略授权
- gtj2018如何生成工程量报表_土建软件GTJ2018中的十个问题及解决方法
- numpy的常用函数 不断更新
- VB讲课笔记05:数据输入输出
- Java中SpringBoot项目集成Easy版支付宝支付
- JSONObject 与 JSON 互转
- 2019/第十届蓝桥杯国赛/Java-B
- 深度隐藏文件或文件夹原理与应用
- Linux shell:脚本判断进程是否正在运行
- Office Web Apps 非专业测评
- java 如何建立servlet_Servlet怎么新建
- 你不知道的CS模式的进程管理工具,状态监测、项目启停一目了然!
- RomUtil【Android判断手机ROM,用于判断手机机型】
- 《动手学深度学习(Dive into Deeplearning)》(第二版)——第二章 _2.3 线性代数
- 大学计算机应用教程马秀麟,马秀麟
- 红米note4x刷android,红米Note4X刷魔趣固件笔记
热门文章
- android webview打印,javascript - 如何在Android Webview中使网站上的打印按钮工作? - 堆栈内存溢出...
- shedlock 重启系统报错问题_闲谈ShedLock解决分布式定时任务重复执行问题
- unix到底有啥用_微信新上线的「拍拍」到底有啥用?
- 唱歌如何保持高位置_高段位女生是如何做到保持新鲜感,让男朋友爱她多年如一日的?...
- liunx 环境下docker安装mysql
- linux(centos)系统安装activemq
- SpringBoot2入门笔记
- MySQL基础一些概念一些用法
- 樊登高效休息法心得400字_超级干货!让你快速恢复精力的高效休息法!!
- 台灯的内置和外置是什么意思_外置污水提升装置有哪些优势