看完就入门系列!吞吐量、消息持久化、负载均衡和持久化、伸缩性…… 你真的了解 Kafka 了吗?...

作者| liuhehe123

来源| CSDN博客 责编| Carol

出品| CSDN云计算(ID:CSDNcloud)

封图| CSDN下载于视觉中国 

无论是已经接触过 Kafka 还是刚入坑的小伙伴,都应该时不时回头了解一下 Kafka ,有时候会有不少新收获。今天这份 Kafka 的介绍,建议再认真阅读一遍哦~

Kafka在设计之初就考虑的问题:

  • 吞吐量/延时

  • 消息持久化

  • 负载均衡和持久化

  • 伸缩性

吞吐量

kafka是如何做到高吞吐量和低延时的呢?

kafka的写入操作是很快的,这主要得益于它对磁盘的使用方法不同。虽然kafka会持久化所有数据到磁盘,但本质上每次写入操作其实都只是把数据写入到操作系统的页缓存中,然后由操作系统自行决定什么时候把页缓存中的数据写回磁盘。

先说kafka是咋实现的,kafka依靠下列4点达到了高吞吐量、低延时的设计目标:

  • 大量使用操作系统叶缓存,内存操作速度快且命中率高。

  • kafka不直接参与物理I/O操作,而是交给最擅长此事的操作系统来完成。

  • 采用追加写入的方式,摒弃了缓慢的磁盘随机读写操作。

  • 使用以sendfile为代表的的零拷贝技术加强网络间的数据传输效率。

前三个都是使用页缓存的好处,页缓存是在内存中分配的,所以写入消息很快。使得kafka不必直接与底层文件系统打交道。另外采用追加的方式写入,避免了磁盘随机写操作。

零拷贝:

简而言之,就是避免让CPU做大量的数据拷贝技术,采用不使用CPU时间的技术进行系统内核缓冲区之间的数据拷贝。

从上图中可以看出,共产生了四次数据拷贝,即使使用了DMA来处理了与硬件的通讯,CPU仍然需要处理两次数据拷贝,与此同时,在用户态与内核态也发生了多次上下文切换,无疑也加重了CPU负担。

1、让数据传输不需要经过user space

我们减少拷贝次数的一种方法是调用mmap()来代替read调用:

buf = mmap(diskfd, len);write(sockfd, buf, len);

应用程序调用mmap(),磁盘上的数据会通过DMA被拷贝的内核缓冲区,接着操作系统会把这段内核缓冲区与应用程序共享,这样就不需要把内核缓冲区的内容往用户空间拷贝。应用程序再调用write(),操作系统直接将内核缓冲区的内容拷贝到socket缓冲区中,这一切都发生在内核态,最后,socket缓冲区再把数据发到网卡去。

2、sendfile

使用sendfile不仅减少了数据拷贝的次数,还减少了上下文切换,数据传送始终只发生在kernel space。下图为使用DMA的sendfile零拷贝技术图。

消息持久化

kafka是要持久化消息的,而且要将消息持久化到磁盘上的。

先说这样做的好处(为什么要持久化):

  • 解耦消息发送与消息消费:通过将消息持久化使得生产者不再需要直接和消费者方耦合,它只是简单地把消息生产出来并交由kafka服务器保存起来即可。

  • 实现灵活的消息处理(便于消息重演):很多kafka下游子系统(消费方)都会有这样的需求——对于已经处理过的消息可能在未来的某个时间点重新处理一次,即所谓的消息重演(message replay)

那么kafka持久化是咋做的呢?

对比一下:

普通的系统实现持久化时可能先尽量使用内存,当内存资源耗尽时,再一次性地把数据 “刷盘”;kafka则反其道行之,所有数据都会立即被写入到文件系统的持久化日志中,之后kafka服务器才会返回结果给客户端,通知客户端消息写入成功。这样做即实时保存了数据,又减少了kafka程序对于内存的消耗,从而将节省出的内存留给页缓存使用,进一步提升整体性能。

这里解释下:kafka在吞吐量中说使用页缓存,持久化又说尽量减少对内存的消耗,这是咋回事?

