Kafk设计篇01(设计动机+持久化)

背景

本篇文章基于最新版本:kafka 3.7,其他版本的设计,请参考官网:

https://kafka.apache.org/documentation/

设计动机

任何组件都有它存在的必要,必然是要解决某一类问题的。我们来看看kafka设计的初衷如何。

kafka定位:一个能够处理所有实时数据的统一平台

注意这里有两个关键词:实时数据、统一的平台。

实时数据:我们可以大致解释为,kafka设计之初是专门针对实时数据流场景的。真实生产环境中也是如此,我们一般利用kafka用来接收实时流数据,而且往往是大数据量的场景,它能轻松的抗住上万的qps,并且具备消息持久化的能力。

统一平台:这里平台的意思,我个人理解是,不仅提供了消息中间件的能力,还提供了一系列配套的功能,来辅助完成消息的认证、接入、加工处理。这里分别指的是:SASL、Connect和Kafka Streaming。

基于以上目标,kafka必须拥有高吞吐,才能支持像实时日志聚合这样的大体量数据流,通常大公司,实时日志数据量会非常多,一天能到亿级别甚至更高。它还需要能够优雅的处理大量的积压数据,来支持离线场景周期的数据加载。这也意味着,这个系统需要能够具备低延迟的发送,来处理更加传统的消息使用场景。

最后,在提供数据流给其他数据系统过程中,我们需要保证机器在出现故障时的容错能力。

综上:kafka这个系统,最少需要具备以下能力:

  • 高吞吐
  • 大数据量场景
  • 低延迟的消息处理
  • 很强的容错能力

持久化

不要害怕文件系统!

Kafka很大程度的依赖文件系统来存储和缓存消息。在目前看来,与固态硬盘、内存等相比,大家总认为磁盘非常慢,这也让大家抱有怀疑,利用磁盘来进行持久化是否能够提供有竞争力的性能。

事实上,磁盘的效率取决于大家怎么用,他会比我们想象中的更快(用得好)或更慢(用的差),并且适当的磁盘结构设计往往能够像网络一样快。

磁盘性能的关键因素是在近十年来硬件驱动器的吞吐量已经和磁盘寻址延迟不同。因此,在具有六个7200转速的SATA RAID-5阵列的JBOD配置上,线性写入的性能约为600MB/秒,但是随机写入的性能只有大约100k/秒,两者之间相差6000倍。这就是为什么上面说的,磁盘用得好比我们想象中的快,用不好比我们想象的慢。这些线性读写是所有使用场景中最容易预测的,操作系统做了很多的优化。一个现代操作系统提供了预读和后写的技术,以大块倍数进行数据预读取并且将较小的写入操作合并为一次较大的物理写入,写入这里可以理解为微批的思路。关于磁盘的一些研究发现,顺序的磁盘访问在一些场景下,能够比随机内存访问更快。

为了弥补性能的差异,现代操作系统积极的使用主存进行磁盘缓存。一个现代的操作系统在回收内存时,会很高兴的将所有可用内存转移到磁盘缓存,而几乎不会对性能造成影响。所有的磁盘读写操作都会通过这个统一的缓存(文件缓存)。这个特性在不使用直接I/O的情况下,不能轻松的被关闭,所以即使一个进程维护了一份数据的进程内的缓存,这份数据也会在操作系统的页缓存中被复制一份,会有效的将数据存储两次。

而且,我们是建立在JVM之上的,并且任何一个花时间使用过java内存的人知道这两件事:

  1. 对象的内存开销非常高,经常使存储的数据的大小翻倍,甚至更大。
  2. 当堆内的数据变大,Java的垃圾回收变得繁琐和缓慢。

由于上述这些因素,使用文件系统以及依赖页缓存更优于保持内存级的缓存或其他结构。通过自动的访问所有可用内存,我们至少能够将可用缓存翻倍,甚至通过存储紧凑的字节结构,而不是独立的对象,还能够再次翻倍。这样做能够在32G的机器上获得28-30G的内存空间,而不会受到GC的影响。

而且这部分缓存即使服务重启也会保持在热状态,然而进程内缓存是需要重建的(10GB缓存数据,可能需要10分钟),或者说需要从一个完全冷缓存中进行预热,这也伴随着很糟糕的性能。这极大地简化了代码,现在所有保持缓存和文件系统一致性的逻辑都在操作系统中,这也意味着比进程内一次性的尝试更加的高效和正确。如果你的磁盘使用场景倾向于线性读取,那么预读机制会在每次磁盘读时更有效的将有效数据填充到缓存中去。

这表明了一种非常简单的设计:并非在内存中保存越多的数据,然后在我们快用完空间时,恐慌的将数据刷入到文件系统中去,我们恰恰相反。所有的数据会被立即写到文件系统中的持久化日志文件中去,即不需要刷入到磁盘了。实际上这只意味着它被转移到内核的页缓存中去。真正刷盘的动作,由操作系统来保证。

