1.存储格式概述

  • 每一个partion(文件夹)相当于一个巨型文件被平均分配到多个大小相等segment(段)数据文件里。但每一个段segment file消息数量不一定相等,这样的特性方便old segment fifile高速被删除。(默认情况下每一个文件大小为1G)

  • 每一个partiton仅仅须要支持顺序读写即可了。segment文件生命周期由服务端配置参数决定。

partiton中segment文件存储结构

segment fifile组成:由2大部分组成。分别为index file和data file,此2个文件一一相应,成对出现,后缀”.index”和“.log”分别表示为segment索引文件、数据文件.

segment文件命名规则:partion全局的第一个segment从0开始,之后每一个segment文件名称为上一个segment文件最后一条消息的offset值。数值最大为64位long大小。19位数字字符长度,没有数字用0填充。

[root@VM_0_7_centos yfy-0]# ll
total 4
-rw-r--r-- 1 root root 10485760 Oct 13 19:37 00000000000000000000.index
-rw-r--r-- 1 root root        0 Oct 13 19:37 00000000000000000000.log
-rw-r--r-- 1 root root 10485756 Oct 13 19:37 00000000000000000000.timeindex
-rw-r--r-- 1 root root        8 Oct 13 19:37 leader-epoch-checkpoint

2.日志索引

2.1 数据文件的分段

数据文件以该段中最小的offset命名。这样在查找指定offset的Message的时候,用二分查找就可以定位到该Message在哪个段中。

2.2 偏移量索引

数据文件分段使得可以在一个较小的数据文件中查找对应offffset的Message了,但是这依然需要顺序扫描才能找到对应offset的Message。为了进一步提高查找的效率,Kafka为每个分段后的数据文件建立了索引文件,文件名与数据文件的名字是一样的,只是文件扩展名为.index。

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

首先是用二分查找确定它是在哪个LogSegment中,自然是在第一个Segment中。 打开这个Segment的index文件,也是用二分查找找到offffset小于或者等于指定offffset的索引条目中最大的那个offset。自然offset为6的那个索引是我们要找的,通过索引文件我们知道offffset为6的Message在数据文件中的位置为9807。

打开数据文件,从位置为9807的那个地方开始顺序扫描直到找到offset为7的那条Message。

这套机制是建立在offset是有序的。索引文件被映射到内存中,所以查找的速度还是很快的。

一句话,Kafka的Message存储采用了分区(partition),分段(LogSegment)和稀疏索引这几个手段来达到了高效性。

3.日志删除

Kafka日志管理器允许定制删除策略。目前的策略是删除修改时间在N天之前的日志(按时间删除),也可以使用另外一个策略:保留最后的N GB数据的策略(按大小删除)。为了避免在删除时阻塞读操作,采用了copy-on-write形式的实现,删除操作进行时,读取操作的二分查找功能实际是在一个静态的快照副本上进行的,这类似于Java的CopyOnWriteArrayList。

Kafka消费日志删除思想:Kafka把topic中一个parition大文件分成多个小文件段,通过多个小文件段,就容易定期清除或删除已经消费完文件,减少磁盘占用。

# 清理超过指定时间清理:
log.retention.hours=16
# 超过指定大小后,删除旧的消息:
log.retention.bytes=1073741824

4.磁盘存储优势

Kafka在设计的时候,采用了文件追加的方式来写入消息,即只能在日志文件的尾部追加新的消息,并且不允许修改已经写入的消息,这种方式属于典型的顺序写入此判断的操作,所以就算是Kafka使用磁盘作为存储介质,所能实现的额吞吐量也非常可观。

Kafka中大量使用页缓存,这也是Kafka实现高吞吐的重要因素之一。

页缓存可以看下面这两篇博客:

  • 聊聊page cache与Kafka之间的事儿:https://www.jianshu.com/p/92f33aa0ff52

  • linux中的页缓存和文件IO:https://blog.csdn.net/gdj0001/article/details/80136364

Kafka中读写message有如下特点:

写message

  • 消息从java堆转入page cache(即物理内存)。

  • 由异步线程刷盘,消息从page cache刷入磁盘。

读message

  • 消息直接从page cache转入socket发送出去。

  • 当从page cache没有找到相应数据时,此时会产生磁盘IO,从磁盘Load消息到page cache,然后直接从socket发出去

Kafka高效文件存储设计特点

  • Kafka把topic中一个parition大文件分成多个小文件段,通过多个小文件段,就容易定期清除或删除已经消费完文件,减少磁盘占用。

  • 通过索引信息可以快速定位message和确定response的最大大小。

  • 通过index元数据全部映射到memory,可以避免segment file的IO磁盘操作。

  • 通过索引文件稀疏存储,可以大幅降低index文件元数据占用空间大小。

