Kafka入门05——基础知识

目录

副本数据同步原理

HW和LEO的更新流程

第一种情况

第二种情况

数据丢失的情况

解决方案

Leader副本的选举过程

日志清除策略和压缩策略

日志清除策略

日志压缩策略

Kafka存储手段

零拷贝(Zero-Copy)

页缓存(Page Cache)

Kafka的消息可靠性


在ISR中,只要有一个Follower存活就能确保Commit的数据不会丢失。那如果分区所有副本都失效了,会发生什么?

无法确保Commit数据不丢失,会出现可用性和一致性问题。需要采取折中方案:

  1. 等待ISR中第一个“活”过来的副本,选举它为Leader。

  2. 选择第一个“活”过来的副本,但它不一定是Leader。

第一种方案的问题就是不可用的时间会相对较长。第二种方案的问题是不保证包含所有Commit的消息。所以往往采取的是第一种方案。

副本数据同步原理

Kafka 的数据副本同步原理是确保消息的高可用性和数据冗余的关键机制。在 Kafka 中,每个分区通常都有多个副本,其中一个是领导副本(Leader Replication)负责读写操作,其他是追随者副本(Follower Replication)用于数据备份和容错。

以其中一个分区的副本同步通信举例,当producer将消息发布到某个partition时:

  1. 通过zookeeper找到分区的leader,将消息发送给leader(无论多少个副本,生产者只将消息发送给leader)。

  2. leader将消息写入本地log。每个follower从leader拉取数据,follower存储顺序与leader一致。

  3. follower在收到消息并写入自身log后,向leader发送Ack。

  4. leader收到ISR中所有的副本的Ack后,消息被认为commit成功,leader更新HW并向生产者发送Ack。

HW(High Water): 水位线。代表的是小于等于HW值的所有消息是已备份的。

LEO(Log End Offset):日志末端位移。代表的是下一条消息的位移,如LEO=10,表示已有[0,9]共10条消息。

HW和LEO的更新流程

初始状态的HW和LEO都是0。Leader中存放了一个表示follower的LEO值 remote leo也为0。

当前生产者没有发送消息,但是Follower会不断地向leader发送fetch请求,因为leader没有接收到消息,follower的fetch会阻塞。参数配置replicas.fetch.wait.,ax.ms决定阻塞时间。时间内,生产者发送消息给leader的话,fetch请求会被唤醒,让leader继续处理。

在初始状态下,会出现两种情况:

  1. leader处理完生产者请求后,follower发送一个fetch请求。

  2. follower的fetch请求阻塞时间内,leader收到生产者发送的请求

第一种情况

生产者发送一条消息,leader处理后,消息追加到本地log,更新LEO为1。

follower第一次发起fetch请求,offset=0;

leader收到后确认remote LEO为0,

HW由LEO和remote LEO的最小值决定,HW = 0,

leader回复response,包含消息和HW=0。

follower收到response,追加消息到本地log,更新LEO=1。

follower第二次发起fetch请求,offset=1;

leader收到后确认remote LEO为1,

HW由LEO和remote LEO的最小值决定,HW = 1,

leader回复response,包含消息(没有数据就返回空)和HW=1。

follower收到response,追加消息到本地log(有就写入本地日志),更新HW=1。

第一种情况到此就完成了数据同步,消费者就可以消费offset=1的这条消息了。

第二种情况

fetch在阻塞的过程中leader收到了生产者发送的消息,就会唤醒fetch请求,后面和第一种情况一致。

  1. leader将消息写入本地日志,更新leader的LEO

  2. 唤醒follower的fetch请求

  3. 更新HW

数据丢失的情况

Kafka中min.insync.replicas=1默认设定ISR中的最小副本数为1,并且acks设置为-1(需要所有副本确认)才生效。

意思就是需要至少1个副本同步才能表示消息时提交的,当min.insync.replicas=1时,只要leader将消息写入log就认为是“已提交”,而延迟一轮fetch rpc更新HW值的设计使得follower HW的值是异步延迟更新的。

假设这个过程中,leader发生变更,那新leader中的HW值就有可能是过期的,使得“已提交” 的消息被删除。

acks表示生产者发送消息到broker上以后的确认之。

  • 0:表示不需要确认。时延小风险大(server宕机,数据就会丢失)

  • 1:表示只需要leader确认。时延小同时确保leader接收成功

  • all(-1):需要ISR所有replicas确认。速度慢,安全性最高,但ISR会缩小到只有一个replicas,也不一定能避免数据丢失。

解决方案

