浅谈Kafka(二)

浅谈Kafka(二)

文章目录

    • 浅谈Kafka(二)
      • Kafka架构图
      • Kafka生产者幂等性与事务
      • 生产者分区写入策略
      • 乱序问题
      • 消费者组的Reblance机制
      • 消费者分区分配策略
      • 副本机制
      • 分区的leader与follower
      • AR/ISR/OSR
      • controller介绍与选举
      • Leader负载均衡
      • Kafka读写流程
      • 消费者读数据流程
      • 消息不丢失机制
      • 数据积压
      • Kafka中数据清理

Kafka架构图

image-20240823080347723

  1. 生产消费模型涉及到生产者、消费者和消息队列。Kafka消息度列有点对点模式和发布订阅模式。
  • 点对点模式,生产者生产消息发送到消息队列中,然后消费者组从消息队列中取出并消费消息。消息被消费后,消息队列中不再有存储,所以消费者不可能消费到已经被消费的消息。特点是每个消息只有一个消费者,一旦被消费,消息就不再存储在消息队列中;生产者和消费者之间没有依赖性,生产者发送消息后,不管消费者在运行,都不会影响生产者再次发送消息;消费者成功收到消息后需要向消息队列应答成功,以便消息队列删除当前接收到的消息。
  • 发布订阅模式,每个消息可以有多个订阅者;发布者和订阅者之间有时间上的限制。对于某个主题的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息。为了消费消息,订阅者需要提前订阅该主题,并保持在线运行。
  1. Kafka可以构建实时数据管道,以可靠地在系统或应用程序之间获取数据;还可以用来构建实时流应用程序,以转换或响应数据流。

  2. 一个Kafka集群是由多个broker组成,这样可以实现负载均衡以及容错;broker是无状态的,它们之间通过zookeeper来维护集群状态;一个broker每秒可以处理数十万次读写,每个broker都可以处理TB消息而不影响性能。

  3. zookeeper可以管理和协调broker并且存储了Kafka的元数据,主要用于通知生产者和消费者Kafka集群有新的broker加入或者有broker出现了故障。

  4. 生产者producer负责把数据推送到broker的topic,消费者consumer负责从broker的topic中拉取消息并自行处理,Kafka集群中主题被分为多个分区partition。副本replication可以确保某个服务故障时数据依然可用,一般副本数大于1。消费者组是可扩展且具有容错的消费者机制,可以包含多个消费者,具有唯一的ID,组内的消费者一起消费主题的所有分区。

  5. 主题是一个逻辑概念,用于生产者发布消息,消费者拉取消息。Kafka中的主题必须要有标识符,并且是唯一的,可以有任意数量的主题。在主题中的消息是有结构的,一般一个主题包含某一类消息。一旦生产者发送消息到主题中,这些消息就不能更改。

  6. 偏移量offset记录着下一条要发送给消费者的消息的序号,默认Kafka把offset存储在zookeeper中。一个分区中消息的存储是有顺序的,每个分区的消息都是有一个递增的id就是offset。偏移量在分区里才是有意义的。

Kafka生产者幂等性与事务

  1. 幂等性比如http的一次或多次请求得到的响应是一样的。在生产者生产消息时,如果出现重试时,可能一条消息被发送了多次,如果不具备幂等性,就有可能在分区中保存多条一模一样的消息。配置幂等性,设置enable.idempotence选项为true。

  2. 幂等性原理,通过引入Producer ID(PID)和Sequence Number。每个生产者在初始化时,都会分配一个唯一的PID,这个PID对用户来说是透明的。针对每个生产者发送到指定主题分区的消息都对应一个从0开始递增的序列号。

  3. 生产者消息重复问题,在Kafka中可以开启幂等性,当生产者生产消息时,会增加一个PID和序列号。发送消息时,会连着PID和序列号一起发出。Kafka收到消息后,会把消息、PID和序列号一起保存下来。如果ACK响应失败,生产者重试,再次发送消息时,Kafka会根据PID和序列号确定是否需要再保存一条消息,判断条件是生产者发送过来的序列号是否小于等于分区中消息对应的序列号。

生产者分区写入策略

  1. 轮询策略是默认的策略,也是使用最多的策略,可以最大限度保证所有消息平均分配到某一个分区。如果在生产消息时键为空,则使用轮询算法均衡地分配分区。
  2. 随机分区每次都随机将消息分配到每个分区,基本不用。
  3. 按key分区有可能出现数据倾斜,key的哈希值对分区数量取余。
  4. 自定义分区实现Partitioner接口,创建自定义分区器,生产者配置自定义的分区器。

