11-18-kafka-生产者理论

news2024/11/19 15:17:35

11-kafka-理论:

Kafka 工作流程及文件存储机制

Kafka 工作流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-esBf8QRd-1670248956153)(png/image-20210906210230485.png)]

Kafka 中消息是以 topic 进行分类的,生产者生产消息,消费者消费消息,都是面向 topic的。

topic 是逻辑上的概念,而 partition 是物理上的概念,每个 partition 对应于一个 log 文件,该 log 文件中存储的就是 producer 生产的数据。Producer 生产的数据会被不断追加到该log 文件末端,且每条数据都有自己的 offset。消费者组中的每个消费者,都会实时记录自己消费到了哪个 offset,以便出错恢复时,从上次的位置继续消费。

Kafka文件存储机制

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ad0aRJNt-1670248956154)(png/image-20210906211731483.png)]

由于生产者生产的消息会不断追加到 log 文件末尾,为防止 log 文件过大导致数据定位效率低下,Kafka 采取了分片索引机制,将每个 partition 分为多个 segment。每个 segment对应两个文件——“.index”文件和“.log”文件。这些文件位于一个文件夹下,该文件夹的命名

规则为:topic 名称+分区序号。例如,first 这个 topic 有三个分区,则其对应的文件夹为 first-0,first-1,first-2。

00000000000000000000.log
00000000000000170410.index
00000000000000170410.log
00000000000000239430.index
00000000000000239430.log
//index 和 log 文件以当前 segment 的第一条消息的 offset 命名。下图为 index 文件和 log文件的结构示意图。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uSswwqtF-1670248956154)(png/image-20210906211836975.png)]

“.index”文件存储大量的索引信息,“.log”文件存储大量的数据,索引文件中的元数据指向对应数据文件中 message 的物理偏移地址。

分区策略

1)分区的原因

(1)方便在集群中扩展,负载均衡,每个 Partition 可以通过调整以适应它所在的机器,而一个 topic又可以有多个 Partition 组成,因此整个集群就可以适应任意大小的数据了;

(2)可以提高并发,因为可以以 Partition 为单位读写了。

2)分区的原则

我们需要将 producer 发送的数据封装成一个 ProducerRecord 对象。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dQJuSXha-1670248956154)(png/image-20210907152619004.png)]

(1)指明 partition 的情况下,直接将指明的值直接作为 partiton 值;

(2)没有指明 partition 值但有 key 的情况下,将 key 的 hash 值与 topic 的 partition 数进行取余得到 partition 值;

(3)既没有 partition 值又没有 key 值的情况下,第一次调用时随机生成一个整数(后面每次调用在这个整数上自增),将这个值与 topic 可用的 partition 总数取余得到 partition 值,也就是常说的 round-robin 算法。

数据可靠性保证

为保证 producer 发送的数据,能可靠的发送到指定的 topic,topic 的每个 partition 收到producer 发送的数据后,都需要向 producer 发送 ack(acknowledgement 确认收到),如果producer 收到 ack,就会进行下一轮的发送,否则重新发送数据。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fktf0GZd-1670248956155)(png/image-20210907152717160.png)]

1)副本数据同步策略

半数以上完成同步,就发送 ack,优点:延迟低 。缺点:选举新的 leader 时,容忍 n 台节点的故障,需要 2n+1 个副本

全部完成同步,才发送ack,优点:选举新的 leader 时,容忍 n 台节点的故障,需要 n+1 个副本。缺点:延迟高

Kafka 选择了第二种方案,原因如下:

1.同样为了容忍 n 台节点的故障,第一种方案需要 2n+1 个副本,而第二种方案只需要 n+1个副本,而 Kafka 的每个分区都有大量的数据,第一种方案会造成大量数据的冗余。

2.虽然第二种方案的网络延迟会比较高,但网络延迟对 Kafka 的影响较小。

2)ISR

