Kafka日志详解

本文详细解析了Kafka中消息格式的变迁,从V0到V2版本,探讨了各版本的特点和改进,包括Varints和ZigZag编码。同时,介绍了Kafka服务端的消息存储方式,包括日志文件、偏移量索引和时间戳索引的详细结构,以及数据新增的过程。
摘要由CSDN通过智能技术生成

首先我们要知道Kafka本质上使用Java NIO的ByteBuffer来保存消息

好处:ByteBuffer是紧凑的二进制字节结构,不浪费空间。

1.消息版本变迁
1.1V0版本

Kafka在0.10.0版本之前都是采用V0版本的消息格式

如下表格所示为V0版本的一条Record的组成及其含义:

Record -字段- -含义-
Record head CRC校验码 4个字节CRC校验码,校验范围为magic到value之间,用于确保消息再传输过程中不会被恶意篡改
Record head magic字段 单字节的版本号,V0 magic = 0 ,V1 magic =1 ,v2 magic =2
Record head attribute 单个字节属性字段,目前仅仅使用后三位来表示消息传输的压缩类型。 0x00: 未启用压缩 ,0x01: GZIP ,0x02: Snappy ,0x03: LZ4
Record head key长度字段 4字节的消息key长度信息。若为指定key,默认值为-1
Record body key值 消息key,长度由key长度字段确定,如果为-1,则没有该消息字段
Record head value长度字段 4字节的消息长度,未指定 默认值为-1
Record body value字段 消息value 长度由value长度字段确定 -1,消息没有该字段

可以计算出V0版本的一条Record最少需要14B的存储空间

1.2 V1版本消息格式

V0版本消息格式弊端:

  • 1.消息不存储时间的话,kafka定期删除消息日志的时候,只能依靠日志段文件的“最近修改时间”,但是这种方式事不安全的,一旦我们通过系统的命令操作了文件,并且更新了该日志文件的最近修改时间,kakfa就不能对其做成正确的判断了。
  • 2.很多流处理框架都需要消息的保存时间以便对消息执行时间窗口等聚合操作。

因此V1版本的消息格式比V0版本的消息格式多了一个timestamp字段。

timestamp:8个字节,记录了消息的时间戳。时间戳有两种创建类型,由attribute的第四个bit位决定的。

  • 0:CreateTime (由Producer指定)

  • 1:LogAppendTime(由Broker指定)

MessageSet(V0,V1 未开启压缩)

V0版本和V1版本Kafka处理消息都是以MesssageSet为基础的,分为压缩和未压缩两种格式

未开启消息压缩的传输格式:V0版本和V1版本都是一样的只是差了一个时间戳的字段。

如图所示为未开启压缩 的消息在Messag Set 中的一条Log都是以 Log OVERHEAD + Record为基础的

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值