kafaka并不是直接将原省消息写入日志文件的,相反,它会将消息和一些必要的元数据信息大宝在一起封装成一个record写入日志。其实就是我们之前介绍的batch

具体对每个日志而言,kafka又将其进一步细分成日志段文件以及日志段索引文件,每个分区日志都是由若干日志段文件+索引文件构成的。

创建topic时,kafka为该topic的每个分区在文件系统中创建了一个对应的子目录,名字就是<topic>-<分区号>。每个日志子目录的文件构成都是如图所示的结构,即若干组日志段+索引文件。

1。日志段文件,即后缀名时.log的文件保存着真是的Kafka记录,kafla使用该文件第一条记录对应的offset来命名此.log文件。

kafka每个日志段文件是有上限大小的,由broker端参数log.segment.bytes控制,默认就是1GB大小。,因此当日志段文件填满记录后,kafka会自动创建一组新的日志段文件和索引文件,这个过程被称为日志切分。当前日志段非常特殊,它不受任何Kafka后台任务的影星,比如定期日志清楚任务和定期日志compaction任务。

2.索引文件

.index文件和.timeindex文件他们都是索引文件,分别被称为位移索引文件和时间戳索引文件,前者可以帮助broker更快地定位记录所在的物理文件位置,而后者则是根据给定的时间戳查询对应的位移信息。

它们都属于稀疏索引文件,每个索引文件都由若干索引项组成。kafka不会为每条消息记录都保存对应的索引项,而是特写入若干记录后才增加一个索引项,broker端参数log.index,interval.bytes设置了这个间隔到底是多大,默认值是4kb,即kafka分区至少写入了4KB数据后才会在索引文件中增加一个索引项,故本质上它们是稀疏的。

升序排列,有了这种升序规律,kafka可以利用二分查找算法来搜索目标索引项,从而降低整体时间复杂度到o(lgN)。若没有索引文件,kafka搜寻记录的方式只能是从每个日志段文件的体育部孙旭扫面,因此这种方案的时间复杂度是o(N)显然,引入索引文件可以极大的减少查找时间,减少broker端的cpu开销

当日志进行切分时,索引文件也需要进行切分,broker端参数log.index.size.max.bytes设置了索引文件的最大文件大小,默认是10MB。和日志段文件不同,索引文件的空间默认都是预先分配好的,而当对索引文件切分时,kafka会把该文件大小'裁剪'到真实数据大小:

格式:

1.位移索引文件:

每个索引项固定地占用8字节的物理空间,同时kafka强制要求索引文件必须是索引项大小的整数倍,即8的整数倍,因此假设用户设300会是296

索引文件文件名中的位移就是改索引文件的起始位移。

2.时间戳索引文件:

每个索引项固定占用12字节的物理空间,同时kafka强制要求索引文件必须是索引项大小的整数倍,即12的整数倍,设100会是96

时间戳索引项保存的是时间戳与唯一的映射关系,给定时间戳后根据此索引文件只能找到不大于该时间戳的最大位移,然后kafka还需要拿着返回的位移再去位移索引文件中定位真实的物理文件位置。

日志留存:

定期清除日志,即删除符合策略的日志段文件和两个索引文件:

基于时间:默认7天,.log.retention.hours|minutes|ms用于配置清除日志的时间间隔,其中ms的优先级最高,minutes次之,hours优先级最低,计算当前时间戳与日志段首条消息的时间戳之差作为衡量日志段是否留存的依据,如果第一条消息没有时间戳,kafka才会使用最近修改时间的属性

基于大小,默认-1,表示kafka不会对log进行大小方面的限制

日志清除是一个异步过程,kafka broker启动后会创建单独的线程处理日志清除事宜。

日志compaction:

如果·使用log compaction,kafka消息必须要设置key,无key消息是无法为其进行压实操作的。

kafka有个组件叫cleanner,它就是负责执行compaction操作的。cleaner负责从log中移除已废弃的消息,如果一条消息的key是k,位移是o,只要日志中存在另外一条消息,key也是k,但位移是o‘,且o<o‘,即认为前面那条消息已经废弃。

log compaction是topic级别的设置。

在内部kafka会构造一个哈希表来保存key与最新位移的映射关系:

_consumer_offset内部topic就是采用log compaction留存策略的。

相关参数:

log.cleanup.policy:

log.cleaner.enable:

log.cleanner.min.compaction.lang.ms

转载于:https://www.cnblogs.com/lccsblog/p/11219681.html