总的来说,Kafka不会保持尽可能多的内容在内存空间,而是尽可能把内容直接写入到磁盘。所有的数据都及时的以追加的方式写入到文件系统的持久化日志中,而不必要把内存中的内容刷新到磁盘中。

负载均衡和故障转移

kafka作为一个完备的分布式系统,肯定也是要满足负载均衡和故障转移处理操作的。

负载均衡:kafka的负载均衡是通过智能化的分区领导者选举来实现的。可以在集群中的所有机器上以均等的机会分散各个partition的leader,从而整体上实现了负载均衡。【后面进行补充】

故障转移(使用zookeeper):即当服务器意外中止时,整个集群能够快速检测到他失效了,并立即将该服务器上的应用或服务转移到其他机器上。kafka使用的是会话机制来解决的。每台kafka服务器启动后会以会话的形式把自己注册到zookeeper服务器上,一旦该服务器运转出现问题,与zookeeper的会话便不能维持从而超时失效,此时kafka会选举出一台新的服务器赖万全代替这台服务器继续提供服务。

伸缩性

伸缩性指的是:向分布式系统系统中增加额外的计算资源时提升吞吐量的能力。

如果服务器是无状态的,状态的保存和管理交给专门的协调服务来做,比如 zookeeper ,那么整个集群的服务器之间就不需要再进行繁重的状态共享,这极大地降低了维护复杂度。

Kafka 正式采用了这一思想——每台kafka的服务器上的状态统一交由Zookeeper保管。而扩展kafka集群就很容易:启动一台新的kafka服务器即可。

需要说明的一点是,kafka服务器并不是所有状态都不保存,他只是保存了很轻量级的内部状态,所以整个集群间维护状态一致性的代价很低。

来看看kafka的基本概念和术语

目前kafka最新的版本是 2.4。

1、broker、topic、partition、offset、replica、leaderfollower

下面是Kafka的大致架构图:

Kafka服务器官方称呼为:broker。

先来说说Kafka的消息格式是啥样的?

消息由三部分组成:消息头部、key value。

消息头:包括CRC码、消息版本、属性、时间戳、键长度和消息体长度等信息。

Key: 消息键, 对消息做partition时使用,即决定消息被保存在某个topic下的那个partition。

Value:消息体,保存实际的消息数据。

Timestamp: 消息发送时间戳。

2、kafka的Topic和Partition 到底是个什么东西?

Topic(主题): topic代表了一类消息,也可以认为消息被发送到的地方。比如业务A使用一个topic, 业务B使用另外一个topic。相当于 柴鸡蛋和茶叶蛋这样简单分下。

Partition(分区)???? 一个Topic可以由多个partition组成,而kafka的partition是不可修改的有序消息序列。分区是物理层面的,用户是看不到的,用户不用管这些消息怎么取出来的,之所以做分区,主要是为了提高系统的吞吐量。

3、offset

一个(生产的)消息的写入offset位移值, 一个是消费者端的消费位移offset。他俩是不同的概念。

消费该partition的消费者位移会随着消费进度不断前移,不过终究不可能超过该分区的最新一条消息的位移。

kafka的一条消息其实就是一个三元组:<topic, partition, offset> 三元组(tuple),通过该元组值能够在kafka集群中找到唯一对应的那条消息。

4、replica

kafka的冗余机制,备份多份日志,这些备份日志在kafka中被称为副本(replica),他们存在就是为了 防止数据丢失的。

5、leader和follower

leader提供对外服务,follower与leader保持同步,follower存在的目的就是用来充当leader的候补。

6、ISR(同步副本集合)

kafka为partition动态维护了一个replica集合,该集合中的所有replica保存的消息日志都与leader replica 保持同步状态。

记住,只有这个集合(ISR)中的replica才能被选为leader,也只有这个集合中的所有replica都接受到了同一条消息,Kafka才会将消息置于 “已提交” 状态,即认为这条消息发送成功。

【这里不要与producer端搞混,producer端的参数acks设置 0、all/-1 、1的情况,会在后面的文章补充。】

7、kafka使用场景

  • 消息传输

  • 网站行为日志跟踪

  • 日志收集

  • 流式处理

零拷贝部分参考作者以及链接:

作者:卡巴拉的树 https://www.jianshu.com/p/fad3339e3448

