Kafka---总结篇

news2025/1/11 6:30:29

kafka架构

主要概念

broker: 存储消息的机器

控制器controller

(1)使用zookeeper, 除了提供一般的broker功能之外,还负责选举分区首领。通过在zookeepr中创建一个名为 /controller的临时节点称为 controller。每个选出的controller都会有一个递增的epoch。

(2)使用 KRaft,通过Kraft来选举,所有的元数据都存储在 metadata.log.dir 目录下。通过pull从controller获取信息

主题

消息通过主题分类。类似数据库的表或文件系统的文件夹

分区

一个主题可以被分为若干个分区。消息无法在主题内保证有序,但可以在单个分区内有序。

副本

为了保证可靠性,一个分区可以有多个副本。其中分为leader副本和follower副本。所有副本统称为AR(assigned replicas),所有与leader副本保持一定程度同步的副本(包括leader)组成ISR(in-sync replicas)。follower滞后leader指定的时间时,则会退出 ISR。(不可读,只当做备份作用);就是从leader副本拉取消息,如果持续拉取速度慢于leader副本写入速度,慢于时间超过replica.lag.time.max.ms后,它就变成“非同步”副本,

HW

标识一个特定的消息偏移量,消费者只能拉取到这个offset之前的消息。比如HW=6, 只能拉取到 0~5的消息

LEO(Log End Offset)

标识当前日志文件中下一条待写入的消息的offset

Lag Kafka Lag

很多时候也会被称之为消息堆积量。 当事务是read-committed, Lag=LSO – ConsumerOffset, 否则等于 Lag=HW-ConsumerOffset

LSO

LSO 的值等于事务中第一条消息的位置(firstUnstableOffset,如上图所示),对已完成的事务而言,它的值同 HW 相同

消费组

Broker的controller协调者选举

(1) zookeeper模式,通过创建一个 /controller的临时节点来选举。

(2) KRaft模式,通过raft算法来选举。follower通过pull的方式拉取leader的日志。

副本的leader选举

首先选出broker的controller节点,然后节点会从分区的 ISR中选举第一个follower副本为leader副本。

事务

事务处理流程如下:

Transaction Coordinator的选举

根据transactionId的哈希值计算主题 _transaction_state中的分区编号,再找到此分区leader副本所在的broker节点。

事务隔离级别

(1)read_uncommitted。默认的事务级别。

(2)read_committed。

应用场景

“消--处理—生产”的模式。即从源主题读取消息,然后对消息进行一些处理,再将结果写入到另一个主题。

幂等性

启动了幂等生产者,每条消息都将包含生产者ID(PID)和序列号。在leader副本的broker会保存map<pid,分区>维护一个序列号。

幂等生产者只能防止由生产者内部重试逻辑引起的消息重复。

  • 每个生产者会被分配一个ProducerId(PID),SeqNumber

  • 然后生产者端和Broker端都有<PID,PartitionID> SeqNumber 的映射关系

  • 生产者每发送一条消息后就将对应的分区序列号加一

  • broker端会比较序列号,如果new Sq < old Sq+1,抛弃这条数据。说明它已经是过期的了如果new Sq > old sq +1,说明有消息丢失了。对生产者抛出异常

怎么保证PID相同的生产者干扰数据

在分配PID时,会分配epoch,新的生产者就会加1,如果出现了两个同样的生产者PID一样,取epoch最大的那个。

Producer过程

写入分区策略:

  • 轮询策略(默认分区策略)

  • 随机策略

  • 按键保存策略。

其中轮询策略是默认的分区策略,而随机策略则是较老版本的分区策略,不过由于其分配的均衡性不如轮询策略,故而后来改成了轮询策略为默认策略。

确定好消息的topic+partition后,直接发送给对应leader副本所在的broker。消息的可靠性主要通过acks参数来配置,主要有以下三种:

(1)acks=0, 生产者发送消息后不需要等待任务服务端的响应。吞吐性能最好,可靠性最差。

(2)acks=1, 只要分区的leader副本成功写入消息即可。消息的可靠性和吞吐量折中

