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

kafka入门之broker--日志存储设计的更多相关文章

  1. 我们NetCore下日志存储设计

    日志的分类 首先往大的来说,日志分2种 ①业务日志: 即业务系统需要查看的日志, 常见的比如谁什么时候修改了什么. ②参数日志: 一般是开发人员遇到问题的时候定位用的, 一般不需要再业务系统里展示. ...

  2. Es+kafka搭建日志存储查询系统(设计)

    现在使用的比较常用的日志分析系统有Splunk和Elk,Splunk功能齐全,处理能力强,但是是商用项目,而且收费高.Elk则是Splunk项目的一个开源实现,Elk是ElasticSearch(Es ...

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

    kafka入门:简介.使用场景.设计原理.主要配置及集群搭建 http://www.aboutyun.com/thread-9341-1-1.html 还没看完 感觉挺好的. 问题导读: 1.zook ...

  4. Kafka 入门(二)--数据日志、副本机制和消费策略

    一.Kafka 数据日志 1.主题 Topic Topic 是逻辑概念. 主题类似于分类,也可以理解为一个消息的集合.每一条发送到 Kafka 的消息都会带上一个主题信息,表明属于哪个主题. Kafk ...

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

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

  6. kafka入门教程链接

    http://www.aboutyun.com/forum.php?mod=viewthread&tid=12882 经典入门教程 1.Kafka独特设计在什么地方?2.Kafka如何搭建及创 ...

  7. 超详细“零”基础kafka入门篇

    1.认识kafka 1.1 kafka简介 Kafka 是一个分布式流媒体平台 kafka官网:http://kafka.apache.org/ (1)流媒体平台有三个关键功能: 发布和订阅记录流,类 ...

  8. Kafka 入门三问

    目录 1 Kafka 是什么? 1.1 背景 1.2 定位 1.3 产生的原因 1.4 Kafka 有哪些特征 消息和批次 模式 主题和分区 生产者和消费者 broker 和 集群 1.5 Kafka ...

  9. 项目17-超详细“零”基础kafka入门篇

    分类: Linux服务篇,Linux架构篇   1.认识kafka 1.1 kafka简介 Kafka 是一个分布式流媒体平台 kafka官网:http://kafka.apache.org/ (1) ...

随机推荐

  1. 简单盘点 CVPR2020 的图像合成论文

    前言 本文将简单盘点在 CVPR2020 上的图像合成方面的论文,然后给出下载地址以及开源代码 github(如果有开源). 原文:https://evgenykashin.github.io/202 ...

  2. ThreadLocal内存泄漏需要注意的

    前段时间在网上看到了一篇关于ThreadLocal内存泄漏的文章 于是个人也研究了下ThreadLocal 对象,其原理是: ThreadLocal 定义的变量值 会存储在当前线程的一个map集合中 ...

  3. 对Python"一切皆对象"的小参悟

    写在前面 若有误区请大神不吝指正,以免带偏了如我者的弱鸡们 据闻对此不再懵逼后,于函数以及高阶函数编程的进阶有益 类:又称对象,由类创建的个体被称为实例 名言名句"一切皆对象(一切皆类,一切 ...

  4. Appium+python自动化环境搭建

    一.步骤及环境 环境:Windows 7版本 64位系统(python) 1.jdk安装配置:jdk1.6.0 (64位) 2.android-sdk下载安装:android-sdk_r24.3.4- ...

  5. 7 apache和nginx的区别

    7 apache和nginx的区别 nginx 相对 apache 的优点: 轻量级,同样起web 服务,比apache 占用更少的内存及资源 抗并发,nginx 处理请求是异步非阻塞的,支持更多的并 ...

  6. Javascript基础知识面试题

    []==![] 解题思路: step1,   []==!Boolean([]);step2,   []==!true;step3,   []==false;step4,   [].valueOf()= ...

  7. flex-shrink值的计算

    flex-shrink为弹性盒模型中,当弹性项不断行,并且所有弹性项的宽度只和大于弹性盒模型的可分配空间时,弹性项的收缩程度. 找到英文资料对flex-shrink的定义描述: flex-shrink ...

  8. Spring5.0源码学习系列之浅谈循环依赖问题

    前言介绍 附录:Spring源码学习专栏 在上一章的学习中,我们对Bean的创建有了一个粗略的了解,接着本文浅谈Spring循环依赖问题,这是一个面试比较常见的问题 1.什么是循环依赖? 所谓的循环依 ...

  9. redis-server文件启动cmd一闪而过

    工作上需要在本地装redis,所以就帮别人排查了一个问题,就是redis服务双击了之后不能起来,就是一个黑色的cmd框一闪而过,正常的是这样的: 然而,我当时第一次接触windows上的redis服务 ...

  10. 一次webpack小规模优化经历

    这标题一点营销号味道都没有,怎么会有人看啊!(笑) 没人看也无所谓的文章背景: 八月份入职了新公司,是个好几年的老项目了,公司产品是存在很久了,但我接触到的代码版本保守估计应该是有个三年到四年这样的历 ...