关于kafka中ISR、AR、HW、LEO、LSO、LW的含义详解

article/2025/9/13 19:32:07

kafka中的ISR、AR又代表什么?ISR伸缩又是什么?

​    分区中的所有副本统称为AR(Assigned Repllicas)所有与leader副本保持一定程度同步的副本(包括Leader)组成ISR(In-Sync Replicas),ISR集合是AR集合中的一个子集。消息会先发送到leader副本,然后follower副本才能从leader副本中拉取消息进行同步,同步期间内follower副本相对于leader副本而言会有一定程度的滞后。前面所说的“一定程度”是指可以忍受的滞后范围,这个范围可以通过参数进行配置。与leader副本同步滞后过多的副本(不包括leader)副本,组成OSR(Out-Sync Relipcas),由此可见:AR=ISR+OSR。在正常情况下,所有的follower副本都应该与leader副本保持一定程度的同步,即AR=ISR,OSR集合为空。

​    Leader副本负责维护和跟踪ISR集合中所有的follower副本的滞后状态,当follower副本落后太多或者失效时,leader副本会吧它从ISR集合中剔除。如果OSR集合中follower副本“追上”了Leader副本,之后再ISR集合中的副本才有资格被选举为leader,而在OSR集合中的副本则没有机会(这个原则可以通过修改对应的参数配置来改变)

​    ISR的伸缩:

​    Kafka在启动的时候会开启两个与ISR相关的定时任务,名称分别为“isr-expiration"和”isr-change-propagation".。isr-expiration任务会周期性的检测每个分区是否需要缩减其ISR集合。这个周期和“replica.lag.time.max.ms”参数有关。大小是这个参数一半。默认值为5000ms,当检测到ISR中有是失效的副本的时候,就会缩减ISR集合。如果某个分区的ISR集合发生变更, 则会将变更后的数据记录到ZooKerper对应/brokers/topics//partition//state节点中。节点中数据示例如下:

