kafka-broker-文件和高效读写

目录

1 文件存储机制

1.1 topic数据的存储机制

1.2 思考:Topic数据到底存储在什么位置?

2 文件清理策略

2.1 delete日志删除:将过期数据删除

2.2 compact 日志压缩。

3 高效读写原因(面试题)


1 文件存储机制

1.1 topic数据的存储机制

Topic是逻辑上的概念,而partition是物理上的概念,每个partition对应于一个log文件,该log文件中存储的就是Producer生产的数据。Producer生产的数据会被不断追加到该log文件末端,为防止log文件过大导致数据定位效率低下,Kafka采取了分片和索引机制,将每个 partition 分为多个segment。每个segment包括: ".index”文件、“.log”文件和.timeindex等文件。这些文件位于一个文件夹下,文件夹的命名规则为: topic名称+分区序号,例如: first-0。具体结构如下图所示:

1.2 思考:Topic数据到底存储在什么位置?

  1. 启动生产者,并发送消息。
  2. 查看hadoop102(或者 hadoop103、hadoop104)的/opt/module/kafka/datas/first-1( first-0、first-2)路径上的文件。
  3. 直接查看log日志,发现是乱码(文件是序列化之后的文件)。
  4. 通过工具查看index和log日志信息(kafka自带的脚本工具)。
    查看index:

    查看log:

细心的同学会发现了,为什么log文件中有日志数据,但是index文件中的数据为0呢?
答:index为
稀疏索引,大约每往log文件写入4kb数据,才会往index文件中添加一条索引。参数为log.index.interval.bytes默认为4kb.

 具体索引存储原理如下图所示:

2 文件清理策略

Kafka 中默认的日志保存时间为7天,可以通过调整如下参数修改保存时间。

  • log.retention.hours,最低优先级小时,默认7天。
  • log.retention.minutes,分钟。
  • log.retention.ms、最高优先级毫秒。
  • log.retention.check.interval.ms,负责设置检查周期,默认5分钟。

那么日志一旦超过了设置的时间,怎么处理呢?
Kafka中提供的日志清理策略有 delete compact 两种。

2.1 delete日志删除:将过期数据删除

log.cleanup.policy = delete  所有数据启用过期删除策略

  • 基于时间:默认打开。以 segment中所有记录中的最大时间戳作为该文件时间戳。
  • 基于大小:默认关闭。超过设置的所有日志总大小,删除最早的segment
    log.retention.bytes,默认等于-1,表示无穷大。 

思考:如果一个segment中有一部分数据过期,一部分没有过期,怎么处理?

答:以 segment中所有记录中的最大时间戳作为该segment时间戳。

2.2 compact 日志压缩。

对于相同key的不同value值,只保留最后一个版本。

log.cleanup.policy = compact 所有数据启用过期删除策略 

压缩后的ofiset可能是不连续的,比如上图中没有6,当从这些offset消费消息时,将会拿到比这个offset大的offset对应的消息,实际上会拿到offset为7的消息,并从这个位置开始消费。

这种策略只适合特殊场景,比如消息的key是用户ID,value是用户的资料,通过这种压缩策略,整个消息集群里就保存了所有用户最新的资料。

3 高效读写原因(面试题)

  1. Kafka本身是分布式集群,可以采用分区技术,并行度高
  2. 读数据采用稀疏索引,可以快速定位要消费的数据
  3. 顺序写磁盘

    Kafka 的 producer 生产数据,要写入到 log文件中,写的过程是一直追加到文件末端,为顺序写。官网有数据表明,同样的磁盘,顺序写能到600M/s,而随机写只有100K/s。这与磁盘的机械机构有关,顺序写之所以快,是因为其省去了大量磁头寻址的时间。

  4. 页缓存+零拷贝技术

    零拷贝:Kafka的数据加工处理操作交由Kafka生产者和Kafka消费者处理。Kafka Broker应用层不关心存储的数据,所以就不用走应用层,传输效率高。

    PageCache页缓存:Katka重度依赖底层操作系统提供的PageCache功能。当上层有写操作时,操作系统只是将数据写入PageCache。当读操作发生时,先从PageCache中查找,如果找不到,再去磁盘中读取。实际上PageCache是把尽可能多的空闲内存都当做了磁盘缓存来使用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值