kafka的log-存储机制

1.kafka中log日志目录及组成

kafka在我们指定的log.dir目录下,会创建一些文件夹;名字是【主题名字-分区名】所组成的文件夹。 在【主题名字-分区名】的目录下,会有两个文件存在,如下所示:

#索引文件

00000000000000000000.index

#日志内容

0000000000000000000.log

在目录下的文件,会根据log日志的大小进行切分,.log文件的大小为1G的时候,就会进行切分文件; 

kafka的设计中,将offset值作为了文件名的一部分

比如:topic的名字为:test,有三个分区,生成的目录如下如下所示:

test-0

test-1

test-2

 

kafka日志的组成

segment file组成:由两个部分组成,分别为index filedata file,此两个文件一一对应且成对出现; 后缀.index.log分别表示为segment的索引文件、数据文件。

segment文件命名规则:partion全局的第一个segment0开始,后续每个segment文件名为上一个全局 partion的最大offset(偏移message数)。数值最大为64long大小,19位数字字符长度,没有数字就用0 填充。

通过索引信息可以快速定位到message。通过index元数据全部映射到memory,可以避免segment fileIO磁盘操作;

通过索引文件稀疏存储,可以大幅降低index文件元数据占用空间大小。 稀疏索引:为了数据创建索引,但范围并不是为每一条创建,而是为某一个区间创建;

好处:就是可以减少索引值的数量。

不好的地方:找到索引区间之后,要得进行第二次处理。

kafka的offset查找过程

比如:要查找绝对offset为7的Message:

上图的左半部分是索引文件,里面存储的是一对一对的key-value,其中key是消息在数据文件(对应的log文件)中的编号,比如“1,3,6,8……”,分别表示在log文件中的第1条消息、第3条消息、第6条消息、第8条消息……,那么为什么在index文件中这些编号不是连续的呢?这是因为index文件中并没有为数据文件中的每条消息都建立索引,而是采用了稀疏存储的方式,每隔一定字节的数据建立一条索引。这样避免了索引文件占用过多的空间,从而可以将索引文件保留在内存中。但缺点是没有建立索引的Message也不能一次定位到其在数据文件的位置,从而需要做一次顺序扫描,但是这次顺序扫描的范围就很小了。

其中以索引文件中元数据3,4597为例,其中3代表在右边log数据文件中从上到下第3个消息(在全局partiton表示第4597个消息),
其中4597表示该消息的物理偏移地址(位置)为4597。

kafka Message的物理结构及介绍

kafka   Message的物理结构,如下图所示:

kafka中log CleanUp

kafka中清理日志的方式有两种:deletecompact

删除的阈值有两种:过期的时间和分区内总日志大小。

kafka中,因为数据是存储在本地磁盘中,并没有像hdfs的那样的分布式存储,就会产生磁盘空间不足的情况,可以采用删除或者合并的方式来进行处理

可以通过时间来删除、合并:默认7天(log.retention.hours

还可以通过字节大小、合并:默认-1 无限制(log.retention.bytes

 

 

 

log.cleanup.policy

The default cleanup policy for segments beyond the retention window. A comma separated list of valid policies. Valid policies are: "delete" and "compact"

 

 

 

list

 

 

 

delete

 

 

 

[compact, delete]

 

 

 

medium

 

 

 

cluster- wide

相同的key,保存offset值大的(最新的消息记录)

 

 

log.retention.hours

The number of hours to keep a log file before deleting it (in hours), tertiary to log.retention.ms property

 

 

int

 

 

168

 

 

 

high

 

read- only

 

 

log.retention.minutes

The number of minutes to keep a log file before deleting it (in minutes), secondary to log.retention.ms property. If not set, the value in log.retention.hours is used

 

 

int

 

 

null

 

 

 

high

 

 

read- only

 

log.retention.ms

The number of milliseconds to keep a log file before deleting it (in milliseconds), If not set, the value in log.retention.minutes is used

 

long

 

null

 

 

high

 

cluster- wide

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值