乱序问题

  1. 轮询和随机策略都会导致一个问题,生产到Kafka中的数据是乱序存储的,而按key分区可以一定程度上实现数据的有序存储,也就是局部有序,但是可能会导致数据倾斜,在实际生产环境中要结合实际情况做取舍。
  2. 生产者是由写入策略,如果主题有多个分区,就会把数据分散在不同的分区中存储。
  3. 当分区数量大于1时,消息会打散分不到不同的分区中。如果只有一个分区,消息是有序的。

消费者组的Reblance机制

  1. Kafka再平衡是确保消费者下所有消费者如何达成一致分配订阅的主题的每个分区的机制。
  2. 再平衡的触发时机包括消费者组中消费者的个数发生变化,订阅的主题个数发生变化,订阅的主题分区数发生变化。
  3. 发生再平衡时,消费者组下所有的消费者都会协调在一起共同参与,Kafka使用分配策略尽可能达到最公平的分配。再平衡过程会对消费者组产生非常严重的影响,所有的消费者都将停止工作,直到再平衡完成。

消费者分区分配策略

  1. Range范围分配策略是默认分配策略,可以确保每个消费者消费的分区数量是均衡的。范围分配策略是针对每个topic的。配置消费者的partition.assignment.strategy为RangeAssignor。
算法公式:n = 分区数量/消费者数量;
m = 分区数量 % 消费者数量;
前m个消费者消费n+1个,剩余消费者消费n个。
  1. RoundRobin轮询分配策略按照字典序排序,然后通过轮询方式逐个把分区依次分配给每个消费者。配置分配策略为RoundRobinAssignor。

  2. Sticky粘性分配策略分区分配尽可能均匀,发生再平衡时,分区的分配尽可能与上一次分配保持相同。没有发生再平衡时,粘性分配策略和轮询策略类似。

副本机制

  1. 副本的目的就是冗余备份。当某个broker上的分区数据丢失时,依然可以保证数据可用。因为在其他的broker上的副本是可用的。
  2. 对副本关系较大的就是producer配置的acks参数了,acks参数表示当生产者生产消息的时候,写入到副本的要求严格程度。它决定了如何在性能和可靠性之间做取舍。
  3. acks配置为0:不等待broker确认,直接发送下一条数据。性能最高,但可能会存在数据丢失的情况。
    acks配置为1:等待leader副本确认接收后,才会发送下一条数据,性能中等。
    acks配置为-1或all:等待所有副本已经将数据同步后,才会发送下一条数据,性能最差。

分区的leader与follower

  1. Kafka中leader负责处理读写操作,而follower只负责副本数据的同步。
  2. 如果leader出现故障,其他follower会被重新选举为leader。
  3. follower向一个消费者一样,拉取leader对应分区的数据并保存到日志中。

AR/ISR/OSR

  1. 分区的所有副本称为AR已分配的分区。
  2. 所有与leader副本保持一定程度同步的副本组成ISR(In Sync Replica在同步中的副本)。
  3. 由于follower副本同步之后过多的副本(不包括leader副本)组成OSR。
  4. 正常情况下,所有的follower副本都应该与leader副本保持同步。

controller介绍与选举

  1. 在Kafka启动时会在所有的broker中选择一个controller,leader与follower是针对partition,而controller是针对broker的。创建主题、添加分区、修改副本数量之类的管理任务都是由controller来完成的。Kafka分区leader的选举也是由controller决定的。
  2. controller选举流程,在集群启动时每个broker都会尝试去zookeeper上注册成为controller(临时节点)。组只有一个竞争成功,其他的broker会注册该节点的监视器。一旦该节点状态发生改变,就可以进行相应的处理。controller也是高可用的,一旦某个broker崩溃,其他broker会重新注册成controller。
  3. controller是高可用的,通过zookeeper进行选举;Leader是通过ISR进行快速选举。

Leader负载均衡

  1. Kafka中引入了优先副本的概念,在ISR列表中第一个副本就是优先副本。第一个分区存放的broker,肯定就是优先副本。通过脚本实现均匀分配每个分区的leader。
./kafka-leader-election.sh --bootstrap.server localhsot:9092 --topic name --partition=1 --election-type prefered

Kafka读写流程

  1. 写过程:通过zookeeper找分区对应的Leader,由Leader负责写数据。Producer开始生产数据,ISR里面的Follower开始同步数据,并返回给Leader ACK。Leader接收到所有的ISR中的副本的ACK后返回给Producer ACK。

  2. 读流程:通过zookeeper找分区对应Leader进行读操作,找到分区对应的偏移量,然后从偏移量往后顺序拉取数据,提交偏移量。

消费者读数据流程

  1. 消费者的offset是一个分区的全局offset,存储在zookeeper中,可以通过offset找到对应的segment,然后把全局的offset转换成segment的局部offset。根据局部offset,可以从稀疏索引中找到对应的数据位置,开始顺序读取。

