消息的物理结构

就是每一条消息在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的消息存储机制相关推荐

  1. RocketMQ:消息存储机制详解与源码解析

    文章目录 消息存储机制 1.前言 2.核心存储类:DefaultMessageStore 3.消息存储流程 4.消息存储文件 5.存储文件内存映射 5.1.MapperFileQueue 5.2.Ma ...

  2. RocektMQ 消息存储机制原理

    RocektMQ 消息存储机制 RocketMQ 作为一款优秀的分布式消息中间件,可以为业务方提供高性能低延迟的稳定可靠的消息服务.其核心优势是可靠的消费存储.消息发送的高性能和低延迟.强大的消息堆积 ...

  3. 融云发送自定义消息_数据源管理 | Kafka集群环境搭建,消息存储机制详解

    一.Kafka集群环境 1.环境版本 版本:kafka2.11,zookeeper3.4 注意:这里zookeeper3.4也是基于集群模式部署. 2.解压重命名 tar -zxvf kafka_2. ...

  4. 数据源管理 | Kafka集群环境搭建,消息存储机制详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.Kafka集群环境 1.环境版本 版本:kafka2.11,zookeeper3.4 注意:这里zookeeper3.4也是基于集群模式部 ...

  5. kafka消息存储机制和原理

    消息的保存路径 消息发送端发送消息到 broker 上以后,消息是如何持久化的? 数据分片 kafka 使用日志文件的方式来保存生产者和发送者的消息,每条消息都有一个 offset 值来表示它在分区中 ...

  6. RocketMQ 消息存储机制分析

  7. ActiveMQ的消息存储(八)

    1.队列存储 Queues采取先进先出模式,同一时间,消息只会发送给某一个消费者,只有当该消息被消费并告知已收到时,它才能在代理的存储中被删除. 而对于持久性Topic来说,每一个消费者都会获取消息的 ...

  8. input hidden的值存储在哪儿_kafka内核:消息存储模块的工作机制

    Medium网站:How Kafka's Storage Internals Work 本篇文章介绍kafka消息存储机制: 首先提出以下问题: 一个partition为什么被分割为多个segment ...

  9. rocketmq,索尔,qf,视频

    一 业务:电商 - 订单系统 二 需求 订单系统中 用户只需要知道:下订单.下单成功.用户支付.支付成功 用户不需要知道:下订单成功后的那些步骤: 创建订单 扣减库存 加积分 派发优惠卷 同步的通信方 ...

最新文章

  1. 2021-04-06 neo4j Service stop failed - service ‘neo4j’ not found 请问怎么解决?
  2. mysql 查询日志介绍
  3. 【Vue】脚手架 Vue CLI 的使用
  4. ubuntu: ssh: connect to host ubuntu port 22: No route to host
  5. asp.net core策略授权
  6. gtj2018如何生成工程量报表_土建软件GTJ2018中的十个问题及解决方法
  7. numpy的常用函数 不断更新
  8. VB讲课笔记05:数据输入输出
  9. Java中SpringBoot项目集成Easy版支付宝支付
  10. JSONObject 与 JSON 互转
  11. 2019/第十届蓝桥杯国赛/Java-B
  12. 深度隐藏文件或文件夹原理与应用
  13. Linux shell:脚本判断进程是否正在运行
  14. Office Web Apps 非专业测评
  15. java 如何建立servlet_Servlet怎么新建
  16. 你不知道的CS模式的进程管理工具,状态监测、项目启停一目了然!
  17. RomUtil【Android判断手机ROM,用于判断手机机型】
  18. 《动手学深度学习(Dive into Deeplearning)》(第二版)——第二章 _2.3 线性代数
  19. 大学计算机应用教程马秀麟,马秀麟
  20. 红米note4x刷android,红米Note4X刷魔趣固件笔记

热门文章

  1. android webview打印,javascript - 如何在Android Webview中使网站上的打印按钮工作? - 堆栈内存溢出...
  2. shedlock 重启系统报错问题_闲谈ShedLock解决分布式定时任务重复执行问题
  3. unix到底有啥用_微信新上线的「拍拍」到底有啥用?
  4. 唱歌如何保持高位置_高段位女生是如何做到保持新鲜感,让男朋友爱她多年如一日的?...
  5. liunx 环境下docker安装mysql
  6. linux(centos)系统安装activemq
  7. SpringBoot2入门笔记
  8. MySQL基础一些概念一些用法
  9. 樊登高效休息法心得400字_超级干货!让你快速恢复精力的高效休息法!!
  10. 台灯的内置和外置是什么意思_外置污水提升装置有哪些优势