当前位置: 首页 > news >正文

kafka-5 kafka的高吞吐量和高可用性

kafka的高吞吐量和高可用性

  • 6.1 高吞吐量
  • 6.2 高可用(HA)

6.1 高吞吐量

kafka的高吞吐量主要是由4方面保证的:

(1)顺序读写磁盘

Kafka是将消息持久化到本地磁盘中的,一般人会认为磁盘读写性能差,可能会对Kafka性能提出质疑。实际上不管是内存还是磁盘,快或慢的关键在于寻址方式,磁盘分为顺序读写与随机读写,内存一样也分为顺序读写与随机读写。基于磁盘的随机读写确实很慢,但基于磁盘的顺序读写性能却很高,一般而言要高出磁盘的随机读写三个数量级,一些情况下磁盘顺序读写性能甚至要高于内存随机读写。

(2)零拷贝

零拷贝是指Kafka利用 linux 操作系统的 “zero-copy” 机制在消费端做的优化。首先来看一下消费端在消费数据时,数据从broker磁盘通过网络传输到消费端的整个过程:
1)操作系统从磁盘读取数据到内核空间(kernel space)的page cache;
2)应用程序读取page cache的数据到用户空间(user space)的缓冲区;
3)应用程序将用户空间缓冲区的数据写回内核空间的socket缓冲区(socket buffer);
4)操作系统将数据从socket缓冲区复制到硬件(如网卡)缓冲区;

在这里插入图片描述
图6.1 数据从broker磁盘通过网络传输到消费端的整个过程

整个过程如图3.1所示,这个过程包含4次copy操作和2次系统上下文切换,而上下文切换是CPU密集型的工作,数据拷贝是I/O密集型的工作,性能其实非常低效。

零拷贝就是使用了一个名为sendfile()的系统调用方法,将数据从page cache直接发送到Socket缓冲区,避免了系统上下文的切换,消除了从内核空间到用户空间的来回复制。从上图可以看出,"零拷贝"并不是说整个过程完全不发生拷贝,而是站在内核的角度来说的,避免了内核空间到用户空间的来回拷贝。

(3)page cache

为了优化读写性能,Kafka利用了操作系统本身的Page Cache,就是利用操作系统自身的内存而不是JVM空间内存。这样做是因为, JVM中一切皆对象,对象的存储会带来额外的内存消耗; 使用JVM会受到GC的影响,随着数据的增多,垃圾回收也会变得复杂与缓慢,降低吞吐量;另外操作系统本身对page cache做了大量优化,通过操作系统的Page Cache,Kafka的读写操作基本上是基于系统内存的,读写性能也得到了极大的提升。

(4)分区分段

Kafka的message是按topic分类存储的,topic中的数据又是按照一个一个的partition即分区存储到不同broker节点。每个partition对应了操作系统上的一个文件夹,partition实际上又是按照segment分段存储的。这也非常符合分布式系统分区分桶的设计思想。

通过这种分区分段的设计,Kafka的message消息实际上是分布式存储在一个一个小的segment中的,每次文件操作也是直接操作的segment。为了进一步的查询优化,Kafka又默认为分段后的数据文件建立了索引文件,就是文件系统上的.index文件。这种分区分段+索引的设计,不仅提升了数据读取的效率,同时也提高了数据操作的并行度。

6.2 高可用(HA)

kafka的高可用主要是由3方面保证的:

(1)partition副本的分区分配策略

  • 生产者的分区分配策略
  • 消费者的分区分配策略

(2)kafka的消息传递备份策略

producer将消息发送给分区的leader,leader会将该消息写入其本地log,然后每个follower都会从leader pull数据,follower pull到该消息并将其写入log后,会向leader发送ack,当leader收到了ISR集合中所有follower的ack后,就认为这条消息已经commit了,leader将增加HW并且向producer返回ack。在整个流程中,follower也可以批量的从leader复制数据,以提升复制性能。

producer在发送消息的时候,可指定参数acks,表示"在生产者认为发送请求完成之前,有多少分区副本必须接收到数据",有三个可选值,0、1、all(或-1),默认为1。

  • acks=0,表示producer只管发,只要发出去就认为发送请求完成了,不管leader有没有收到,更不管follower有没有备份完成。(At Most Once)
  • acks=1,表示只要leader收到消息,并将其写入自己log后,就会返回给producer ack,不考虑follower有没有备份完成。
  • acks=all(或-1),表示不仅要leader收到消息写入本地log,还要等所有ISR集合中的follower都备份完成后,producer才认为发送成功。(At Least Once)
  • 幂等性,在Producer中设置enable.idempotence=true,在初始化的时候会被分配一个PID,发往同一个Partition的消息会附带Sequence Number,而Broker端会对<PID,Partition, SeqNumber>做缓存,对具有相同主键的消息,Broker只会持久化一条。(Exactly Once)

实际上,为了提高性能,follower在将消息保存到内存中而尚未写入磁盘时,就会向leader发送ack,所以也就不能完全保证异常发生后该条消息一定能被Consumer消费。