Kafka的0.11版本引入了leader epoch解决数据丢失问题。 leader epoch是一对值(epoch,offset),epoch从0递增,当leader变更会epoch+1,offset是对应的leader写入第一条消息的offset。

Epoch 的作用

  1. 数据丢失恢复:Epoch 机制用于解决因为领导副本故障而导致的数据丢失问题。当一个新的领导副本被选定时,Kafka 会使用 Epoch 来确定哪些追随者副本具有相同的数据,并将数据从这些追随者副本中恢复。

  2. 数据冲突解决:Epoch 也用于解决数据冲突问题,确保只有具有最新数据的副本成为新的领导副本。

举个例子:

在分区的本地磁盘上持久化了一个/tmp/kafkalog/topic/leader-epoch-checkpoint的文件,文件的内容类似于[0,50],[1,89],[2,100]...leader broker会保存这样一个缓存,定期写入文件中。

当leader写log时,会尝试更新整个缓存。

  • 如果leader首次写,缓存中新加一条数据。

  • 如果leader不是首次写,那就不更新。

副本每次成为loader时都会查询这部分缓存,获取对应的leader版本的offset。

针对数据丢失的场景,就有了对应的解决办法:

  1. follower宕机恢复后

    • leader没有发生改变:发送OffsetForLeaderEpochRequest请求给leader,leader返回LEO

    • leader发生改变:follower发送的Request中的epoch和leader不同,leader会去查找follower的epoch+1对应的StartOffset,也就是新leader的LEO,返回给follower。

  2. leader宕机了,重新选举了leader:原本的follower就变成了leader,epoch从0变为了1,原本follower中的LEO值得到了保留。

Leader副本的选举过程

KafkaController会监听Zookeeper的/broker/ids节点路径,有broker挂了的时候,对应broker中分区的leader副本就需要重新选举。

选举策略:

  1. 优先从ISR列表中选取第一个作为leader副本,叫优先副本。

  2. 如果ISR列表为空,查看topic的unclean.leader.election.enable配置。

    • true:允许选择非ISR列表的副本作为leader,有可能数据丢失

    • false:不允许选择非ISR列表的副本作为leader,抛出异常,选举失败

  3. 在2的配置为true的基础上,选出一个leader副本,并且ISR列表只包含该leader副本。选举成功后,将leader和ISR其他副本信息写入该分区对应的Zookeeper路径上。

日志清除策略和压缩策略
日志清除策略

kafka的日志使用的分段存储,一方面能减少文件内容的大小,另一方面方便kafka日志清理。日志清理策略有两个:

  • 根据消息的保留时间,超过指定时间的消息会被清理

  • 根据存储的数据大小,当日志文件大于一定的阈值就删除最旧的消息。

kafka有一个后台线程,定期检查是否存在可以删除的消息。对应的两个参数配置:log.retention.bytes和log.retention.hours。消息默认保留时间是7天。

日志压缩策略

消息的保存方式是key-value的形式,消费者只关心相同的key最新的value,kafka的压缩原理就是后台启动Cleaner线程,定期将相同的key进行合并,保存最新的value。

Kafka存储手段
零拷贝(Zero-Copy)

零拷贝是一种技术,通过它可以将数据从一个缓冲区(如内存)传输到另一个缓冲区,而不需要在中间进行数据的复制。这可以提高数据传输的效率和降低CPU和内存的开销。在 Kafka 中,零拷贝技术用于以下几个方面:

  1. 生产者:Kafka 生产者使用零拷贝来将消息从内存传输到网络套接字,从而提高发送性能。

  2. 消费者:Kafka 消费者使用零拷贝来将消息从网络套接字传输到内存,从而提高接收性能。

  3. 磁盘写入:Kafka 使用零拷贝来将数据从内存缓冲区写入到磁盘,这可以提高磁盘写入的效率。

页缓存(Page Cache)

Kafka 使用操作系统的页缓存来管理磁盘上的数据。Page Cache 是操作系统的一部分,它将磁盘上的数据缓存在内存中,以便快速读取和写入。Kafka 利用了页缓存来加速磁盘的读写操作,提高了消息的持久性和性能。

具体来说,Kafka 将消息写入到磁盘时,首先将消息写入到操作系统的页缓存中,然后异步刷写到磁盘上。这样,Kafka 可以将多个小的写操作合并成更大的写操作,减少磁盘 I/O 操作的次数,提高写入性能。

另外,当 Kafka 消费者读取消息时,它可以从页缓存中读取消息,而不必每次都直接访问磁盘,这降低了读取的延迟。