Kafka数据存储详解相关推荐

  1. 虚拟化磁盘模式、数据存储详解

    虚拟化磁盘模式.数据存储详解 1. 配置模式 1.1. 普通 1.2. 普通延迟置零 1.3. 精简 2. 磁盘模式 2.1. 从属 2.2. 独立-持久 2.3. 独立-非持久 3. 数据存储 3. ...

  2. java 缓冲区中的数据存入缓冲区中_java8中NIO缓冲区(Buffer)的数据存储详解|chu...

    java8新特性NIO缓冲区(Buffer)的数据存储. ByteBuffer,CharBuffer,ShortBuffer,IntBuffer,LongBuffer,FloatBuffer, Dou ...

  3. Volume数据存储详解

    数据存储 在前面已经提到,容器的生命周期可能很短,会被频繁地创建和销毁.那么容器在销毁时,保存在容器中的数据也会被清除.这种结果对用户来说,在某些情况下是不乐意看到的.为了持久化保存容器的数据,kub ...

  4. OpenTSDB 数据存储详解

    本文首发于 vivo互联网技术 微信公众号 链接: https://mp.weixin.qq.com/s/qayKiwk5QAIWI7-nyD3FVA 作者:DuZhimin 随着互联网.尤其是物联网 ...

  5. 【云原生 | 19】Docker数据存储详解

    作者简介:

  6. 汇川小型PLC梯形图编程系列教程(七):数值存储与二进制数据知识详解

    原文链接:汇川小型PLC梯形图编程系列教程(七):数值存储与二进制数据知识详解 PLC数据存储原理简介 H123U小型PLC内部采用的是32位的处理器,PLC中的数据处理和电脑中的数据处理基本是一致的 ...

  7. 【数据的存储】浮点数在内存中的存储详解【超详细的保姆级别教程,让面试官心服口服】手撕浮点数存储使用方式

    [数据的存储]浮点数在内存中的存储详解[超详细的保姆级别教程,让面试官对你心服口服]手撕浮点数存储使用方式 作者: @小小Programmer 这是我的主页:@小小Programmer 在食用这篇博客 ...

  8. 为什么写《大数据架构详解》这本书

    花了差不多一年半时间,牺牲了每个周末,费了九牛二虎之力,终于完成个人人生的第一本书<大数据架构详解:从数据获取到深度学习>.整个过程其实挺痛苦的,时常想放弃,幸好坚持下来了. 回想这我50 ...

  9. DZ各个数据表详解(DZ论坛各表详细说明,二次开发用)

    DZ各个数据表详解(DZ论坛各表详细说明,二次开发用) DZ默认库的53个数据表 cdb_access (用户权限表) uid 用户id fid 论坛id allowview 允许浏览 allowpo ...

最新文章

  1. 项目收获与体会_员工之声|在项目实践中提高,在团队合作中成长——参与项目有感...
  2. Android屏幕适配的一些常识
  3. Java中的StringBuilder类功能详解
  4. 蓝桥杯 - 垒骰子(动态规划+矩阵快速幂优化)
  5. 购买7个球彩票(人输入or机输入)(python )
  6. asp.net core mvc中如何把二级域名绑定到特定的控制器上
  7. Spring Boot中带有CKEditor的AJAX
  8. graphpad prism画折线图_如何用Graphpad Prism 8作折线图
  9. 模块ntdll中出现异常eaccessviolation_python常用模块
  10. ASP.NET的路由系统:URL与物理文件的分离
  11. 一张图看懂开源许可协议,开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别【转载】
  12. 人脸识别中Softmax-based Loss的演化史
  13. JasperReport学习笔记6-JRXML的标签
  14. python基础学习笔记(九)
  15. 广东计算机等级考试一级试题,广东省计算机等级考试(一级)仿真试题
  16. 华中科技大学计算机暑期夏令营,2019年华中科技大学计算机专业夏令营
  17. 讲座笔记:图匹配 Graph Matching 问题 | 机器学习组合优化
  18. 软件测试用mac还是windows,Boot Camp还是虚拟机?Mac+Win实测
  19. 关于s19赛季服务器维修,王者荣耀S19赛季版本更新问题及解决办法一览
  20. PhotoKit在线图片编辑器

热门文章

  1. 使用kuberbuilder创建工程示例
  2. Golang经典面试题下
  3. Wireshark抓取数据包
  4. (56)等待链表,调度链表
  5. MoeCTF 2021Re部分------RedC4Bomb
  6. ida动态调试apk(so层)
  7. angr学习笔记(9)(添加约束)
  8. 【安全漏洞】利用CodeQL分析并挖掘Log4j漏洞
  9. 【网络安全】OWASP基准测试测评篇
  10. Android之Xposed框架完全使用指南