从0开始带你成为Kafka消息中间件高手---第二讲

从0开始带你成为Kafka消息中间件高手—第二讲

那么在消费数据的时候,需要从磁盘文件里读取数据后通过网络发送出去,这个时候怎么提升性能呢?

首先就是利用了page cache技术,之前说过,kafka写入数据到磁盘文件的时候,实际上是写入page cache的,没有直接发生磁盘IO,所以写入的数据大部分都是停留在os层的page cache里的

这个本质其实跟elasticsearch的实现原理是类似的

然后在读取的时候,如果正常情况下从磁盘读取数据,先尝试从page cache读,读不到才从磁盘IO读,读到数据以后先会放在os层的一个page cache里,接着会发生上下文切换到系统那边,把os的读缓存数据拷贝到应用缓存里

接着再次发生上下文二切换到os层,把应用缓存的数据拷贝到os的socket缓存中,最后数据再发送到网卡上

这个过程里,发生了好几次上下文切换,而且还涉及到了好几次数据拷贝,如果不考虑跟硬件之间的交互,起码是从os cache到用户缓存,从用户缓存到socket缓存,有两次拷贝是绝对没必要的

但是如果用零拷贝技术,就是linux的sendfile,就可以直接把操作交给os,os看page cache里是否有数据,如果没有就从磁盘上读取,如果有的话直接把os cache里的数据拷贝给网卡了,中间不用走那么多步骤了

对比一下,是不是所谓的零拷贝了?

所以呢,通过零拷贝技术来读取磁盘上的数据,还有page cahce的帮助,这个性能就非常高了
在这里插入图片描述
在这里插入图片描述
基本上可以认为每个partition就是一个日志文件,存在于某台Kafka服务器上,然后这个日志里写入了很多消息,每个消息在partition日志文件里都有一个序号,叫做offset,代表这个消息是日志文件里的第几条消息

但是在消费消息的时候也有一个所谓的offset,这个offset是代表消费者目前在partition日志文件里消费到了第几条消息,是两回事儿
在这里插入图片描述
kafka的消息格式如下:

crc32(确保消息没有修改),magic,attribute(属性),时间戳,key长度,key,value长度,value

kafka是直接通过NIO的ByteBuffer以二进制的方式来保存消息的,这种二级制紧凑保存格式可以比使用Java对象保存消息要节约40%的内存空间

然后这个消息实际上是封装在一个log entry里的,你可以认为是一个日志条目吧,在kafka里认为每个partition实际上就是一个磁盘上的日志文件,写到parttion里去的消息就是一个日志,所以log entry就是一个日志

这个日志条目包含了一个offset,一个消息的大小,然后是消息自身,就是上面那个数据结构,但是这里要注意的一点,就是这个message里可能会包含多条消息压缩在一起,所以可能找一条消息,需要从这个压缩数据里遍历搜索

而且这里还有一个概念就是消息集合,一个消息集合里包含多个日志,最新名称叫做RecordBatch

后来消息格式演化为了如下所示:

(1)消息总长度
(2)属性:废弃了,已经不用
(3)时间戳增量:跟RecordBatch的时间戳的增量差值
(4)offset增量:跟RecordBatch的offset的增量差值
(5)key长度
(6)key
(7)value长度
(8)value
(9)header个数
(10)header:自定义的消息元数据,key-value对

通过时间戳、offset、key长度等都用可变长度来尽可能减少空间占用,v2版本的数据格式比v1版本的数据格式要节约很多磁盘开销
但是这里有一个很大的问题,就是不可能说把TB量级的数据都放在一台Kafka服务器上吧?这样肯定会遇到容量有限的问题,所以Kafka是支持分布式存储的,也就是说你的一个topic,代表了逻辑上的一个数据集

你大概可以认为一个业务上的数据集合吧,比如说用户行为日志都走一个topic,数据库里的每个表的数据分别是一个topic,订单表的增删改的变更记录进入一个topic,促销表的增删改的变更记录进入一个topic

每个topic都有很多个partition,你认为是数据分区,或者是数据分片,大概这些意思都可以,就是说这个topic假设有10TB的数据量需要存储在磁盘上,此时你给他分配了5个partition,那么每个partition都可以存放2TB的数据

然后每个partition不就可以放在一台机器上,通过这个方式就可以实现数据的分布式存储了,每台机器上都运行一个Kafka的进程,叫做Broker,以后大家记住,borker就是一个kafka进程,在一台服务器上就可以了
在这里插入图片描述

但是这里就有一个问题了,如果此时Kafka某台机器宕机了,那么一个topic就丢失了一个partition的数据,此时不就导致数据丢失了吗?所以啊,所以对数据做多副本冗余,也就是每个parttion都有副本