(3)acks=-1或all,生产者在发送消息后,需要等待ISR中的所有副本都成功写入消息之后才能收到来自服务端的成功响应。但因为可能ISR中只有leader副本,也会导致消息不可靠。更高可靠性需要配置 min.insync.replicas,指定写入的最小ISR的数量,如果没有达到则会发送失败。

Comsumer过程

groupCoordinator和comsumerCoordinator之间的逻辑如下:

(1)每一个broker都有coordinator(辅助实现消费组的初始化和分区的分配),根据groupId进行哈希取模得到选举那个coordinator对消费组进行管理

(2)消费者向负载最小的节点请求获取到groupCoordinator, 然后连接到groupCoordinator节点并发送JoinGroup请求。

(3)groupCoordinator为消费组选举一个消费组的leader。如果没有消费组leader,则加入group的第一个消费者为leader。如果消费组leader挂了之后,会比较随意的选举一个。

(4)消费者leader从选举出的分区分配策略来实施具体的分区分配(逻辑下面会介绍)

(5)groupCoordinator发送SyncGroupRequest请求来同步分配方案给各个消费者。

(6)每个消费者都会和groupCoordinator保持心跳(默认3s),一旦超时(session.timeout.ms=45s),该消费者会被移除,并触发再平衡;或者消费者处理消息的时间过长(max.poll.interval.ms=5分钟),也会触发平衡

总结了一下:

(1)find_coordinator

(2)join_group

(3)sync_group

(4)hearbeat

分区策略:

1.RangeAssignor分配策略

    按照消费者总数和分区总数进行整除运算来获得一个跨度,然后将分区按照跨度进行平均分配,以保证分区尽可能均匀地分配给所有的消费者。

2.RoundRobinAssignor分配策略(默认的分区策略)

    将消费组内所有消费者及消费者订阅的所有主题的分区按照字典序排序,然后通过轮询方式逐个将分区依次分配给每个消费者。

3.StickyAssignor分配策略

    目的:(1)分区的分配尽可能均匀(2)分区的分配尽可能与上次分配的保持相同

4.自定义分区策略

选举分区分配策略:

(1)收集各个消费者支持的所有分配策略,组成候选集candidates

(2)每个消费者从candidates中找出第一个自身支持的策略,为这个策略投一票

(3)计算candidates中各个策略的选票数,选票数最多的策略即为当前消费者的分配策略

触发消费再均衡情况:

(1)有新的消费者加入消费组

(2)有消费者宕机下线。

(3)有消费者主动退出消费组

(4)消费组所对应的groupCoordinator节点发生了变更

(5)消费组内所订阅的任意主题或者主题的分区数量发生了变化

提交方式

(1)自动提交

(2)提交当前偏移量

(3)异步提交。api只管提交偏移量,无须等待broker做出响应。

(4)提交特定偏移量

底层存储数据

流式处理

kafka中使用的优化技巧

1.copy-zero(零拷贝)

linux操作系统 “零拷贝” 机制使用了sendfile方法, 允许操作系统将数据从Page Cache 直接发送到网络,只需要最后一步的copy操作将数据复制到 NIC 缓冲区, 这样避免重新复制数据 。示意图如下:

2. 页缓存技术 pagecache, 使用mmap来映射文件到程序内存中。

为了优化读写性能,Kafka利用了操作系统本身的Page Cache,就是利用操作系统自身的内存而不是JVM空间内存

3.顺序写

4.分区分段+索引

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

5.批量读写

Kafka数据读写也是批量的而不是单条的。

6.批量压缩

如果每个消息都压缩,但是压缩率相对很低,所以Kafka使用了批量压缩,即将多个消息一起压缩而不是单个消息压缩

性能压测:

数据不撒谎,Flink-Kafka性能压测全记录!

大概读写的QPS:

20W 

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

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

相关文章

Flink DataSource介绍