{“controller_cpoch":26,“leader”:0,“version”:1,“leader_epoch”:2,“isr”:{0,1}}

​    其中controller_epoch表示的是当前的kafka控制器epoch.leader表示当前分区的leader副本所在的broker的id编号,version表示版本号,(当前半本固定位1),leader_epoch表示当前分区的leader纪元,isr表示变更后的isr列表。

​    除此之外,当ISR集合发生变更的时候还会将变更后的记录缓存到isrChangeSet中,isr-change-propagation任务会周期性(固定值为2500ms)地检查isrChangeSet,如果发现isrChangeSet中有ISR 集合的变更记录,那么它会在Zookeeper的 /isr_change_notification的路径下创建一个以isr_change开头的持久顺序节点,

 (比如/isr_change_notification/isr_change_0000000000), 并将isrChangeSet中的信息保存到这个节点中。kafka控制器为/isr_change_notification添加了一个Watcher,当这个节点中有子节点发生变化的时候会触发Watcher动作,以此通知控制器更新相关的元数据信息并向它管理的broker节点发送更新元数据信息的请求。

   最后删除/isr_change_notification的路径下已经处理过的节点。频繁的触发Watcher会影响kafka控制器,zookeeper甚至其他的broker性能。为了避免这种情况,kafka添加了指定的条件,当检测到分区ISR集合发生变化的时候,还需要检查一下两个条件:

​    (1).上一次ISR集合发生变化距离现在已经超过5秒,

​    (2).上一次写入zookeeper的时候距离现在已经超过60秒。

​    满足以上两个条件之一者可以将ISR写入集合的变化的目标节点。

​    有缩减就会有补充,那么kafka何时扩充ISR的?

​    随着follower副本不断进行消息同步,follower副本LEO也会逐渐后移,并且最终赶上leader副本,此时follower副本就有资格进入ISR集合,追赶上leader副本的判定准侧是此副本的LEO是否小于leader副本HW,这里并不是和leader副本LEO相比。ISR扩充之后同样会更新ZooKeeper中的/broker/topics//partition//state节点和isrChangeSet,之后的步骤就和ISR收缩的时的相同。

​    当ISR集合发生增减时,或者ISR集合中任一副本LEO发生变化时,都会影响整个分区的HW。

​    如下图所示,leader副本的LEO为9,follower副本的LEO为7,而follower2副本的LEO为6,如果判定这三个副本都处于ISR集合中,那么分区的HW为6,如果follower3已经判定失效副本被剥离出ISR集合,那么此时分区HW为leader副本和follower副本中LEO的最小值,即为7.

å¨è¿éæå¥å¾çæè¿°

​    LW是Low Watermark的缩写,俗称“低水位”,代表AR集合中最小的logStartOffset值,副本的拉取请求(FetchRequest,它有可能触发新建日志分段而旧的的被清理,进而导致logStartoffset的增加)和删除请求(DeleteRecordRequest)都可能促使LW的增长。

kafka中的HW、LEO、LSO、LW等分别代表什么?

​    ISR与HW和LEO也有紧密的关系,HW是High Watermak的缩写, 俗称高水位,它表示了一个特定消息的偏移量(offset),消费之只能拉取到这个offset之前的消息。

​    如下,它代表一个日志文件,这个日志文件中有9条消息,第一消息的offset(LogStartOffset)为0,最后的一条消息offset为8,offset为9的消息用虚线框表示,代表下的一个待写入的消息。日志文件的HW为6.表示消费者只能拉取到offset0至5之间的消息,而offset为6的消息对消费者而言是不可见的。

å¨è¿éæå¥å¾çæè¿°

​    LEO是Log End Offset的缩写,它表示了当前日志文件中下一条待写入消息的offset,如上图offset为9的位置即为当前日志文件LEO,LEO的大小相当于当前日志分区中最后一条消息的offset值加1。分区ISR集合中的每个副本都会维护自身的LEO,而ISR集合中最小的LEO即为分区的HW,对消费这而言只能消费HW之前的消息。

​    如下图,假设某个分区的ISR集合中有三个副本,即一个leader副本和两个follower副本,此时分区的LEO和HW都为3。消息3和消息4从生产者发出之后会被先存入leader副本。

å¨è¿éæå¥å¾çæè¿°

å¨è¿éæå¥å¾çæè¿°
​    在消息写入leader副本之后,follower副本会发送拉取请求来拉取消息3和消息4以进行消息同步。

​    在同步过程中,不同的follower副本的同步效率也不尽相同。如下图,在某一时刻follower1完全跟上了leader副本而follower2只同步了消息3,如此leader副本的LEO为5,follower1的LEO为5,Follower2的LEO为4。那么当前分区的HW最小值4,此时消费者可以消费到offset为0-3之间的消息。

​    写入消息如下图,所有的副本都成功写入了消息3和消息4,整个分区的HW和LEO为5,因此消费者可以消费offset为4的消息了。

å¨è¿éæå¥å¾çæè¿°

​    由此可见,kafka的复制机制不是完全的同步复制,也不是单纯的异步复制,事实上,同步复制要求所有能工作的Follower副本都复制完,这条消息才会被确认为成功提交,这种复制方式影响了性能。而在异步复制的情况下, follower副本异步地从leader副本中复制数据,数据只要被leader副本写入就被认为已经成功提交。在这种情况下,如果follower副本都没有复制完而落后于leader副本,如果突然leader副本宕机,则会造成数据丢失。Kafka使用这种ISR的方式有效的权衡了数据可靠性与性能之间的关系。

​    什么是LSO?

​    LSO特指LastStableOffset。它具体与kafka的事物有关。

 ​    消费端参数——isolation.level,这个参数用来配置消费者事务的隔离级别。字符串类型,“read_uncommitted”和“read_committed”,表示消费者所消费到的位置,如果设置为“read_committed",那么消费这就会忽略事务未提交的消息,既只能消费到LSO(LastStableOffset)的位置,默认情况下,”read_uncommitted",既可以消费到HW(High Watermak)的位置。

注:follower副本的事务隔离级别也为“read_uncommitted",并且不可修改。

​    在开启kafka事务的同时,生产者发送了若干消息,(msg1,msg2,)到broker中,如果生产者没有提交事务(执行CommitTransaction),那么对于isolation.level=read_committed的消费者而言是看不多这些消息的,而isolation.level=read_uncommitted则可以看到。事务中的第一条消息的位置可以标记为firstUnstableOffset(也就是msg1的位置)。

​    这个LSO还会影响到kafka消费之后的量,(也就是kafka,Log,很多时候也称之为kafka堆积量)的计算 。如下图。

​    å¨è¿éæå¥å¾çæè¿°

​    在图中,对每一个分区而言,它Lag等于HW-ConsumerOffset的值,其中ComsmerOffset表示当前的消费的位移,当然这只是针对普通的情况。如果为消息引入了事务,那么Lag的计算方式就会有所不同。

如果当消费者客户端的isolation.level的参数配置为“read_uncommitted"(默认),那么Lag的计算方式不受影响,如果这个参数配置为“read_committed",那么就要引入LSO来进行计算了。

å¨è¿éæå¥å¾çæè¿°

​    对于未完成的事务而言,LSO的值等于事务中的第一条消息所在的位置,(firstUnstableOffset)

​    对于已经完成的事务而言,它的值等同于HW相同,所以我们可以得出一个结论:LSO≤HW≤LEO

å¨è¿éæå¥å¾çæè¿°

​    所以,对于分区中未完成的事务,并且消费者客户端的isolation.level参数配置为”read_committed

"的情况,它对应的Lag等于LSO-ComsumerOffset的值。
 


http://chatgpt.dhexx.cn/article/b4ttqcfC.shtml

相关文章

c4isr系统有无服务器,什么是C4ISR系统?

C4ISR是指挥、控制、通信、计算机、情报、侦察与监视系统的英文简称,是美国各军兵种作战系统的大脑和神经。其主要功能是把作战系统各部分连接起来,构成一个灵活、机动、可靠、无缝的网络,确保各参战部队能依靠网络进行以网络为中心的现代化战…

Next.js性能优化之ISR渲染入门和原理探索

前言 术语说明: SSR —— 服务端渲染SSG —— 静态生成ISR —— 增量静态化Date Fetch 函数 —— 本文特指服务端数据获取的几种函数 getStaticProps 、 getServerSideProps 、 getInitialProps 、 getStaticPaths 。 Next.js 中最突出的莫过于它的渲染模式&…

Kafka之分区副本与ISR

概念 什么是副本 Kafka的Topic分区本质是一个用于存储Topic下的消息的日志,但是只存一份日志会因为机器损坏或其他原因导致消息丢失不可恢复, 因此需要多个相同的日志作为备份,提高系统可用性,这些备份在kafka中被称为副本(rep…

Kafka的ISR收缩机制

ISR什么时候收缩ISR什么时候扩展ISR的传播机制Broker宕机之后怎么ISR的收缩? Kafka在启动的时候,会启动一个副本管理器ReplicaManager,这个副本管理器会启动几个定时任务。 ISR过期定时任务isr-expiration,每隔replica.lag.time.max.ms/2毫秒就执行一次。ISR变更的…

Kafka ISR

ISR(in-sync replica) 就是 Kafka 为某个分区维护的一组同步集合,即每个分区都有自己的一个 ISR 集合,处于 ISR 集合中的副本,意味着 follower 副本与 leader 副本保持同步状态,只有处于 ISR 集合中的副本才…

kafka中的ISR、AR又代表什么?ISR伸缩又是什么?

kafka中的ISR、AR又代表什么?ISR伸缩又是什么? ​ 分区中的所有副本统称为AR(Assigned Repllicas)。所有与leader副本保持一定程度同步的副本(包括Leader)组成ISR(In-Sync Replicas&#xff09…

Kafka之ISR机制的理解

Kafka对于producer发来的消息怎么保证可靠性? 每个partition都给配上副本,做数据同步,保证数据不丢失。 副本数据同步策略 和zookeeper不同的是,Kafka选择的是全部完成同步,才发送ack。但是又有所区别。 所以&…

中断ISR技术架构

架构一 ISR采用立即响应思路,技术架构如下图: 优点:简单。 缺点:处理性能不高,中断优先级规划性不高(仅仅区分CPU的32个优先级别,针对不同类型中断优先级不支持)。 选型:对于硬件支持多级中断…

【Java面试】什么是 ISR,为什么需要引入 ISR

Hi,大家好,我是Mic。 一个工作5年的粉丝,在简历上写精通Kafka。 结果在面试的时候直接打脸。 面试官问他:“什么是ISR,为什么需要设计ISR” 然后他一脸懵逼的看着面试官。 下面看看普通人和高手的回答。 需要高手面试文…

2022年正式赛题网络系统管理Linix模块 NFS部分

共享/webdata/目录;用于存储AppSrv主机的WEB数据;仅允许AppSrv主机访问该共享;考虑安全,不论登入NFS 的使用者身份为何,都将其设置为匿名用户访问。

NXP迅为i.MX8Mmini开发板Linix固件编译下

4 编译 Ubuntu20 桌面版本 1 如果大家想要编译 Ubuntu20 桌面版本,首先要将光盘资料“iTOP-i.MX8MM 开发板\01-i.MX8MM 开发板光盘资料\20210830\07-Ubuntu20 系统源码\Ubuntu20 桌面版本” 下的压缩包拷贝到 Linux 源码的根目录下,解压压缩包得到 ubunt…

Linix(CentOS6.5)详细安装

CentOS6.5的安装(Minimal) 点击CentOS6镜像文件下载 点击CentOS7镜像文件下载 1.点击创建新的虚拟机 2.选择自定义模式 3.选择VMware Workstation的版本 4.选择稍后安装 5.选择合适操作系统(64位OR32位) 6.更改默认的安装…

Linix环境搭建及概述

linux环境搭建及概述 前言 Linux 的安装,安装步骤比较繁琐,现在其实云服务器挺普遍的,价格也便宜,如果直接不想搭建,也可以直接买一台学习用用!废话不多说直接开整 一、安装CentOS(虚拟机安装…

Linux系统常用命令--LInix系统随笔(四)

前言:虽然一直在用linux但是一直没有系统的学习过,趁着暑假花了几天看着鸟哥的书学习了一下。下面是我记录的一些笔记,本人属于入门的小白所以难免有不足之处,还望发现的表哥们多多指正。 ①命令格式与目录处理命令ls ls--list…

util-linix 实用程序包中包含了许多系统管理员常用的其它命令

util-linix 实用程序包中包含了许多系统管理员常用的其它命令。这些实用程序是由 Linux 内核组织发布的,这 107 条命令中几乎每一个都来自原本是三个单独的集合 —— fileutils、shellutils 和 textutils,2003 年它们被合并成一个包:util-lin…

LINIX 通过进程号查端口、通过端口查进程号

可以通过 netstat -nlp|grep pid或port,来查询端口、进程号 1.通过进程查PORT 2.通过PORT查进程 netstat命令参数说明 n 直接使用ip地址,而不通过域名服务器 -l 显示监控中的服务器的 Socket -p 显示正在使用 Socket 的程序识别码和程序名称

Linu X

LINU X 基本命令 / 根目录 几个盘几个根目录 dev 设备目录 boot 启动文件 etc 配置目录 home 家目录 用户1.管理员 2.一般用户 proc硬件信息 【benlocalhost desktop]#管理员 管理员 主机名 当前目录 $普通用户 cd 修改,进入当前目录 ls显示当前目录下的项目 ll显示…

linx

linx ls -l 命令详解 上图用ls -l命令查看某一个目录会得到一个7个字段的列表 1. 文件类型     “-”表示普通文件; “d”表示目录; “l”表示链接文件; “p”表示管理文件; “b”表示块设备文件; “c”表示…

Linux-

文章目录 基础知识Linux使用命令整理Linux系统下文件类型颜色表示含义 基础知识 Linux使用命令整理 zip 文件名——(压缩命令)将所有.jpg的文件压缩成一个zip包 ,案例:zip all.zip ;zip *.jpg unzip 文件名——&…

Linix

Linix 一、Linix的基本使用1.1 、Linux目录结构1.2、文件目录属性1.3、目文件展示1.4、用户及权限管理1.4.1、概述1.4.2、用户管理1.4.3、组管理1.4.4、权限管理 1.5、查看用户信息 查看用户组信息 二、命令相关2.1、系统相关1.4.4、权限管理 2.2、进程相关2.2.1、端口占用情况…