Medium网站:How Kafka’s Storage Internals Work

本篇文章介绍kafka消息存储机制;

首先提出以下问题:

  1. 一个partition为什么被分割为多个segment,这些segment是怎样命名的;
  2. index和log文件分别存储什么内容;
  3. kafka消息查找的时间复杂度是多少,为什么可以做到这个时间复杂度?
  4. kafka在存储层上有哪些性能优化的机制;

读完本王你将可以回答以上问题;

理解kafka的消息存储机制对于kafka调优是非常有帮助的;

存储管理的基本单元

对于kafka来说,存储的基本单元是partition,即数据分区;

一个partition只能由一个broker管理,数据分区是有序的不可变的消息集合,对于新增消息,只能append原有消息之后。

这个特点对于kakfa性能提升是非常有帮助的,详细原理参考:好文翻译:Thorough Introduction to Apache Kafka

topic & partition

kafka的数据保留机制

可以通过配置数据的保留时长或者数据的大小来清除之前的数据,正式由于partition的有序性以及不可变性,所以数据的清除也是非常的快的;只需要将相应offset之前的数据清除即可;

partition的分段机制

一个partition会被分为多个segment,原因是如果仅保留一个segment,那么数据量太大的时候,执行清除操作就会比较不方便;可以想象一下,删除一个文件的前半部分,仅保留后半部分,这个功能相对比较耗时而且易于出错;

在partition写入数据的时候,实际上是向segment写入数据,仅有一个segment是活跃的,但这个segment的大小达到一定时,就会关闭写入流,重新启动一个写入流;

segment的命名机制时根据其offset命名的,这样根据offse查找时非常容易查找;

offset命名机制

在磁盘上,一个partition时以一个文件夹的形式存在,每一个segment的信息由两个文件记录,一个是index文件,另一个时log文件;

消息到底存储在哪儿?

上面提到了segment由两个文件,其中一个是index文件,另一个是log文件;消息实际存储的位置时log文件,主要包含以下信息:消息key、消息内容、偏移值、时间戳、消息大小、压缩格式等;

在消息从接受到存储过程中,消息数据是不变的,所以由producer到磁盘,由磁盘到consumer,可是实现零拷贝,这也是kafka性能比较好的重要原因之一;

index文件是干什么的?

index文件从名字来看是索引用的,那么到底是什么到什么的索引呢?

通过上图可以看出,index文件是完成从offset到log中位置的映射,这样就可以根据offset在O(1)的时间复杂度下找到数据的位置;

index文件会除了会持久化到磁盘之外,还会存储在内存中,借助二分查找,快速根据offset查找到其在log中的位置;有人说这里会有一定的时间复杂度,但是考虑到每个segment的大小基本固定,而topic或者partition大小会比较大,因此可以认为时间复杂度是O(1)

对于每一个消息,index文件中会用到8个字节,其中4个字节存储offset,4个字节存储其在log中的位置;这里也用到了一个小技巧,这里的offset是相对的offset,其基点是这个segment的起始offset;

kafka的消息压缩机制

消息的压缩是在producer端完成的,前面已经提到过,由于利用零拷贝的原因,broker不会对producer传入的数据进行处理;

producer会将多个消息记录进行压缩,打包,然后提升性能;

生产者打包消息

推荐文章:

kafka源码分析 - 项目架构

kafka官网译文