采用第二种方案之后,设想以下情景:leader 收到数据,所有 follower 都开始同步数据,但有一个 follower,因为某种故障,迟迟不能与 leader 进行同步,那 leader 就要一直等下去,直到它完成同步,才能发送 ack。这个问题怎么解决呢?Leader 维护了一个动态的 in-sync replica(复制品) set (ISR),意为和 leader 保持同步的 follower 集合。当 ISR 中的 follower 完成数据的同步之后,leader 就会给 follower 发送 ack。如果 follower长时间 未 向 leader 同 步 数 据 , 则 该 follower 将 被 踢 出 ISR , 该 时 间 阈 值 由replica.lag.time.max.ms 参数设定。Leader 发生故障之后,就会从 ISR 中选举新的 leader。

3)ack 应答机制对于某些不太重要的数据,对数据的可靠性要求不是很高,能够容忍数据的少量丢失,所以没必要等 ISR 中的 follower 全部接收成功。所以 Kafka 为用户提供了三种可靠性级别,用户根据对可靠性和延迟的要求进行权衡,选择以下的配置。

acks 参数配置:

0:producer 不等待 broker 的 ack,提供了一个最低的延迟,broker 一接收到还没有写入磁盘就已经返回,当 broker 故障时有可能丢失数据;

1:producer 等待 broker 的 ack,partition 的 leader 落盘成功后返回 ack,如果在 follower同步成功之前 leader 故障,那么将会丢失数据;

-1(all):producer 等待 broker 的 ack,partition 的 leader 和 isr中的follower 全部落盘成功后才返回 ack。但是如果在 follower 同步完成后,broker 发送 ack 之前,leader 发生故障,那么会造成数据重复。

故障处理细节

Log文件中的HW和LEO

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MuqnxTgm-1670248956156)(png/image-20210908093529722.png)]

LEO:指的是每个副本最大的offset

HW:指的是消费者能见到的最大的 offset,ISR 队列中最小的 LEO。

(1)follower 故障

follower 发生故障后会被临时踢出 ISR,待该 follower 恢复后,follower 会读取本地磁盘记录的上次的 HW,并将 log 文件高于 HW 的部分截取掉,从 HW 开始向 leader 进行同步。等该 follower 的 LEO 大于等于该 Partition 的 HW,即 follower 追上 leader 之后,就可以重新加入 ISR 了。

(2)leader故障

leader 发生故障之后,会从 ISR 中选出一个新的 leader,之后,为保证多个副本之间的 数据一致性,其余的 follower 会先将各自的 log文件高于 HW 的部分截掉,然后从新的 leader同步数据。

注意:这只能保证副本之间的数据一致性,并不能保证数据不丢失或者不重复。

Exactly Once 语义(回话pid,分区,主键组合为一个key,去重)

将 ACK 级别设置为-1,可以保证 Producer 到 Server 之间不会丢失数据,即 At Least Once 语义。

相对的,将服务器 ACK 级别设置为 0,可以保证生产者每条消息只会被发送一次,即 At Most Once 语义。

At Least Once 可以保证数据不丢失,但是不能保证数据不重复;相对的,At Least Once可以保证数据不重复,但是不能保证数据不丢失。

但是,对于一些非常重要的信息,比如说交易数据,下游数据消费者要求数据既不重复也不丢失,即 Exactly Once 语义。在 0.11 版

本以前的 Kafka,对此是无能为力的,只能保证数据不丢失,再在下游消费者对数据做全局去重。对于多个下游应用的情况,每个都需要单独做全局去重,这就对性能造成了很大影响。0.11 版本的 Kafka,引入了一项重大特性:幂等性。是指 Producer 不论向 Server 发送多少次重复数据,Server 端都只会持久化一条。幂等性结合 At Least Once 语义,就构成了 Kafka 的 Exactly Once 语义。即:

At Least Once + 幂等性 = Exactly Once

启用幂等性,需将 Producer 的参数中 enable.idompotence 设置为 true 。Kafka的幂等性实现其实就是将原来下游需要做的去重放在了数据上游。开启幂等性的 Producer 在初始化的时候会被分配一个 PID,发往同一 Partition 的消息会附带 Sequence Number。而Broker 端会对<PID, Partition, SeqNumber>做缓存,当具有相同主键的消息提交时,Broker 只会持久化一条。

但是 PID 重启就会变化,同时不同的 Partition 也具有不同主键,所以幂等性无法保证跨分区跨会话的 Exactly Once。

学习路径:https://space.bilibili.com/302417610/,如有侵权,请联系q进行删除:3623472230

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

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

