Kafka数据存储
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kafka数据存储相关的知识,希望对你有一定的参考价值。
参考技术A Kafka中的消息是存储在磁盘上的,一个分区副本对应一个日志(Log)。为了防止Log过大,Kafka又引入了 日志分段 (LogSegment)的概念,将Log切分为多个LogSegment ,相当于一个 巨型文件被平均分配为多个相对较小的文件 ,这样也便于消息的维护和清理。事实上,Log和LogSegnient 也不是纯粹物理意义上的概念,Log 在物理上只以文件夹的形式存储,而每个LogSegment对应于磁盘上的一个日志文件和两个索引文件,以及可能的其他文件(比如以.txnindex ”为后缀的事务索引文件),下图为topic、partition、副本、log和logSegment之间的关系。
虽然一个log被拆为多个分段,但只有最后一个LogSegment(当前活跃的日志分段)才能执行写入操作,在此之前所有的LogSegment都不能写入数据。当满足以下其中任一条件会创建新的LogSegment。
在索引文件切分的时候,Kafka 会关闭当前正在写入的索引文件并置为只读模式,同时以可读写的模式创建新的索引文件,默认大小为1GB。当下次索引切分时才会设置为实际大小。也就是说,之前的segment都是实际大小,活跃segment大小为1G。
索引的主要目的是提高查找的效率。
Kafka采用稀疏索引(sparse index)的方式构造消息的索引,它并不保证每个消息在索引文件中都有对应的索引项。而是每当写入一定量(由 broker 端参数 log.index. interval.bytes 指定,默认4KB )的消息时,索引文件会增加一个索引项。
消息查找过程
间戳索引文件中包含若干时间戳索引项,每个追加的时间戳索引项中的 timestamp 必须大于之前追加的索引项的 timestamp ,否则不予追加。
消息查找过程
Kafka将消息存储在磁盘中,为了控制磁盘占用空间的不断增加就需要对消息做一定的清理操作。Kafka提供了两种日志清理策略。
kafka有专门的任务来周期性删除不符合条件的日志分段文件,删除策略主要以下有3种。
对于有相同key的不同value值,只保留最后一个版本。如果应用只关心key对应的最新value值,则可以开启Kafka的日志压缩功能,Kafka会定期将相同key的消息进行合井,只保留最新的value值。
以上是关于Kafka数据存储的主要内容,如果未能解决你的问题,请参考以下文章
2021年大数据Kafka:kafka消息存储及查询机制原理
使用presto的kafka连接器时presto在哪里存储kafka数据