本文来源 CSDN 博客,原文链接:

https://blog.csdn.net/liuhehe123/article/details/105429934

同时,欢迎所有开发者扫描下方二维码填写《开发者与AI大调查》,只需2分钟,即可收获价值299元的“ AI开发者万人大会”在线直播门票!

推荐阅读:小网站的容器化(下):网站容器化的各种姿势,先跟着撸一波代码再说!
你知道吗?其实Oracle直方图自动统计算法存在这些缺陷!(附验证步骤)
详解以太坊虚拟机(EVM)的数据存储机制
比特币当赎金,WannaRen勒索病毒二度来袭!平台抗住日访问量7亿次,研发品控流程全公开“手把手撕开LeetCode翻译,扒各种算法套路的裤子”北京四环堵车引发的智能交通大构想
真香,朕在看了!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Alibaba Cloud Linux 2 开源后又有什么新动作?

阿里妹导读&#xff1a;2019 年 4 月&#xff0c;Alibaba Cloud Linux 2 (Aliyun Linux 2) 正式开源。时至今日&#xff0c;已经走过三个月的里程。在这段时间内&#xff0c;这个刚诞生不久的为阿里云 ECS 环境定制优化的 Linux 操作系统发行版的装机量稳步上升。本文将重点介绍…

一站式数据采集存储的利器:阿里云InfluxDB®️数据采集服务

背景 随着时序数据的飞速增长&#xff0c;时序数据库不仅需要解决系统的稳定性和性能问题&#xff0c;还需实现数据从采集到分析的链路打通&#xff0c;才能让时序数据真正产生价值。在时序数据采集领域&#xff0c;一直缺少自动化的采集工具。虽然用户可以使用一些开源的采集…

Serverless 风起云涌,为什么阿里、微软、AWS 纷纷拥抱开源 OAM?

作者 | 张磊&#xff0c;阿里云原生应用平台高级技术专家邓洪超&#xff0c;阿里云技术专家责编 | 唐小引头图 | CSDN 下载自东方 IC出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;Serverless 这个词第一次被是 2012 年一篇名为《Why The Future of Software and …

K8S从懵圈到熟练 - 我们为什么会删除不了集群的命名空间?

阿里云售后技术团队的同学&#xff0c;每天都在处理各式各样千奇百怪的线上问题。常见的有&#xff0c;网络连接失败&#xff0c;服务器宕机&#xff0c;性能不达标&#xff0c;请求响应慢等。但如果要评选&#xff0c;什么问题看起来微不足道事实上却足以让人绞尽脑汁&#xf…

为什么技术人一定要懂点“可信计算”?

阿里妹导读&#xff1a;可信计算&#xff08;TrustedComputing&#xff0c;简称TC&#xff09;是一项由TCG(可信计算组)推动和开发的技术。可信的核心目标之一是保证系统和应用的完整性&#xff0c;从而确定系统或软件运行在设计目标期望的可信状态。可信和安全是相辅相成的&am…

很用心的为你写了 9 道 MySQL 面试题,建议收藏!

来源 | Java 建设者责编| Carol封图| CSDN下载于视觉中国 MySQL 也是作者本人正在学习的部分&#xff0c;后面会多输出 MySQL 的文章贡献给大家&#xff0c;毕竟 MySQL 涉及到数据存储、锁、磁盘寻道、分页等操作系统概念&#xff0c;而且互联网对 MySQL 的注重程度是不言而喻的…

OpenTelemetry-可观察性的新时代

有幸在2019KubeCon上海站听到Steve Flanders关于OpenTelemetry的演讲&#xff0c;之前Ops领域两个网红项目OpenTracing和OpenCensus终于走到了一起&#xff0c;可观察性统一的标准化已经扬帆起航。 这篇文章旨在抛砖引玉&#xff0c;希望能够和更多的同学一起交流可观察性相关的…

JavaScript-严格检查模式

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><!--前提&#xff1a; IDEA需要设置支持ES6 语法use strict; 必须写在JavaScript 的第一行严格检查模式&#xff0c;预防JavaS…

Feign常见问题总结

https://www.imooc.com/article/289005

你知道 Java 类是如何被加载的吗?