input hidden的值存储在哪儿_kafka内核:消息存储模块的工作机制相关推荐

  1. input hidden用法

    之前获取数据传数据,都是写在全局变量里,今天老板告诉我说用input hidden来存,我百度了一下,确实是个好方法,记录之: 1 隐藏域在页面中对于用户是不可见的,在表单中插入隐藏域的目的在于收集或 ...

  2. iframe页面改动parent页面的隐藏input部件value值,不能触发change事件。

    实现一个依据iframe页面返回充值卡类型不同,安排不同的input部件. 点击选择弹出一个iframe.点击充值卡数据行.返回1.充值卡类型.2.充值卡id(用的UUID).3.充值卡号(字符串). ...

  3. Cloudflare Workers支持WebAssembly和键值存储

    Cloudflare最近宣布给他们的"无服务器"服务Workers新增两个附加功能:将WebAssembly作为JavaScript的替代方案,提供了对WebAssembly的支持 ...

  4. PostgreSQL 10.1 手册_部分 II. SQL 语言_第 10 章 类型转换_10.4. 值存储

    10.4. 值存储 将被插入到一个表的值会按照下列步骤被转换到目标列的数据类型. 值存储类型转换 检查一个与目标的准确匹配. 否则,尝试转换表达式为目标类型.如果在两种类型之间的一个 赋值造型已经被注 ...

  5. php监听input,jQuery如何实时监听获取input输入框的值

    jQuery实时监听获取input输入框的值,在我们日常web项目开发也常需要去实现这样的功能效果.为了作出即时动作去引导浏览者,以便提高网站的用户体验感. 下面我们就结合具体的代码示例,为大家介绍j ...

  6. JS改变input的value值不触发onchange事件解决方案 (转)

    JS改变input的value值不触发onchange事件解决方案 (转) 参考文章: (1)JS改变input的value值不触发onchange事件解决方案 (转) (2)https://www. ...

  7. python input与返回值-python中使用input()函数获取用户输入值方式

    我们编写程序最终目的还是来解决实际问题,所以必然会遇到输入输出的交互问题,python中提供了input函数用来获取用户的输入,我们可以用以下程序演示. user_gender = input(&qu ...

  8. python input与返回值-Python基础教程之输入输出和运算符

    在我们python中输入输出函数在程序中运用较为广泛,运算符常用于if判断的条件中,今天我来给大家讲解这两项概念. input输入和print输出 input()输入函数 从标准输入设备(一般指键盘) ...

  9. 五大存储模型关系模型、键值存储、文档存储、列式存储、图形数据

    五大存储模型关系模型.键值存储.文档存储.列式存储.图形数据 时间:2014-06-12 16:15来源:知行网www.zhixing123.cn 编辑:麦田守望者 昨天跟一同事讨论Sybase是不是 ...

最新文章

  1. HttpClient+Jericho HTML Parser 实现网页的抓取
  2. Jsp之五 过滤器与监听器
  3. PAT甲级题目翻译+答案 AcWing(高精度)
  4. 十分钟上线 - 函数计算构建支付宝小程序的后端
  5. Spring系列:父子容器详解
  6. python 获取当前路径_Python获取当前路径实现代码
  7. 《数学之美》—简单之美-布尔代数和搜索引擎
  8. matlab绘直方图,[转载]matlab中函数bar绘制直方图
  9. Python Package 之 Faker(随机姓名、电话)
  10. vue中audio实现微信语音播放动画
  11. dns服务器配置错误无法修复,电脑DNS错误修复的方法教程
  12. VIOS 磁盘映射简介
  13. GPS定位系统普遍存在的问题
  14. 进程同步(操作系统)
  15. java生成excel并输出到浏览器下载
  16. Vue3.0 自定义v-model:xxx
  17. 广州火车东站办理乘车临时身份证明
  18. Pipe(管道)的一些理解
  19. 2021-11-25牛客网项目第一章——Linux系统编程入门
  20. spring-web-pom

热门文章

  1. 分享非常有用的Java程序(关键代码)(七)---抓屏程序
  2. Excel .net读取
  3. 删除字符串中重复的字符
  4. javascript获取asp.net服务器端控件的值
  5. 使用C#Visual Studio2015编写Android应用程序详细步骤
  6. 搭建高性能计算环境(七)、应用软件的安装之MS
  7. Java dom4j解析RESTFull风格发布的WebService的xml文件
  8. ZF环境要求及如何配置
  9. 巧用SQL的全局临时表防止用户重复登录
  10. xampp配置时几个重要的目录