Kafka的消息可靠性

消息的可靠性很难达到百分百完全可靠的地步,常常会用几个9作为衡量标准。kafka保证消息可靠性的手段:

  • 分区和副本:Kafka 的消息被分布到多个分区中,每个分区通常有多个副本。这样即使其中一个节点或分区发生故障,消息仍然可以从其他节点或副本中获取,从而提高可用性和可靠性。

  • Leader-Follower 架构:每个分区都有一个领导副本(Leader)和多个追随者副本(Followers)。生产者写入消息到领导副本,然后领导副本负责将消息复制到追随者副本,确保数据冗余。

  • 消息持久性:Kafka 使用文件系统和操作系统的缓存来提高消息的持久性。消息首先写入到文件系统缓存,然后异步刷写到磁盘,以避免写入性能的下降。

  • 复制同步:Kafka 使用复制同步机制来确保数据同步。只有当追随者副本确认已成功复制数据后,生产者才会收到确认。

  • 消息确认:生产者和消费者可以配置确认机制,确保消息的可靠性。生产者可以等待所有副本都确认成功后才发送确认,而消费者可以等待消息处理成功后才发送确认。

  • 数据冗余:消息在多个副本之间进行冗余,如果一个副本出现故障,仍然可以从其他副本获取数据。

  • 再均衡(Rebalance):在消费者组中,Kafka 使用再均衡机制来确保分区的重新分配,以提供高可用性和数据冗余。

  • 持久性日志:Kafka 的日志文件具有持久性,即使 Kafka 服务重启,数据也不会丢失。

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

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

相关文章

如何构建一个外卖微信小程序

随着外卖行业的不断发展,越来越多的商家开始关注外卖微信小程序的开发。微信小程序具有使用方便、快速上线、用户覆盖广等优势,成为了商家们的首选。 那么,如何快速开发一个外卖微信小程序呢?下面就让我们来看看吧! 首…

Painter:使用视觉提示来引导网络推理

文章目录 1. 论文2. 示意图3. 主要贡献4. 代码简化 1. 论文 paper:Images Speak in Images: A Generalist Painter for In-Context Visual Learning github:https://github.com/baaivision/Painter 2. 示意图 3. 主要贡献 在 In-context Learning 中,作为自然语言…

logback-classic包中ThrowableProxy递归缺陷StackOverflowError解析

logback-classic&#xff08;<1.2.12版本&#xff09;ThrowableProxy类中存在递归缺陷&#xff0c;会导致java.lang.StackOverflowError。改缺陷在1.2.12以上版本(包含该版本)中已修复。 如何复现&#xff1a; 两个异常彼此设置casue&#xff1a; 运行后报以下错误 以上写…

Python OpenCV将n×n的小图拼接成m×m的大图

Python OpenCV将nn的小图拼接成mm的大图 前言前提条件相关介绍实验环境n \times n的小图拼接成m \times m的大图代码实现 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容&#xff0c;可点击进入Python日常小操作专栏、OpenCV-Python小…

Spark SQL概述与基本操作

目录 一、Spark SQL概述 &#xff08;1&#xff09;概念 &#xff08;2&#xff09;特点 &#xff08;3&#xff09;Spark SQL与Hive异同 &#xff08;4&#xff09;Spark的数据抽象 二、Spark Session对象执行环境构建 (1)Spark Session对象 &#xff08;2&#xff09;代码演…

视频相关学习笔记

YUV 和rgb一样是一种表示色彩的格式&#xff0c;Y表示亮度&#xff0c;UV表示色度&#xff08;U是蓝色投影&#xff0c;V是红色投影&#xff09;&#xff0c;只有Y就是黑白的&#xff0c;所以这个格式的视频图片可以兼容黑白电视&#xff0c;所以彩色电视使用的都是YUV 存储方…

JS清除字符串中的空格

一、replace()方法 replace方法在字符串中搜索值或正则表达式&#xff0c;返回已替换值的新字符串&#xff0c;不会更改原始字符串。 去除字符串内所有的空格&#xff1a;str str.replace(/\s*/g,“”) 去除字符串内两头的空格&#xff1a;str str.replace(/^\s*|\s*$/g,“…

PDF编辑工具Acrobat Pro DC 2023中文

Acrobat Pro DC 2023是一款全面、高效的PDF编辑和管理软件。它提供了丰富的PDF编辑功能&#xff0c;如创建、编辑、合并、分割、压缩、旋转、裁剪等&#xff0c;让用户可以轻松处理各种PDF文档。同时&#xff0c;该软件还具有智能的PDF处理技术&#xff0c;可以自动识别和修复P…