下图简单描述了下页缓存和磁盘文件的关系:

在这里插入图片描述

这里简单总结下使用文件系统的好处:

  • 顺序读写场景,比内存随机读更快
  • 页缓存由os维护,一致性也由操作系统保证,对象存储效率更高
  • 能够使用更大的缓存空间32G机器最高能用到30G的缓存,且不会受到gc的影响

因此,后续我们在设计系统时,不一定仅仅考虑数据在内存中保持,可以适当的考虑文件系统,充分利用操作系统的预读 + 批量刷盘机制。

恒定时间保证

消息系统中的持久化数据结构往往使用相关联的B树或其他通用的随机访问数据结构,来保存消息的元数据。B数是最通用的可用数据结构,并且在消息系统中支持多种事务和非事务的语义。但是B树有相当高的代价,对Btree的操作时间复杂度是O(log N)。一般来说O(log N)被认为基本等同于恒定时间,但是在磁盘操作中,这个结论不成立。磁盘寻址一次10ms,且磁盘同一时间只能做一次寻址操作,并行是有限制的。因此即使少量的磁盘寻址操作也会导致很高的代价。由于存储系统混合了非常快的缓存操作和非常慢的物理磁盘操作,树结构的观测性能常常随着混合数据的增长是超线性增长的,即:一倍的数据往往是性能降低一倍以上。

直观来说,持久化队列可以被构建为简单的读和文件追加的方式,这在日志解决方案中很常见。这个结构的优势是所有的操作是O(1)并且读写不会互相阻塞。这有很明显的性能优势,因为性能和数据规模是完全分离的,一个服务器可以使用便宜的、低转速的、1TB以上的 SATA磁盘设备。尽管他们的寻址性能很差,但是他们有着可接受的大数据量读写的性能并且只有1/3的价格以及3倍的容量。

在这里插入图片描述

可以访问几乎无限的磁盘空间而不会有性能衰减意味着我们可以提供一些其他消息系统不常见的功能。例如,在kafka中,当消息被消费后,我们不会尝试去尽快的删除消息,我们可以把消息保留相当一段时间,比如说一周(默认)。这使得消费者可以非常的灵活,比如说可以通过多个消费组,多次消费历史的消息。

随着数据量增大,kafka消息持久化以及读取,始终是恒定的时间:O(1)。

这也是一个亮点。特别是现在磁盘的转速越来越高,价格也始终保持很低,也让kafka越发的有优势。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/605890.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python---Numpy万字总结(1)

NumPy的应用(1) Numpy 是一个开源的 Python 科学计算库,用于快速处理任意维度的数组。Numpy 支持常见的数组和矩阵操作,对于同样的数值计算任务,使用 NumPy 代码简洁,在性能上也远远优于原生 Python&#…

温度表程序里的公式推算

今天要改个温度表的程序,但是好几年没搞过了。所以程序里面的各种数字怎么算出来的都忘记了。花了半天才想起来,所以记录在这里,下次再忘记了就来翻一下。。 下次应该看到这个能想起来的把。

【论文笔记】KAN: Kolmogorov-Arnold Networks 全新神经网络架构KAN,MLP的潜在替代者

KAN: Kolmogorov-Arnold Networks code:https://github.com/KindXiaoming/pykan Background ​ 多层感知机(MLP)是机器学习中拟合非线性函数的默认模型,在众多深度学习模型中被广泛的应用。但MLP存在很多明显的缺点:…

nginx--系统参数优化telenct

系统参数 在生产环境中,根据自己的需求在/etc/sysctl.conf来更改内核参数 net.ipv4.ip_nonlocal_bind 1 允许非本地IP地址socket监听 net.ipv4.ip_forward 1 开启IPv4转发 net.ipv4.tcp_timestamps 0 是否开启数据包时间戳 net.ipv4.tcp_tw_reuse 0 端⼝口复⽤…

ctfshow之_萌新web9至web10

一、访问在线靶场ctfshow 1、web9 如下图所示,进入_萌新赛的web9问题,题目提醒flag在config.php中: 如上图所示,可以get传参,且传入的参数需要正则匹配system、exec、highlight,且不区分大小写&#xff0…

分类任务的基础学习

1.什么是分类? 2.局限性: 当样本量逐渐变大的时候,准确率会下降——>因为线性回归曲线距离我们的原点越远,预测就会开始不准确,因为 x前面的倍数就会越来越小,这就导致了样本量变大,但是那些…

安卓开发--环境配置

本次项目选择使用 Andrio Studio 进行开发。虽然这款软件版本更新也很快。不过开发一款APP的技术流程是大差不差的。我几年前的安卓笔记放到现在还是能用。 现在CSDN网上写一个笔记留作以后参考,开始吧!!! 1 安装 Andrio Studio …

Jmeter性能测试(五)