相关文章

【MySQL】MySQL数据库结构与操作

✨个人主页&#xff1a;bit me ✨当前专栏&#xff1a;MySQL数据库 ✨每日一语&#xff1a;自从厌倦于追寻&#xff0c;我已学会一觅即中&#xff0c;自从一股逆风袭来&#xff0c;我已能抗御八面来风&#xff0c;驾舟而行。 目 录 &#x1f334;一. 数据库介绍&#x1f33f;1.…

工业物联网解决方案:地下水实时监测系统

地下水是水资源的重要组成部分&#xff0c;它具备水量稳定、水质好等特点&#xff0c;是农业灌溉、工矿和城市的重要水源之一&#xff0c;但同时也会出现沼泽化、地面沉降、滑坡等问题&#xff0c;影响当地自然环境和生活用水。 随着物联网通信技术的发展以及国家水资源管理的…

JavaScript (WebAPI)

目录 一、DOM 1. DOM树结构&#xff1a; 2. 重要概念 3. DOM 的工作流程 二、获取/操作元素 1. 获取 ① 获取单个元素 ② 获取所有元素 2. 操作 1. 获取/修改元素内容 3. 案例 三、新增元素 1. 创建元素节点 2. 插入节点到 DOM树 四、删除元素 一、DOM DOM 全…

Photoshop简单案例(8)——利用文字工具修改图片上文字

目录一、项目介绍二、原图上有要替换的文字2.1 方法1——利用修补工具修改2.2 方法2——利用移动工具&#xff08;推荐&#xff09;2.3 效果演示三、原图上没有要替换的文字一、项目介绍 本文介绍利用PhotoShop修改图片上的文字。修改下图图片中的学号。 二、原图上有要替换…

【HBU】2022秋线上作业-第五次-有关树的判断选择

判断题&#xff1a; 1. 一棵有124个结点的完全二叉树&#xff0c;其叶结点个数是确定的。 √ 高度为n的完全二叉树的结点数为2ⁿ-1 124位于64-1~128-1之间&#xff0c;所以这棵树的高度是7&#xff0c;前六层是满的有63个&#xff0c;第7层有124-6361个 64-613 第6层有…

使用Electron打包React项目

1、下载Electron Electron中文官网地址&#xff1a;https://www.electronjs.org/zh/docs/latest/ Electron下载如果单纯使用npm的话&#xff0c;会出现n多问题 所以建议使用国内的淘宝镜像 npm config set registry https://registry.npmmirror.com/然后下载 cnpm install -…

LeetCode 81. 搜索旋转排序数组 II

&#x1f308;&#x1f308;&#x1f604;&#x1f604; 欢迎来到茶色岛独家岛屿&#xff0c;本期将为大家揭晓LeetCode 81. 搜索旋转排序数组 II&#xff0c;做好准备了么&#xff0c;那么开始吧。 &#x1f332;&#x1f332;&#x1f434;&#x1f434; 一、题目名称 LeetC…

年后准备换工作的软件测试工程师们,你准备好了吗?

需要严肃说明的是&#xff1a;面试题库作为帮助大家准备面试的辅助资料&#xff0c;但是绝对不能作为备考唯一途径&#xff0c;因为面试是一个考察真实水平的&#xff0c;不是背会了答案就可以的&#xff0c;需要你透彻理解的&#xff0c;否则追问问题答不出来反而减分&#xf…

什么是dapp?如何在web中开发dapp?

web3 “Web3.0”是对“Web2.0”的改进&#xff0c;在此环境下&#xff0c;用户不必在不同中心化的平台创建多种身份&#xff0c;而是能打造一个去中心化的通用数字身份体系&#xff0c;通行各个平台。更像是一种概念吧。 区块链 区块链&#xff08;Blockchain&#xff09;是由…

54-64-k8s-集群监控-高可以用集群-交付部署

54-k8s-集群监控-高可以用集群-交付部署 k8s集群监控 1、概述 一个好的系统&#xff0c;主要监控以下内容 集群监控 节点资源利用率节点数运行Pods Pod监控 容器指标应用程序【程序占用多少CPU、内存】 2、监控平台 使用普罗米修斯【prometheus】 Grafana 搭建监控平台…