消息不丢失机制

  1. broker数据不丢失
  • 生产者通过分区的leader写入数据后,所有在ISR中的follower都会从leader中复制数据,这样可以确保即使leader崩溃了,其他的follower的数据依然是可用的。
  1. 生产者数据不丢失
  • 生产者连接leader写入数据时,通过ACK机制来确保数据写入成功。ACK机制有三个可选配置:

    acks为-1,表示所有的节点都接收到数据(leader和follower都接收到数据);
    acks为1,表示leader收到数据;
    acks为0,生产者只负责发送数据,不关心数据是否丢失。

  • 生产者可以采用同步和异步方式发送数据。同步是发送数据后,等待返回结果。异步是发送数据后,只提供一个回调函数。

  • 如果broker迟迟不给ack,而buffer又满了,可以设置是否清空buffer中的数据。

  1. 消费者数据不丢失
  • 在消费者消费数据时,只要每个消费者记录好offset值即可,就能保证数据不丢失。
  • 可以使用MySQL事务,将写入的MySQL数据和offset放在一个MySQL事务里,要么全部成功,要么全部失败,就可以实现Exactly-Once。

数据积压

  1. Kafka消费者消费数据的速度是非常快的,但如果处理Kafka消息时,由于有一些外部IO、或者是产生网络拥堵,就会造成Kafka中的数据积压。如果数据一直积压,会较大地影响数据的实时性。
  2. 首先找到数据积压的原因。常见的场景包括数据写入MySQL失败,网络延迟消费失败。

Kafka中数据清理

  1. Kafka提供两种日志清理方式
  • 日志删除(Log Deletion)按照指定的策略直接删除不符合条件的日志。
  • 日志压缩(Log Compaction)按照消息的key进行整合,有相同key的但有不同value值,只保留最后一个版本。
  1. 在Kafka的broker或topic配置
配置项配置值说明
log.cleaner.enabletrue(默认)开启自动清理日志功能
log.cleanup.policydelete(默认)删除日志
log.cleanup.policycompaction压缩日志
log.cleanup.policydelete.compact同时支持删除、压缩
  1. 日志删除是以段为单位进行定期清理的。Kafka日志管理器有一个专门的日志删除任务定期检测和删除不符合保留条件的日志分段文件,这个周期可以通过broker的参数log.retention.check.interval.ms来配置,默认5分钟。日志分段的保留策略有基于时间的保留策略、基于日志大小的保留策略和基于日志起始偏移量的保留策略。

  2. 基于时间的保留策略有log.retention.ms、log.retention.minutes、log.retentions.hours三种配置,优先级由高到低,默认168小时即7天。删除日志分段时,从日志文件对象中所维护日志分段的跳跃表中移除待删除日志分段,以保证没有线程对这些日志分段进行读取操作;将日志分段文件添加上.deleted的后缀;Kafka后台定时任务会定期删除这些.deleted后缀的文件,这个任务的延迟执行时间可以通过file.delete.delay.ms参数来设置,默认1分钟。

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

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

相关文章

CSDN AI-WEB-1.0 攻略

找到一个目标靶场的IP , 这里以172.16.1.98 为例 1、使用命令 /robots.txt 来确定目录 2、分别测试两个文件 均无法访问,可返回其根目录查询 3、到根目录,出现搜索框 4、输入ID为1 5、使用虚拟机kali的终端 搜索命令 dirsearch -u http:…

【Dash】feffery_antd_components 简单入门示例

一、简单了解 feffery_antd_components 简称 fac ,是一个基于 Ant Design 的 Dash 第三方组件,由Feffery 老师开源维护的 Python 网页开发组件库,它具有丰富的页面常用交互组件功能,使开发者可以使用纯Python的方式快速构建现代…

asp.net Core blazor学习笔记

最近在研究学习blazor,为了加深记忆,手动记录一下,以下内容为个人理解记录,仅供参考: Blazor开发学习 一 分类1 Blazor Server 应用2 Blazor WebAssembly 应用3 Blazor Hybrid 应用和 .NET MAUI 二 基础知识1 路由2 组…

算法的学习笔记—二叉树中和为某一值的路径

😀前言 在二叉树中寻找和为某一特定值的路径问题是一个经典的面试题,考察了对二叉树的遍历能力以及递归和回溯算法的理解和应用。本文将详细解析这一问题,并提供一个Java实现。 🏠个人主页:尘觉主页 文章目录 &#x1…

使用Node-RED实现和部署物联网入侵检测的机器学习管道