一、Jmeter参数化常用方式 1、CSV 数据文件设置 2、查询数据库(JDBC Connection Configuration) 二、CSV 数据文件设置 1、准备一个txt文件(不需要写表头,直接写你要用的数据就行了,多个字段用英文逗号隔开) 2、添加一个CSV 数据文件设置(放全局最上…

Vue从入门到实战Day02

一、指令补充 1. 指令修饰符 通过 “.”指明一些指令后缀,不同后缀封装了不同的处理操作 -> 简化代码 键盘按键修饰符 如:keyup.enter -> 键盘回车监听 常用按键修饰符别名 别名修饰符键值修饰符对应按键.delete.8/.46回格 / 删除.tab.9制表.e…

01-单片机商业项目编程,从零搭建低功耗系统设计

一、引言 这是关于《单片机商业编程之从零搭建低功耗系统》的第一篇章,个人善忘,平常项目设计当中的一些思路,以前年轻的时候习惯性的录制成视频,也算是当作是自己的笔记,无奈现在喉咙实在扛不住,因此先尝试…

Linux下的I2C通信

I2C通信: 一.硬件初识: IIC(inter-intergrated-Circu):内部集成总线 四线通讯:SCL,SDA,GND,VCC,串行,半双工 I2C 总线是同步,串行,半双工通信总线。 I2C 总线由时钟线 SDA 和 SCL 两根信号线构成。并且都有上拉电阻。确保总线空闲状态为高电平。 I2C 总线支持多…

四川古力未来科技抖音小店:安全便捷购物新体验

在这个数字化快速发展的时代,网络购物已经成为人们生活中不可或缺的一部分。四川古力未来科技抖音小店以其高度的安全性,为广大消费者提供了一个值得信赖的购物平台。在这里,我们可以享受到安全便捷的购物体验,畅游科技的海洋。 一…

java回调机制

目录 一、简介二、示例2.1 同步回调2.2 异步回调2.3 二者区别 三、应用场景 一、简介 在Java中,回调是一种常见的编程模式,它允许一个对象将某个方法作为参数传递给另一个对象,以便在适当的时候调用该方法。 以类A调用类B方法为例: 在类A中…

CTF-reverse,逆向分析,对“左移4或右移4,即(x<<4) | (x >>4)的加密探讨

博主在刷题过程中遇上这样一个有意思的加密(如下图),苦苦思索其逆向运算,被硬控了很久,也没搜到什么资料来解释这个问题(也许是太简单??蒟蒻博主怀疑人生……) 经过博主不…

2024最新版JavaScript逆向爬虫教程-------基础篇之无限debugger的原理与绕过

目录 一、无限debugger的原理与绕过1.1 案例介绍1.2 实现原理1.3 绕过debugger方法1.3.1 禁用所有断点1.3.2 禁用局部断点1.3.3 替换文件1.3.4 函数置空与hook 二、补充2.1 改写JavaScript文件2.2 浏览器开发者工具中出现的VM开头的JS文件是什么? 一、无限debugger的…

正点原子Linux学习笔记(七)在 LCD 上显示 png 图片

在 LCD 上显示 png 图片 21.1 PNG 简介21.2 libpng 简介21.3 zlib 移植下载源码包编译源码安装目录下的文件夹介绍移植到开发板 21.4 libpng 移植下载源码包编译源码安装目录下的文件夹介绍移植到开发板 21.5 libpng 使用说明libpng 的数据结构创建和初始化 png_struct 对象创建…

win11个性化锁屏界面怎么关闭?

win11个性化锁屏界面关闭方法对于win11用户来说,关闭个性化锁屏界面是一个常见问题。本文将由php小编苹果详细介绍如何执行此操作,分步指导并提供操作截图。继续阅读以了解具体步骤。 win11个性化锁屏界面关闭方法 第一步,点击底部Windows图…

企信通_企信通短信群发平台

现代社会,随着互联网技术的快速发展,传统的营销方式已经无法满足企业对于市场开拓和客户沟通的需求。群发作为一种高效、低成本的营销手段,逐渐成为了众多企业的首选。而在众多群发平台中,嘀迈信息企信通公司凭借其稳定可靠的服务…

GM EPUB Reader Pro for Mac:专业电子书阅读工具

GM EPUB Reader Pro是一款适用于Mac的专业EPUB阅读软件。它为用户提供了优质的阅读体验和丰富的功能。 GM EPUB Reader Pro支持EPUB格式,这是一种广泛使用的电子书格式,常用于小说、教育书籍、期刊等。您可以通过该软件打开和阅读EPUB文件,享…

提取网页元数据的Python库之lassie使用详解

概要 Lassie是一个用于提取网页元数据的Python库,它能够智能地抓取网页的标题、描述、关键图像等内容。Lassie的设计目的是为了简化从各种类型的网页中提取关键信息的过程,适用于需要预览链接内容的应用场景。 安装 安装Lassie非常简单,可以通过Python的包管理器pip进行安…