比如最基本的就是每个partition做一个副本,副本放在另外一台机器上

然后呢kafka自动从一个partition的多个副本中选举出来一个leader partition,这个leader partition就负责对外提供这个partiton的数据读写,接收到写过来的数据,就可以把数据复制到副本partition上去

这个时候如果说某台机器宕机了,上面的leader partition没了,此时怎么办呢?通过zookeeper来维持跟每个kafka的会话,如果一个kafka进程宕机了,此时kafka集群就会重新选举一个leader partition,就是用他的某个副本partition即可

通过副本partition可以继续体统这个partition的数据写入和读取,这样就可以实现容错了,这个副本partition的专业术语叫做follower partition,所以每个partitino都有多个副本,其中一个是leader,是选举出来的,其他的都是follower partition

多副本冗余的机制,就可以实现Kafka高可用架构
在这里插入图片描述
光是依靠多副本机制能保证Kafka的高可用性,但是能保证数据不丢失吗?不行,因为如果leader宕机,但是leader的数据还没同步到follower上去,此时即使选举了follower作为新的leader,当时刚才的数据已经丢失了

ISR是:in-sync replica,就是跟leader partition保持同步的follower partition的数量,只有处于ISR列表中的follower才可以在leader宕机之后被选举为新的leader,因为在这个ISR列表里代表他的数据跟leader是同步的

如果要保证写入kafka的数据不丢失,首先需要保证ISR中至少有一个follower,其次就是在一条数据写入了leader partition之后,要求必须复制给ISR中所有的follower partition,才能说代表这条数据已提交,绝对不会丢失,这是Kafka给出的承诺
在这里插入图片描述
假如说很多partition的leader都在一台机器上,那么不就会导致大量的客户端都请求那一台机器?这样是不对的,kafka集群会自动实现负载均衡的算法,尽量把leader partition均匀分布在集群各个机器上

然后客户端在请求的时候,就会尽可能均匀的请求到kafka集群的每一台机器上去了,假如出现了partition leader的变动,那么客户端会感知到,然后下次就可以就可以请求最新的那个leader partition了
在这里插入图片描述
Kafka的broker尽量是无状态的,状态数据存入Zookeeper,zookeeper用来管理Broker的状态

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

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

相关文章

企业微信hook接口协议,ipad协议http,根据手机号搜索联系人