JS实现鼠标悬停变色

JS实现鼠标悬停变色 案例池子&#xff1a; JS实现鼠标悬停变色 JavaScript中的排他算法实现按钮单选 JavaScript中的localStorage JavaScript中的sessionStorage JavaScript实现网页关灯效果 JavaScript实现一段时间之后关闭广告 JavaScript实现按键快速获取输入框光标 …

第二证券|紧盯“有诺不行”隐疾 补齐上市公司高质量发展“短板”

有诺不可”的典型事例 “言而有信”是上市公司高质量开展的重要环节。近日&#xff0c;证监会印发的《推动提高上市公司质量三年举动计划&#xff08;2022-2025&#xff09;》&#xff08;下称《举动计划》&#xff09;提出&#xff0c;将着力处理管理领域杰出问题&#xff0c…

(Java)Thymeleaf学习笔记——动力节点

前言 学SpringMVC找课程时就了解到要学习thymeleaf这种Java模板引擎&#xff0c;但本着不用不学的原则就直接跳过&#xff0c;当实践第一个SpringMVC程序helloworld&#xff0c;遇见了thymeleaf&#xff0c;那么就先解决 &#x1f4a1;thymeleaf 知识点&#xff0c;再来学习Sp…

CSS新增样式----圆角边框、盒子阴影、文字阴影

在CSS中新增了三个样式&#xff0c;分别是圆角边框&#xff0c;盒子阴影&#xff0c;文字阴影。 初识圆角边框&#xff1a; border-radius属性用于设置元素的外边框圆角 语法如下&#xff1a; border-radius:length;原理如下&#xff1a; [椭]圆与边框的交集形成圆角效果。…

档案知识:声像档案的数字化处理与保存

声像档案是档案家族中较晚出现的成员&#xff0c;主要包括音像资料、图像资料、图片等&#xff0c;伴随着当今科技的发展进步&#xff0c;声像档案的数字化管理正逐步替代传统声像档案的管理方式&#xff0c;成为当前的发展主流。 虽然声像档案相较于传统文字档案&#xff0c;…

GFS分布式文件系统

GFS分布式文件系统 什么是GFS分布式文件系统 GFS&#xff08;GlusterFS&#xff09; 是一个开源的分布式文件系统。 由存储服务器、客户端以及NFS/Samba 存储网关&#xff08;可选&#xff0c;根据需要选择使用&#xff09;组成。 没有元数据服务器组件&#xff0c;这有助于提…

黑金ZYNQ7100配置HDMI驱动并测试

Linux系统移植系列 Linux系统移植专栏地址 https://blog.csdn.net/qq_41873311/category_12127932.html 一个写了五篇博客&#xff0c;成功在黑金ZYNQ7100搭建了属于我自己的Linux系统 但是缺少显示模块&#xff0c;所以本文就配置个HDMI驱动来完成图像的显示 环境 hdf设计…

N年后牛的数量

1、题目 第一年农场有 1 只成熟的母牛 A&#xff0c;往后的每年&#xff1a; 1&#xff09;每一只成熟的母牛都会生一只母牛 2&#xff09;每一只新出生的母牛都在出生的第三年成熟 3&#xff09;每一只母牛永远不会死 2、思路 举例说明&#xff1a; 可得到递推式为&…

文华财经期货量化策略抄底准确率高的指标公式,逃顶抄底精准共振起涨信号幅图指标

期货指标公式的万变不离...离均线远了就要往均线靠&#xff0c;这就是乖离。 做多的衰竭&#xff0c;做空的无力&#xff0c;也能根据乖离来判断。 量能的重要性不言而喻&#xff0c;他是一切做多做空的力量来源 摒弃了量能的趋势就是没有方向的车&#xff0c;金叉之后也可能突…

C++11 智能指针

文章目录1. 智能指针出现的意义1.1 内存泄漏1.2 智能指针初识2. C标准库中的智能指针2.1 auto_ptr2.2 std::unique_ptr2.3 std::shared_ptr2.4 std::weak_ptr3. 智能指针中的定制删除前言&#xff1a; 智能指针&#xff0c;它是指针嘛&#xff1f;它是一个类具有指针的功能&…