介绍 Flink的Data Source&#xff08;数据源、源算子&#xff09;是Flink作业的起点&#xff0c;它定义了数据输入的来源。Flink可以从各种数据来源获取数据&#xff0c;例如文件系统、消息队列、数据库等。以下是对Flink Data Source的详细介绍&#xff1a; 概述&#xff1a…

我独自升级崛起怎么玩 我独自升级崛起游玩教程分享

《我独自升级&#xff1a;ARISE》是一款预计在 Android、iOS 和 PC 平台推出的动作 RPG&#xff0c;故事内容基于网络漫画版本改编&#xff0c;讲述世界各地出现「次元传送门」&#xff0c;而少部分人类觉醒了可以对抗传送门中怪物的「猎人」能力&#xff0c;玩家可以在故事模式…

【大模型认识】警惕AI幻觉,利用插件+微调来增强GPT模型

文章目录 一. 大模型的局限1. 大模型不会计算2. 甚至明目张胆的欺骗 二. 使用插件和微调来增强GPT模型1. 模型的局限性2. 插件来增强大模型的能力3. 微调技术-提高特定任务的准确性 一. 大模型的局限 1. 大模型不会计算 LLM根据给定的输入提示词逐个预测下一个词&#xff08;…

【STM32G474】利用Cpp编写STM32代码后,Cubemx修改配置后代码报错147个error,如何处理?

问题描述 打开Cubemx&#xff0c;添加TIM7用于定时器精准延时&#xff0c;生成代码后&#xff0c;Keil提示有147个error。 之前是Cubemx是没有问题的&#xff0c;是利用Cpp编写stm32&#xff08;将Keil改为Version6&#xff09;后才导致Cubemx配置失败&#xff1a; debug成功…

Jmeter用jdbc实现对数据库的操作

我们在用Jmeter进行数据库的操作时需要用到配置组件“JDBC Connection Configuration”&#xff0c;通过配置相应的驱动能够让我们通过Jmeter实现对数据库的增删改查&#xff0c;这里我用的mysql数据库一起来看下是怎么实现的吧。 1.驱动包安装 在安装驱动之前我们要先查看当前…

【面试干货】http请求报文的组成与作用?

【面试干货】http请求报文的组成与作用&#xff1f; 一、http 的请求报文组成二、请求行&#xff08;Request Line&#xff09;三、请求头部&#xff08;Request Headers&#xff09;四、请求体&#xff08;Request Body&#xff09;五、响应头部 &#xff08;Response Headers…

Java | Leetcode Java题解之第59题螺旋矩阵II

题目&#xff1a; 题解&#xff1a; class Solution {public int[][] generateMatrix(int n) {int num 1;int[][] matrix new int[n][n];int left 0, right n - 1, top 0, bottom n - 1;while (left < right && top < bottom) {for (int column left; co…

【Java】IO流:字节流 字符流 缓冲流

接续上文&#xff0c;在这篇文章将继续介绍在Java中关于文件操作的一些内容【Java】文件操作 文章目录 一、“流”的概念1.“流”的分类1.1输入流和输出流1.2字节流和字符流 字节和字符的区别&#xff1f;为什么要有字符流&#xff1f;1.3节点流和处理流 字符流自带缓冲区&…

基士得耶(GESTETNER ) CP 6303C 速印机简介

规格参数 产品名称: 基士得耶&#xff08;GESTETNER &#xff09; CP 6303C 速印机 品牌中文: 基士得耶/GESTETNER 型 号: CP-6303C 工作方式&#xff1a; 数码式 制版方式: 自动印刷 制版时间&#xff1a; 曝光玻璃: 31秒(A4长边…

使用SpringBoot+Redis做一个排行榜【推荐】