整理自 《Implementing and Deploying an ML Pipeline for IoT Intrusion Detection with Node-RED》,由 Yimin Zhang 等人撰写,发表于 2023 年 CPS-IoT Week Workshops。以下是根据提供的 PDF 内容整理的论文的详细主要内容: 摘要 (Abstra…

0基础深度学习项目13:基于TensorFolw实现天气识别

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 目录 一、创建环境二、前期准备2.1 设置GPU2.2 导入数据2.3 数据预处理2.3.1 加载数据2.3.2 查看图像的标签 2.4 数据可视化 三、构建简单的CNN网络&#xff0…

KT来袭,打造沉浸式体验的聚合性web3应用平台

随着步入 2024,漫长的区块链熊市即将接近尾声。纵观产业发展,逆流而上往往会是彰显品牌市场影响力和技术实力的最佳证明。在这次周期中,一个名为KT的web3.0聚合平台吸引了市场关注,无论在市场层面还是技术层面,都广泛赢…

Leetcode 104. 二叉树的最大深度 C++实现

Leetcode 104. 二叉树的最大深度 问题:给定一个二叉树root,返回其最大深度。 二叉树的最大深度是指从根节点到最远叶子节点的最长路径上的节点数。 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* …

培训第三十五天(容器的基础命令使用)

1、创建一个容器并同时执行echo命令 # 快速启动一个容器执行特定的一次性命令并查看输出结果,输出结果后容器直接退出[rootdocker ~]# docker run -it --namea0 centos:latest echo "abc"abc[rootdocker ~]# docker psCONTAINER ID IMAGE COMMAND …

游戏app激励视频广告预加载位置,最大化广告收益

最近收到很多游戏类App开发者咨询激励视频广告,在帮助开发者分析产品的时候,特别是一些初级开发者的App产品,发现用户进入这些App,或者打开某个功能时就弹出激励视频广告,这样是违规的,并且用户看完广告也是…

使用gitee存储项目

gitee地址:Gitee - 基于 Git 的代码托管和研发协作平台 创建gitee远程仓库 将远程仓库内容拉取到本地仓库 复制下面这个地址 通过小乌龟便捷推送拉取代码:https://blog.csdn.net/m0_65520060/article/details/140091437

数字图像处理【15】特征检测——SIFT特征检测

一、引入SIFT算法 上一篇文章我们重温学习了Harris角点检测算法的基本原理,但在实际生产使用Harris检测角点的时候,会发现一个问题,就是用于检测的输入图像的尺寸大小会直接影响到Harris的检测结果。这是为什么呢?主要是Harris角…

2024最新50道NLP和人工智能领域面试题+答案(中文+英文双版本)

编者按:分享一个很硬核的免费人工智能学习网站,通俗易懂,风趣幽默, 可以当故事来看,轻松学习。 中文版本 自然语言处理 (NLP)已成为语言学、人工智能和计算机科学交叉领域的变革性领域。随着文本数据量的不断增加&…

内网横向移动常用方法

横向移动 #横向移动含义 横向移动是以已经被攻陷的系统为跳板,通过收集跳板机的信息(文档,存储的凭证,ipc连接记录等等信息)来访问其他域内主机。#常见横向手段 1,通过相同的用户名密码批量ipc连接其他域内…

【学习笔记】Day 22

一、进度概述 1、机器学习常识23-24,以及相关代码复现 2、python 补完计划(详见 python 专题) 二、详情 23、U-Net 从宏观结构上来讲(以下摘自常识23): U-Net 就是 U 形状的网络, 前半部分 (左边…

三星计划今年HBM4设计,2025年初开始样品测试

三星计划今年晚些时候完成首款HBM4内存设备的设计定稿,2025年初开始样品测试 根据nN Elec援引行业消息人士的报道,三星计划在今年晚些时候完成首款HBM4内存设备的设计定稿,并预计将于2025年初开始样品测试。该公司预计将采用其最新一代10纳米…

详细分析 el-progress的基本知识以及用法(附Demo)

目录 前言1. 基本知识2. Demo3. 实战 前言 由于实战项目中有所引用,对此记录基本的知识点,并且以Demo的形式呈现 1. 基本知识 el-progress 是 Element Plus UI 库中的一个进度条组件,用于显示任务的完成情况 可以帮助用户了解某个操作或任…

[数据集][目标检测]工程机械车辆检测数据集VOC+YOLO格式3189张10类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):3189 标注数量(xml文件个数):3189 标注数量(txt文件个数):3189 标注…

密码生成器(HTML+CSS+JavaScript)

🌏个人博客主页:心.c ​ 前言:前两天写了密码生成器,现在跟大家分享一下,大家如果想使用随便拿,如果哪里有问题还请大佬们给我指出,感谢支持 🔥🔥🔥专题文章&…

Vue3集成高德离线地图实践

1. 离线地图效果预览 2. 地图下载器下载离线地图 根据需要选择地图,我这边选择高德地图,层级选择0-15级别即可,进行下载 3. 放到nginx内网服务器 注意配置允许跨域 4. Vue3核心代码 // main.js // 初始化vue-amap initAMapApiLoader({o…