根据手机号搜索联系人 参数名必选类型说明uuid是String每个实例的唯一标识,根据uuid操作具体企业微信 请求示例 {"uuid":"3240fde0-45e2-48c0-90e8-cb098d0ebe43","phoneNumber":"1357xxxx" } 返回示例 {"data&q…

隐私是建立人工智能信任的关键

微信关注公众号网络研究观获取更多。 谷歌的 Astra 是其首款人工智能代理 谷歌继续将生成式人工智能融入网络安全 云的复杂性是我们这个时代最大的安全威胁 云安全最受关注的问题:人工智能生成的代码 企业可以从人工智能中获得转型利益,但确保“隐…

CAD二次开发(4)-编辑图形

工具类:EditEntityTool.cs using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.Geometry; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Th…

Leetcode | 5-22 | 每日一题 | 找出输掉零场或一场比赛的玩家

🔥博客介绍: EvLast 🎥系列专栏: 数据结构与算法 , 算法入门 , C项目 , Leetcode_DayCode 🎥 当前专栏: Leetcode_DayCode 专题 : 数据结构帮助小白快速入门算法 👍👍👍&#x1…

Go语言之Gorm框架(一) ——初窥Gorm框架

Gorm和Mysql驱动的安装 打开终端,输入下列命令即可: go get gorm.io/driver/mysql go get gorm.io/gormGorm连接数据库 示例 package mainimport ("fmt""github.com/sirupsen/logrus""gorm.io/driver/mysql""gor…

HE TB PPDU MU-RTS

看起来像是MU-RTS的触发帧的应答不是HE TB PPDU,而是传统得的帧,应答CTS。 非AP 的STA,是不能发送触发帧,也就是说,触发帧,只能是由AP发送给STA

AI视频智能分析引领智慧园区升级:EasyCVR智慧园区视频管理方案

一、系统概述与需求 随着信息技术的不断发展,智慧园区作为城市现代化的重要组成部分,对安全监控、智能化管理提出了更高的要求。智慧园区视频智能管理系统作为实现园区智能化管理的重要手段,通过对园区内各关键节点的视频监控和智能分析&…

一文了解安卓内存抖动

目录 目录一、什么是内存抖动?1.1 Android里的内存抖动1.2 如何直观查看这种现象1.3 内存抖动带来的风险 二、如何避免内存抖动 目录 一、什么是内存抖动? 在程序里,每创建一个对象,就会有一块内存分配给它,每分配一…

LabVIEW虚拟测试实验室开发

LabVIEW虚拟测试实验室开发 在当代的科技和工业进步中,测试与测量扮演着至关重要的角色。随着技术的发展,测试系统也变得日益复杂和成本昂贵,同时对测试结果的准确性和测试过程的效率要求越来越高。开发了一种基于LabVIEW的虚拟测试实验室的…

ICQ 将于 6 月关闭,这是一种奇怪的方式,发现它在 2024 年仍然活跃

你知道ICQ还活着吗?不过,不要太兴奋;它将永远消失。 还记得ICQ吗?如果你这样做了,你可能会记得它是AOL在1998年购买的Messenger客户端,就在Yahoo Instant Messager和MSN Messenger加入竞争的时候。然后Skype出现了&…

SpringBoot3笔记(一)SpringBoot3-核心特性

快速学习 SpringBoot 看官方文档: Spring Boot Reference Documentation 计划三天学完 笔记:https://www.yuque.com/leifengyang/springboot3 代码:https://gitee.com/leifengyang/spring-boot-3 一、SpringBoot3 - 快速入门 1.1 简介 …

【全开源】招聘求职小程序系统源码(ThinkPHP+原生微信小程序)

基于ThinkPHP和原生微信小程序开发的招聘平台系统,包含微信小程序求职者端、微信小程序企业招聘端、PC企业招聘端、PC管理平台端 构建高效人才交流平台 一、引言:招聘求职市场的数字化趋势 在数字化时代,招聘求职市场也迎来了巨大的变革。…

仅需一块 4GB 的 GPU ,就能运行开源大语言模型:Llama3 70B

最强的开源大语言模型 Llama3 已经发布一段时间了,一些盆友资源有限,私信询问是否可以使用 4GB 的 VRAM 在本地运行 Llama3 70B。 与 GPT-4 相比,Llama3 的性能如何?Llama3 使用了哪些关键的前沿技术使其变得如此强大&#xff1f…

GDB对Linux信号的处理方式

前言 在软件开发过程中,调试工具是程序员不可或缺的助手。GDB(GNU Debugger)作为一个强大的调试器,广泛应用于Linux系统中的C/C程序调试。然而,信号处理机制的复杂性常常给调试带来挑战。特别是在处理异步和同步信号时…

深入理解指针(5)

在之前的深入理解指针(4)中我们学习了回调函数相关知识,并且学会了如何使用库函数qsort,以及模拟实现了qsort,接下来在本篇中将对srtlen和sizeof进行细致的讲解,并对相关的题型进行讲解,一起加油吧!&#x…

开放式耳机哪个品牌音质好用又实惠耐用?五大公认卷王神器直入!

​在现今耳机市场,开放式耳机凭借其舒适的佩戴体验和独特的不入耳设计,备受消费者追捧。它们不仅让你在享受音乐时,仍能察觉周围的声音,确保与人交流无障碍,而且有利于耳朵的卫生与健康。对于运动爱好者和耳机发烧友而…

ASP+ACCESS酒店房间预约系统设计

摘要 随着国内经济形势持续发展,国内酒店业进入难得的发展高峰期,使得中外资本家纷纷将目光投向中低端市场。然而,中国酒店业的区域结构不合理、竞争手段不足和市场对经济型酒店的需求日益显露,以及2008年北京奥运会、2010年上海…

数据分析工程师——什么是数据分析?

数据分析工程师 对于目前就业市场上的技术岗位,除了开发、测试、运维等常见职位之外,数据类岗位也越来越成为热门的求职方向。本文将重点介绍 数据分析 这一新兴岗位。 看到「数据分析」这几个字,也许大家的第一印象一样,觉得要做的工作似乎并不难,有大量数据后根据业务…

状态转换图

根据本章开头讲的结构化分析的第3条准则,在需求分析过程中应该建立起软件系统的行为模型。状态转换图(简称为状态图)通过描绘系统的状态及引起系统状态转换的事件,来表示系统的行为。此外,状态图还指明了作为特定事件的结果系统将做哪些动作(例如,处理数据)。因此,状态图提供了…

JS闭包、原型链简单理解

目录 1.闭包概念 1.1简单demo1: 1.2简单demo2 1.3使用let代替var解决这个问题 2.函数对象和原型链 ​编辑 2.1函数对象demo 2.2.原型链demo 3.使用闭包完成JQuery的一个小demo 1.闭包概念 1.当函数声明时,函数会通过内部属性[scope]来创建范围 2.闭包一个…