- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Kafka日志存储详解
2021-10-08
? ? ? ??本文则次要引见kafka中日志的存储原理,次要内容包括kafka日志存储格式、日志文件的管理方式、日志索引文件的格式和日志压缩等功能。
????????作为一款消息系统,日志就是将消息长久化到磁盘上的数据,这份数据的存储方式将会极大的影响其吞吐量和扩展性,而kafka日志由于其优秀的设计,为其实现这些特性供应了不行忽视的作用。总结来说,kafka日志次要具有如下特点:
极高的压缩比例。kafka日志不只会对其key和value进行压缩,而且还会对每条消息的偏移量、时间戳等等元数据信息进行压缩;
batch的方式存储数据。在存储上,kafka日志是以批次的方式进行数据的存储,每个批次的大小默认为4KB,每个批次的元数据中会存储其起始偏移量、时间戳和消息长度等信息;
追加的方式写入数据。由于kafka日志都是写入磁盘的,而磁盘的挨次写入效率是格外高的,kafka写入接受的就是追加的方式写入消息,这样可以避开磁头的随机移动,从而提升写入速率;
使用索引文件提升查询功能。kafka不只会存储消息日志文件,还会为每个消息日志文件创建一个索引文件,而且索引都是以batch为单位进行存储的,也即只会为batch的起始位移和时间戳建立索引,而不会为每条消息都建立索引。
1. 日志存储格式
????????最新版本的kafka日志是以批为单位进行日志存储的,所谓的批指的是kafka会将多条日志压缩到同一个batch中,然后以batch为单位进行后续的诸如索引的创建和消息的查询等工作。对于每个批次而言,其默认大小为4KB,并且保存了整个批次的起始位移和时间戳等元数据信息,而对于每条消息而言,其位移和时间戳等元数据存储的则是相对于整个批次的元数据的增量,通过这种方式,kafka能够削减每条消息中数据占用的磁盘空间。这里我们首先呈现一下每个批次的数据格式:
????????图中消息批次的每个元数据都有固定的长度大小,而只要最终面的消息个数的是可变的。如下是batch中次要的属性的含义:
起始位移:占用8字节,其存储了当前batch中第一条消息的位移;
长度:占用了4个字节,其存储了整个batch所占用的磁盘空间的大小,通过该字段,kafka在进行消息遍历的时候,可以快速的跳动到下一个batch进行数据读取;
分区leader版本号:记录了当前消息所在分区的leader的服务器版本,次要用于进行一些数据版本的校验和转换工作;
CRC:对当前整个batch的数据的CRC校验码,次要是用于对数据进行差错校验的;
属性:占用2个字节,这个字段的最低3位记录了当前batch中消息的压缩方式,现在次要有GZIP、LZ4和Snappy三种。第4位记录了时间戳的类型,第5和6位记录了新版本引入的事务类型和把握类型;
最大位移增量:最新的消息的位移相对于第一条消息的独一增量;
起始时间戳:占用8个字节,记录了batch中第一条消息的时间戳;
最大时间戳:占用8个字节,记录了batch中最新的一条消息的时间戳;
PID、producer epoch和起始序列号:这三个参数次要是为了实现事务和幂等性而使用的,其中PID和producer epoch用于确定当前producer能否合法,而起始序列号则次要用于进行消息的幂等校验;
消息个数:占用4个字节,记录当前batch中全部消息的个数;
????????通过上面的引见可以看出,每个batch的头部数据中占用的字节数固定为61个字节,可变部分次要是与具体的消息有关,下面我们来看一下batch中每条消息的格式:
????????这里的消息的头部数据就与batch的大不相同,可以看到,其大部分数据的长度都是可变的。既然是可变的,这里我们需要强调两个问题:
对于数字的存储,kafka接受的是Zig-Zag的存储方式,也即负数并不会使用补码的方式进行编码,而是将其转换为对应的正整数,比如-1映射为1、1映射为2、-2映射为3、2映射为4,关系图如下所示:
通过图可以看出,在对数据反编码的时候,我们只需要将对应的整数转换成其原始值即可;
在使用Zig-Zag编码方式的时候,每个字节最大为128,而其中一半要存储负数,一半要存储负数,还有一个0,也就是说每个字节能够表示的最大整数为64,此时假如有大于64的数字,kafka就会使用多个字节进行存储,而这多个字节的表征方式是通过将每个字节的最大位作为保留位来实现的,假如最高位为1,则表示需要与后续字节共同表征目标数字,假如最高位为0,则表示当前位即可表示目标数字。
??????? kafka使用这种编码方式的优点在于,大部分的数据增量都是格外小的数字,因而使用一个字节即可保存,这比直接使用原始类型的数据要节省或许
文档评论(0)