(3)kafka中的Leader选举

kafka中涉及到选举的地方有多处,最常提及的也有:cotroller选举 、分区leader选举、consumer group leader的选举。

  • controller的选举【broker的leader】

controller的选举是通过broker在zookeeper的"/controller"节点下创建临时节点来实现的,并在该节点中写入当前broker的信息 {“version”:1,”brokerid”:1,”timestamp”:”1512018424988”} ,利用zookeeper的强一致性特性,一个节点只能被一个客户端创建成功,创建成功的broker即为controller,即"先到先得"。
当controller宕机或者和zookeeper失去连接时,zookeeper检测不到心跳,zookeeper上的临时节点会被删除,而其它broker会监听临时节点的变化,当节点被删除时,其它broker会收到通知,重新发起controller选举。

  • leader的选举【分区副本的leader】

分区leader的选举由 controller 负责管理和实施,当leader发生故障时,controller会将leader的改变直接通过RPC的方式通知需要为此作出响应的broker,需要为此作出响应的broker即该分区的ISR集合中follower所在的broker,kafka在zookeeper中动态维护了一个ISR,只有ISR里的follower才有被选为Leader的可能。
具体过程是这样的:按照AR集合中副本的顺序查找到第一个存活的、并且属于ISR集合的副本作为新的leader。一个分区的AR集合在创建分区副本的时候就被指定,只要不发生重分配的情况,AR集合内部副本的顺序是保持不变的,而分区的ISR集合上面说过因为同步滞后等原因可能会改变,所以注意这里是根据AR的顺序而不是ISR的顺序找。

  • 消费组leader的选举

组协调器会为消费组(consumer group)内的所有消费者选举出一个leader,这个选举的算法也很简单,第一个加入consumer group的consumer即为leader,如果某一时刻leader消费者退出了消费组,那么会重新随机选举一个新的leader。

相关文章:

kafka-5 kafka的高吞吐量和高可用性

kafka的高吞吐量和高可用性 6.1 高吞吐量6.2 高可用&#xff08;HA&#xff09; 6.1 高吞吐量 kafka的高吞吐量主要是由4方面保证的&#xff1a; &#xff08;1&#xff09;顺序读写磁盘 Kafka是将消息持久化到本地磁盘中的&#xff0c;一般人会认为磁盘读写性能差&#xff…...

Jmeter前置处理器和后置处理器

1. 后置处理器(Post Processor) 本质上是⼀种对sampler发出请求后接受到的响应数据进⾏处理 &#xff08;后处理&#xff09;的⽅法 正则表达式后置处理器 &#xff08;1&#xff09;引⽤名称&#xff1a;下⼀个请求要引⽤的参数名称&#xff0c;如填写title&#xff0c;则可…...

手把手带你了解《线程池》

文章目录 线程池的概念池的目的线程池的优势为什么从池子里拿线程更高效&#xff1f;构造方法参数讲解线程拒绝策略模拟实现线程池一个线程池设置多少线程合适&#xff1f; 线程池的概念 线程池&#xff1a;提前把线程准备好&#xff0c;创建线程不是直接从系统申请&#xff0…...

idea中使用git工具

目录 一、IDEA中配置git二、git操作将项目设置成git仓库 一、IDEA中配置git 打开idea&#xff0c;点击File–>Settings 点击版本控制&#xff0c;然后点击git 将你的git.exe安装目录填到下面位置 点击test可以看到显示了版本&#xff0c;说明配置成功 二、git操作 将项目设…...

剖析DLL(动态链接库)的使用方法

为了更好地理解和应用dll&#xff0c;我们首先需要了解dll的概念和原理。 一、dll&#xff08;Dynamic Link Library&#xff09;的概念 dll是一种动态链接库&#xff0c;它是在Windows操作系统中广泛使用的一种机制&#xff0c;它允许程序在运行时调用动态链接库中的函数。d…...

第二章 设计模式七大原则

文章目录 前言一、单一职责 &#x1f367;1、单一职责原则注意事项和细节2、代码实现2、1 错误示例2、2 正确示例但有缺陷2、3 最终形态 二、接口隔离原则 &#x1f969;1、代码示例 三、依赖倒转原则 &#x1f965;1、代码示例2、依赖关系传递的三种方式 四、里氏替换原则 &am…...

计网第五章.运输层—TCP报文的首部

以下来自湖科大计算机网络公开课笔记及个人所搜集资料 TCP报文格式如下&#xff1a; 那6个标志位对应的中文名&#xff1a; 下面是按TCP首部的顺序介绍各个字段&#xff1a; 源端口和目的端口分别是表示发送TCP报文段的应用进程。从网络编程角度&#xff0c;进程里创建sock…...

程序员最新赚钱指南!