一&#xff1a;前言 最近给一个非Java方向的朋友讲了下双亲委派模型&#xff0c;朋友让我写篇文章深度研究下JVM的ClassLoader&#xff0c;我确实也好久没写JVM相关的文章了&#xff0c;有点手痒痒&#xff0c;涂了皮炎平也抑制不住。 我在向朋友解释的时候是这么说的&#x…

我们为什么需要 SpringBoot?

作者 | 阿文&#xff0c;责编 | 郭芮头图 | CSDN 下载自东方IC出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;任何先进技术的产生都不是凭空出现的&#xff0c;SpringBoot 也不例外&#xff0c;SpringBoot 是基于Spring 的基础上产生的。总所周知&#xff0c;Spri…

高德网络定位之“移动WiFi识别”

导读 随着时代的发展&#xff0c;近10年来位置产业蓬勃发展&#xff0c;定位能力逐渐从低精度走向高精度&#xff0c;从部分场景走向泛在定位。设备和场景的丰富&#xff0c;使得定位技术和能力也不断的优化更新。定位能力包括GNSS、DR&#xff08;航迹推算&#xff09;、MM&a…

JavaScript-字符串

字符串 正常字符串使用单引号 或者 双引号 包裹注意转义字符 \ \ \n \t \u4e2d \u#### Unicode字符 \x41 Ascll字符多行字符串编写 // tab 上面 esc下面的引号 let msg helloworld你好 console.log(msg)模板字符串 let name ht let age 5; let msg hello${name}你…

Alibaba Sentinel规则持久化-拉模式-手把手教程【基于文件】

文章目录一、拉模式架构二、原理简述三、编写3.1 加依赖3.2 写代码3.3 配置四、优缺点分析五、你可能会有的疑问六、参考文档七、案例测试7.1. 添加流控规则7.2. 服务停止7.3. 重新启动服务7.4. 调用接口7.5. 查看流控规则本文实现基于拉模式的Alibaba Sentinel规则持久化。一、…

开发者说:Seata 0.7.0 版本,你 get 'Metrics' 技能了吗?

从用户的视角来感受一个开源项目的成长&#xff0c;是我们推出「开发者说」专栏的初衷&#xff0c;即在开发者进行开源项目选型时&#xff0c;提供更为立体的项目信息。专栏所有内容均来自作者原创/投稿&#xff0c;本文是「开发者说」的第9篇&#xff0c;作者郑扬勇&#xff0…

面试时遇到「看门狗」脖子上挂着「时间轮」,我就问你怕不怕?

来源 | Why技术封图 | CSDN 下载于视觉中国之前写了一篇文章&#xff0c;有一个小节中写到这样一段话&#xff1a;于是就有读者来问了&#xff1a;老哥&#xff0c;看门狗介绍一下呗。面试的时候被问到了&#xff0c;没有回答上来。听到这个问题我脑海里首先浮现出了几个问题&…

海量结构化数据存储技术揭秘:Tablestore存储和索引引擎详解

前言 表格存储Tablestore是阿里云自研的面向海量结构化数据存储的Serverless NoSQL多模型数据库。Tablestore在阿里云官网上有各种文档介绍&#xff0c;也发布了很多场景案例文章&#xff0c;这些文章收录在这个合集中《表格存储Tablestore权威指南》。值得一提的是&#xff0…

JavaScript-数组

数组 Array可以包含任意的数据类型 var arr [1,2,3,4,5,6] arr[0] // 取值 arr[0] 3 // 赋值长度 arr.length arr.length 10 // 长度是可变的注意&#xff1a;假如给arr.length 赋值&#xff0c;数组大小就会发生变化。如果赋值过小&#xff0c;元素就会丢失 获取指定字…

Alibaba Sentinel规则持久化-推模式-手把手教程【基于Nacos】

前面&#xff0c;已经为Sentinel实现了 基于拉模式的规则持久化 &#xff0c;本文来实现基于 推模式的规则持久化。 文章目录一、推模式架构图二、原理简述三、微服务改造3.1. 加依赖3.2. 添加配置四、Sentinel控制台改造五、编译 & 启动六、测试测试1&#xff1a;测试2&am…