Autojs 利用OpenCV识别棋子之天天象棋你马没了

本例子通过代码像你介绍利用OpenCV实现霍尔找圆的方法定位棋子位置 通过autojs脚本实现自动点击棋子 开源地址 https://github.com/Liberations/TtxqYourHorseIsGone/blob/master/main.js AutoXJs https://github.com/kkevsekk1/AutoX/releasesauto() //安卓版本高于Android 9…

【网络协议】聊聊TCP的三挥四握

上一篇我们说了网络其实是不稳定的&#xff0c;TCP和UDP其实是两个不同的对立者&#xff0c;所以TCP为了保证数据在网络中传输的可靠性&#xff0c;从丢包、乱序、重传、拥塞等场景有自己的一套打法。 TCP格式 源端口和目标端口是不可缺少的&#xff0c;用以区分到达发送给拿…

软件测试行情不好,我还是啃下了27K的offer

o “会代码吗&#xff1f;” o “会&#xff0c;Java、Python我都会一些&#xff01;” o “有没有用代码开发过一些测试工具平台呢&#xff1f;” o “额。。。这个。。。没做过。。。” o “那你回去等消息吧” 软件测试行业发展到今天&#xff0c;测试人员会代码&#x…

牛客网刷题-(6)

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…

Android [SPI,AutoSerivce,ServiceLoader]

记录一下在Android中使用SPI的过程。 1.项目gralde文件。 plugins {id kotlin-kapt } dependencies {implementation com.google.auto.service:auto-service:1.0-rc7 kapt "com.google.auto.service:auto-service:1.0-rc7" } 这个AutoServ…

linux下安装 Chrome 和 chromedriver 以及 selenium webdriver 使用

1 安装 Chrome yum install https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm2 下载 chromedriver # 进入下载目录 cd soft/crawler_tools# 查看chrome 版本号 google-chrome --version# 在chromedriver下载地址中找到对应版本&#xff0c;下载对…

电脑视频怎么转音频mp3

如果你在电脑上观看视频时喜欢上某个片段的背景音乐&#xff0c;且想将喜欢的背景音乐制作为手机铃声。我是建议你将此视频转换为 MP3 格式&#xff0c;因为 MP3 几乎与所有设备相兼容&#xff0c;让你可以在不同设备上不受限制地去聆听它。那该如何转换呢&#xff1f;无需担心…

目标跟踪ZoomTrack: Target-aware Non-uniform Resizing for Efficient Visual Tracking

论文作者&#xff1a;Yutong Kou,Jin Gao,Bing Li,Gang Wang,Weiming Hu,Yizheng Wang,Liang Li 作者单位&#xff1a;CASIA; University of Chinese Academy of Sciences; ShanghaiTech University; Beijing Institute of Basic Medical Sciences; People AI, Inc 论文链接&…

2023年腾讯云2核4G配置服务器性价比怎么样?

2023年腾讯云2核4G配置服务器性价比怎么样?性价比高&#xff01;CPU具有100%计算性能&#xff0c;而且双11优惠价一年166元&#xff0c;三年566元&#xff0c;性价比超级高&#xff01; 2023腾讯云双11优惠活动&#xff1a;轻量2核4G5M服务器166.6元/年&#xff0c;3年566.6元…

达梦:开启sql日志记录

前言 开启sql日志记录&#xff0c;可协助排查定位数据库问题。生产开启会有一定的性能消耗&#xff0c;建议打开 SQL 日志异步刷盘功能 1.配置sqllog.ini文件 sqllog.ini 用于 SQL 日志的配置&#xff0c;当且仅当 INI 参数 SVR_LOG1 时使用。 运行中的数据库实例&#xff0c;可…

GoLong的学习之路(三)语法之运算符

书接上回&#xff0c;我们进展到了GoLong的基本数据类型&#xff0c;接下来说运算符&#xff08;其实和常见的编程语言的逻辑规则一样&#xff09; 运算符 运算符用于在程序运行时执行数学或逻辑运算。&#xff08;不可谓不重要&#xff09; Go 语言内置的运算符有&#xff…

如何做好建筑翻译呢

近年来&#xff0c;随着跨国工程项目增加&#xff0c;建筑翻译也越来越受到重视。尤其是建筑图纸翻译在工程设计、规划和施工等方面都具有重要意义。那么&#xff0c;如何做好建筑翻译呢&#xff0c;建筑工程翻译哪个比较正规&#xff1f; 在建筑行业日新月异的发展中&#xff…