程序员们的主要收入来源 1️⃣首先&#xff0c;我们要明白程序员无论编程开发多么努力&#xff0c;随着时间推移&#xff0c;受年龄、生活、健康等因素&#xff0c;程序员们都会面临职业天花板&#xff0c;这是大多数人不可规避的一个事实。 2️⃣其次&#xff0c;这几年因为…...

如何快速获取淘宝商品的详细信息?看这里就够了

taobao.item_get 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,item_search_shop等]cacheString否[yes,…...

id生成器

使用说明 ⚠️ 所有使用id的业务场景&#xff0c;应该在数据库层设置合理的唯一索引 功能 自增id 基于 redis 自增 redis 中的key为&#xff1a;[spring.application.name].idGenetate.[key] ⚠️ key 在不同的业务不应该重复使用&#xff0c;否则单号无法连续使用 private f…...

为什么许多人吐槽C++11,那些语法值得我们学习呢?

致前行的人&#xff1a; 人生像攀登一座山&#xff0c;而找寻出路&#xff0c;却是一种学习的过程&#xff0c;我们应当在这过程中&#xff0c;学习稳定冷静&#xff0c;学习如何从慌乱中找到生机。 目录 1.C11简介 2.统一的列表初始化 2.1 &#xff5b;&#xff5d;初始化 …...

千耘农机导航的“星地一体”能力究竟是什么?

伴随农业机械化和智能化的发展&#xff0c;越来越多的人开始使用农机自动驾驶系统助力耕作&#xff0c;千耘农机导航的“星地一体”能力可有效解决信号受限的问题&#xff0c;实现作业提效。究竟什么是“星地一体”&#xff0c;又是如何解决智能化农机作业的痛点的&#xff1f;…...

(数字图像处理MATLAB+Python)第四章图像正交变换-第四、五节:Radon变换和小波变换

文章目录 一&#xff1a;Radon变换&#xff08;1&#xff09;Radon变换原理&#xff08;2&#xff09;Radon变换实现&#xff08;3&#xff09;Radon变换性质&#xff08;4&#xff09;Radon变换应用 二&#xff1a;小波变换&#xff08;1&#xff09;小波A&#xff1a;定义B&a…...

舌体胖瘦的自动分析-曲线拟合-或许是最简单判断舌形的方案(六)

返回至系列文章导航博客 1 简介 在中医智能舌诊项目中需要舌体胖瘦的自动分析 舌体胖瘦是中医诊断中重要的观察依据&#xff0c;。胖大舌“舌色淡白&#xff0c;舌体胖嫩&#xff0c;比正常舌大而厚&#xff0c;甚至充满口腔”&#xff0c;主脾肾阳虚&#xff0c;气化失常&am…...

牛顿法、梯度下降法与拟牛顿法

牛顿法、梯度下降法与拟牛顿法 0 引言1 关于泰勒展开式1.1 原理1.2 例子 2 牛顿法2.1 x 为一维2.2 x 为多维 3 梯度下降法4 拟牛顿法4.1 拟牛顿条件4.2 DFP 算法4.3 BFGS 算法4.4 L-BFGS 算法 0 引言 机器学习中在求解非线性优化问题时&#xff0c;常用的是梯度下降法和拟牛顿…...

带你浅谈下Quartz的简单使用

Scheduler 每次执行&#xff0c;都会根据JobDetail创建一个新的Job实例&#xff0c;这样就可以规避并发访问的问题&#xff08;jobDetail的实例也是新的&#xff09; Quzrtz 定时任务默认都是并发执行&#xff0c;不会等待上一次任务执行完毕&#xff0c;只要间隔时间到就会执…...

C++ cout格式化输出

称为“流操纵算子”&#xff09;&#xff0c;使用更加方便。 C cout成员方法格式化输出 《C输入流和输出流》一节中&#xff0c;已经针对 cout 讲解了一些常用成员方法的用法。除此之外&#xff0c;ostream 类中还包含一些可实现格式化输出的成员方法&#xff0c;这些成员方法…...

查询练习:复制表的数据作为条件查询

查询某课程成绩比该课程平均成绩低的 score 表。 -- 查询平均分 SELECT c_no, AVG(degree) FROM score GROUP BY c_no; -------------------- | c_no | AVG(degree) | -------------------- | 3-105 | 87.6667 | | 3-245 | 76.3333 | | 6-166 | 81.6667 | ------…...

Thymeleaf select回显并选中多个

语法&#xff1a; selected"selected" 或 selectedtrue ${#strings.indexOf(name,frag)} 或者 ${#lists.contains(list, element)} 或者 ${#strings.contains(name,ez)} 或者 ${#strings.containsIgnoreCase(name,ez)} 都可以实现。 多选示例 &#xff1a; &…...

【Go 基础】变量

1. 变量 Go 语言是静态类型语言&#xff0c;由于编译时&#xff0c;编译器会检查变量的类型&#xff0c;所以要求所有的变量都要有明确的类型 。 变量在使用前&#xff0c;需要先声明。声明类型&#xff0c;就约定了你这个变量只能赋该类型的值。 1.1 变量声明 格式&#x…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...