kafka入门之broker--日志存储设计相关推荐

  1. java hbase流量日志,Spark+Hbase 亿级流量分析实战(日志存储设计)

    接着上篇文章 百亿级流量实时分析统计 - 数据结构设计 我们已经设计好了日志的结构,接下来我们就准备要开始撸代码了,我最喜欢这部分的环节了,可是一个上来连就撸代码的程序肯定不是好程序员,要不先设计设计 ...

  2. kafka入门:简介、使用场景、设计原理、主要配置及集群搭建

    为什么80%的码农都做不了架构师?>>>    kafka入门:简介.使用场景.设计原理.主要配置及集群搭建(转) 问题导读: 1.zookeeper在kafka的作用是什么? 2. ...

  3. kafka入门:简介、使用场景、设计原理、主要配置及集群搭

    李克华 云计算高级群: 292870151 195907286 交流:Hadoop.NoSQL.分布式.lucene.solr.nutch  kafka入门:简介.使用场景.设计原理.主要配置及集群搭 ...

  4. Kafka的存储设计

    本文来说下 Kafka的存储选型 文章目录 概述 Kafka的存储难点是什么 Kafka的存储选型分析 存储领域的基础知识 Kafka 的存储选型考虑 Kafka 的存储设计 本文小结 概述 谈到 K ...

  5. CC00060.kafka——|Hadoopkafka.V45|——|kafka.v45|日志存储概述|

    一.日志存储概述 ### --- 日志存储概述~~~ Kafka 消息是以主题为单位进行归类,各个主题之间是彼此独立的,互不影响. ~~~ 每个主题又可以分为一个或多个分区. ~~~ 每个分区各自存在 ...

  6. Kafka#4:存储设计 分布式设计 源码分析

    https://sites.google.com/a/mammatustech.com/mammatusmain/kafka-architecture/4-kafka-detailed-archite ...

  7. Kafka入门教程与详解

    1 Kafka入门教程 1.1 消息队列(Message Queue) Message Queue消息传送系统提供传送服务.消息传送依赖于大量支持组件,这些组件负责处理连接服务.消息的路由和传送.持久 ...

  8. Kafka入门教程(一)

    转自:https://blog.csdn.net/yuan_xw/article/details/51210954 1 Kafka入门教程 1.1 消息队列(Message Queue) Messag ...

  9. Kafka教程(一)Kafka入门教程

    Kafka教程(一)Kafka入门教程 1 Kafka入门教程 1.1 消息队列(Message Queue) Message Queue消息传送系统提供传送服务.消息传送依赖于大量支持组件,这些组件 ...

最新文章

  1. CyclicBarrier使用与原理
  2. STM32H7的FDCAN
  3. python培训中心-吴中区Python培训中心
  4. div根据内容改变大小并且左右居中
  5. Linux常用文件和目录操作
  6. linux nfs用的用户权限,权限 – Linux特定用户安装NFS
  7. 学习笔记 第六周 第一篇
  8. 【渝粤教育】国家开放大学2018年春季 0554-22T立体构成(一) 参考试题
  9. oracle goldengate 触发器,Oracle goldengate的触发器错误 OGG-00869
  10. matlab生成低通滤波,用matlab设计低通滤波器
  11. SAP系统用户账号类型介绍
  12. #树形dp#洛谷 2014 codevs 1378 jzoj 1486 选课
  13. 关于100M以太网的争用期问题
  14. C语言/C++编程学习,新手初学者篇
  15. 【技术类】【ArcGIS对国产卫星的支持2:高分一号卫星】篇8、无缝镶嵌产品生产
  16. 关于云原生入门技能树图片资源展示问题
  17. 电脑监控软件是如何监控员工微信的?
  18. 百度区块链“度宇宙”百度“图腾”都是区块链,有什么不同呢?
  19. 创业的Idea是怎样产生的?
  20. 广读精思:科学新闻那些事

热门文章

  1. html怎么给框格加背景图,怎么给word 2013表格添加漂亮的背景图片
  2. java 最新sql注入原因以及预防方案(易理解)
  3. php递归多维数组为缩进列表,php – 缩进列表到多维数组
  4. 排列出所有子串暴力递归
  5. iptables的配置实例
  6. the vm session was closed before any attempt to power it on
  7. Redis的设计与实现之对象
  8. [NOTE] Web For Pentester靶场练习笔记
  9. php查询字段的总和,ThinkPHP 多表查询-如其字段A相同,则把字段B相加
  10. hive解决数据倾斜问题_Hive数据倾斜和解决办法