input hidden的值存储在哪儿_kafka内核:消息存储模块的工作机制
Medium网站:How Kafka’s Storage Internals Work
本篇文章介绍kafka消息存储机制;
首先提出以下问题:
- 一个partition为什么被分割为多个segment,这些segment是怎样命名的;
- index和log文件分别存储什么内容;
- kafka消息查找的时间复杂度是多少,为什么可以做到这个时间复杂度?
- kafka在存储层上有哪些性能优化的机制;
读完本王你将可以回答以上问题;
理解kafka的消息存储机制对于kafka调优是非常有帮助的;
存储管理的基本单元
对于kafka来说,存储的基本单元是partition,即数据分区;
一个partition只能由一个broker管理,数据分区是有序的不可变的消息集合,对于新增消息,只能append原有消息之后。
这个特点对于kakfa性能提升是非常有帮助的,详细原理参考:好文翻译:Thorough Introduction to Apache Kafka
![](/assets/blank.gif)
topic & partition
kafka的数据保留机制
可以通过配置数据的保留时长或者数据的大小来清除之前的数据,正式由于partition的有序性以及不可变性,所以数据的清除也是非常的快的;只需要将相应offset之前的数据清除即可;
partition的分段机制
一个partition会被分为多个segment,原因是如果仅保留一个segment,那么数据量太大的时候,执行清除操作就会比较不方便;可以想象一下,删除一个文件的前半部分,仅保留后半部分,这个功能相对比较耗时而且易于出错;
在partition写入数据的时候,实际上是向segment写入数据,仅有一个segment是活跃的,但这个segment的大小达到一定时,就会关闭写入流,重新启动一个写入流;
segment的命名机制时根据其offset命名的,这样根据offse查找时非常容易查找;
![](/assets/blank.gif)
offset命名机制
在磁盘上,一个partition时以一个文件夹的形式存在,每一个segment的信息由两个文件记录,一个是index文件,另一个时log文件;
消息到底存储在哪儿?
上面提到了segment由两个文件,其中一个是index文件,另一个是log文件;消息实际存储的位置时log文件,主要包含以下信息:消息key、消息内容、偏移值、时间戳、消息大小、压缩格式等;
在消息从接受到存储过程中,消息数据是不变的,所以由producer到磁盘,由磁盘到consumer,可是实现零拷贝,这也是kafka性能比较好的重要原因之一;
index文件是干什么的?
index文件从名字来看是索引用的,那么到底是什么到什么的索引呢?
![](/assets/blank.gif)
通过上图可以看出,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会将多个消息记录进行压缩,打包,然后提升性能;
![](/assets/blank.gif)
生产者打包消息
推荐文章:
kafka源码分析 - 项目架构
kafka官网译文
input hidden的值存储在哪儿_kafka内核:消息存储模块的工作机制相关推荐
- input hidden用法
之前获取数据传数据,都是写在全局变量里,今天老板告诉我说用input hidden来存,我百度了一下,确实是个好方法,记录之: 1 隐藏域在页面中对于用户是不可见的,在表单中插入隐藏域的目的在于收集或 ...
- iframe页面改动parent页面的隐藏input部件value值,不能触发change事件。
实现一个依据iframe页面返回充值卡类型不同,安排不同的input部件. 点击选择弹出一个iframe.点击充值卡数据行.返回1.充值卡类型.2.充值卡id(用的UUID).3.充值卡号(字符串). ...
- Cloudflare Workers支持WebAssembly和键值存储
Cloudflare最近宣布给他们的"无服务器"服务Workers新增两个附加功能:将WebAssembly作为JavaScript的替代方案,提供了对WebAssembly的支持 ...
- PostgreSQL 10.1 手册_部分 II. SQL 语言_第 10 章 类型转换_10.4. 值存储
10.4. 值存储 将被插入到一个表的值会按照下列步骤被转换到目标列的数据类型. 值存储类型转换 检查一个与目标的准确匹配. 否则,尝试转换表达式为目标类型.如果在两种类型之间的一个 赋值造型已经被注 ...
- php监听input,jQuery如何实时监听获取input输入框的值
jQuery实时监听获取input输入框的值,在我们日常web项目开发也常需要去实现这样的功能效果.为了作出即时动作去引导浏览者,以便提高网站的用户体验感. 下面我们就结合具体的代码示例,为大家介绍j ...
- JS改变input的value值不触发onchange事件解决方案 (转)
JS改变input的value值不触发onchange事件解决方案 (转) 参考文章: (1)JS改变input的value值不触发onchange事件解决方案 (转) (2)https://www. ...
- python input与返回值-python中使用input()函数获取用户输入值方式
我们编写程序最终目的还是来解决实际问题,所以必然会遇到输入输出的交互问题,python中提供了input函数用来获取用户的输入,我们可以用以下程序演示. user_gender = input(&qu ...
- python input与返回值-Python基础教程之输入输出和运算符
在我们python中输入输出函数在程序中运用较为广泛,运算符常用于if判断的条件中,今天我来给大家讲解这两项概念. input输入和print输出 input()输入函数 从标准输入设备(一般指键盘) ...
- 五大存储模型关系模型、键值存储、文档存储、列式存储、图形数据
五大存储模型关系模型.键值存储.文档存储.列式存储.图形数据 时间:2014-06-12 16:15来源:知行网www.zhixing123.cn 编辑:麦田守望者 昨天跟一同事讨论Sybase是不是 ...
最新文章
- HttpClient+Jericho HTML Parser 实现网页的抓取
- Jsp之五 过滤器与监听器
- PAT甲级题目翻译+答案 AcWing(高精度)
- 十分钟上线 - 函数计算构建支付宝小程序的后端
- Spring系列:父子容器详解
- python 获取当前路径_Python获取当前路径实现代码
- 《数学之美》—简单之美-布尔代数和搜索引擎
- matlab绘直方图,[转载]matlab中函数bar绘制直方图
- Python Package 之 Faker(随机姓名、电话)
- vue中audio实现微信语音播放动画
- dns服务器配置错误无法修复,电脑DNS错误修复的方法教程
- VIOS 磁盘映射简介
- GPS定位系统普遍存在的问题
- 进程同步(操作系统)
- java生成excel并输出到浏览器下载
- Vue3.0 自定义v-model:xxx
- 广州火车东站办理乘车临时身份证明
- Pipe(管道)的一些理解
- 2021-11-25牛客网项目第一章——Linux系统编程入门
- spring-web-pom