SpringBoot Redis实现排行榜 一、Zset有序集合介绍 Zset是一个没有重复元素的字符串集合。不同之处是有序集合的每个成员都关联了一个评分( score) ,这个评分( score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的&#xff0c;但是评分可以是重复了…

MATLAB 基于规则格网的点云抽稀方法(自定义实现)(65)

MATLAB 基于规则格网的点云抽稀方法(自定义实现)(65) 一、算法介绍二、算法实现1.代码2.结果一、算法介绍 海量点云的处理,需要提前进行抽稀预处理,相比MATLAB预先给出的抽稀方法,这里提供一种基于规则格网的自定义抽稀方法,步骤清晰,便于理解抽稀内涵, 主要涉及到使…

【深度学习】网络安全,SQL注入识别,SQL注入检测,基于深度学习的sql注入语句识别,数据集,代码

文章目录 一、 什么是sql注入二、 sql注入的例子三、 深度学习模型3.1. SQL注入识别任务3.2. 使用全连接神经网络来做分类3.3. 使用bert来做sql语句分类 四、 深度学习模型的算法推理和部署五、代码获取 一、 什么是sql注入 SQL注入是一种常见的网络安全漏洞&#xff0c;它允许…

CSS-盒子模型元素溢出

作用&#xff1a;控制溢出的元素的内容的显示方式 属性&#xff1a;overflow 属性值 属性值效果hidden溢出隐藏scroll溢出滚动&#xff08;无论是否溢出&#xff0c;都显示滚动条位置&#xff09;auto溢出滚动&#xff08;溢出才显示滚动条位置&#xff09; <!DOCTYPE html&…

字体设计_西文字体设计(英文字体设计)

一 西文字体设计基础知识 设计目标和历史成因 设计目标&#xff1a;让眼睛看着舒服的字体 那什么样的字体让眼睛看着舒服呢&#xff1f; 让眼睛看着舒服的字体造型其实是我们记忆里的手写体、自然造型。 所以就能理解西文字体为什么同一笔画&#xff0c;有的地方粗有的地方…

国科大深度学习期末历年试卷

本文借鉴 国科大深度学习复习 深度学习期末 深度学习2020 一&#xff0e;名词解释&#xff08;每个2分&#xff0c;共10分&#xff09; 深度学习&#xff0c;稀疏自编码器&#xff0c;正则化&#xff0c;集成学习&#xff0c;Dropout 二&#xff0e;简答题&#xff08;每题…

【汇总】虚拟机网络不通(Xshell无法连接虚拟机)排查方法

搜索关键字关键字关键字&#xff1a;虚拟机虚拟机虚拟机连接失败、虚拟机无法连接、Xshell连接失败、ping baidu.com失败、静态IP设置 Kali、CentOS、远程连接 描述&#xff1a;物理机无法连接虚拟机&#xff1b;虚拟机无法访问百度&#xff0c;虚拟机无法访问baidu.com 虚拟机…

五月加仓比特币

作者&#xff1a;Arthur Hayes Co-Founder of 100x. 编译&#xff1a;Liam 编者注&#xff1a;本文略有删减 (以下内容仅代表作者个人观点&#xff0c;不应作为投资决策的依据&#xff0c;也不应被视为参与投资交易的建议或意见&#xff09;。 从四月中旬到现在&#xff0c;当你…

5月8日学习记录

_[FBCTF2019]RCEService&#xff08;preg_match函数的绕过&#xff09; 涉及知识点&#xff1a;preg_match函数绕过&#xff0c;json的格式&#xff0c;正则回溯 打开环境&#xff0c;要求用json的格式输入 搜索学习一下json的语法规则 数组&#xff08;Array&#xff09;用方括…

抓取Google时被屏蔽怎么办?如何避免?

在当今数字化时代&#xff0c;数据采集和网络爬取已成为许多企业和个人必不可少的业务活动。对于爬取搜索引擎数据&#xff0c;特别是Google&#xff0c;使用代理IP是常见的手段。然而&#xff0c;使用代理抓取Google并不是一件轻松的事情&#xff0c;有许多常见的误区可能会导…

VisualGLM-6B微调(V100)

Visualglm-6b-CSDN博客文章浏览阅读1.3k次。【官方教程】XrayGLM微调实践&#xff0c;&#xff08;加强后的GPT-3.5&#xff09;能力媲美4.0&#xff0c;无次数限制。_visualglm-6bhttps://blog.csdn.net/u012193416/article/details/131074962?ops_request_misc%257B%2522req…