Kafka之ISR机制的理解

article/2025/9/13 19:44:54

Kafka对于producer发来的消息怎么保证可靠性?

每个partition都给配上副本,做数据同步,保证数据不丢失。

副本数据同步策略

和zookeeper不同的是,Kafka选择的是全部完成同步,才发送ack。但是又有所区别。

所以,你们才会在各种博客看到这句话【kafka不是完全同步,也不是完全异步,是一种ISR机制

这句话对也不对,不对也对(谜语人......)

首先笔者认为:Kafka使用的就是完全同步方案。

完全同步的优点

同样为了容忍 n 台节点的故障,过半机制需要 2n+1 个副本,而全部同步方案只需要 n+1 个副本,

而 Kafka 的每个分区都有大量的数据,过半机制方案会造成大量数据的冗余。(这就是和zookeeper的不同)

完全同步会有什么问题?

假设就有这么一个follower延迟太高或者某种故障的情况出现,导致迟迟不能与leader进行同步。

怎么办?leader等还是不等?

等吧:producer有话要说:“Kafka也不行啊,处理个消息这么费劲,垃圾,你等NM呢等”

不等:那你Kafka对外说完全同步个鸡儿,你这是完全同步么?

基于此,Kafka的设计者和开发者想出了一个非常鸡贼的点子:ISR

什么是ISR?

先来看几个概念

1、AR(Assigned Repllicas)一个partition的所有副本(就是replica,不区分leader或follower)

2、ISR(In-Sync Replicas)能够和 leader 保持同步的 follower + leader本身 组成的集合。

3、OSR(Out-Sync Relipcas)不能和 leader 保持同步的 follower 集合

4、公式:AR = ISR + OSR

所以,看明白了吗?

Kafka对外依然可以声称是完全同步,但是承诺是对AR中的所有replica完全同步了吗?

并没有。Kafka只保证对ISR集合中的所有副本保证完全同步。

至于,ISR到底有多少个follower,那不知道,别问,问就是完全同步,你再问就多了。

这就好比网购买一送一,结果邮来了一大一小两个产品。

你可能觉得有问题,其实是没问题的,商家说送的那个是一模一样的了吗?并没有。

ISR就是这个道理,Kafka是一定会保证leader接收到的消息完全同步给ISR中的所有副本。

而最坏的情况下,ISR中只剩leader自己。

基于此,上述完全同步会出现的问题就不是问题了。

因为ISR的机制就保证了,处于ISR内部的follower都是可以和leader进行同步的,一旦出现故障或延迟,就会被踢出ISR。

ISR 的核心就是:动态调整

总结:Kafka采用的就是一种完全同步的方案,而ISR是基于完全同步的一种优化机制。

follower的作用

读写都是由leader处理,follower只是作备份功能,不对外提供服务。

什么情况ISR中的replica会被踢出ISR?

以前有2个配置

# 默认10000 即 10秒
replica.lag.time.max.ms# 允许 follower 副本落后 leader 副本的消息数量,超过这个数量后,follower 会被踢出 ISR
replica.lag.max.messages 

说白了就是一个衡量leader和follower之间差距的标准。

一个是基于时间间隔,一个是基于消息条数。

0.9.0.0版本之后,移除了replica.lag.max.messages 配置。

为什么?

因为producer是可以批量发送消息的,很容易超过replica.lag.max.messages,那么被踢出ISR的follower就是受了无妄之灾。

他们都是没问题的,既没有出故障也没高延迟,凭什么被踢?

replica.lag.max.messages调大呢?调多大?太大了是否会有漏网之鱼,造成数据丢失风险?

这就是replica.lag.max.messages的设计缺陷。

replica.lag.time.max.ms的误区

【只要在 replica.lag.time.max.ms 时间内 follower 有同步消息,即认为该 follower 处于 ISR 中】

你去网上看博客,很多博客表达的就是这个意思,不过笔者认为这么描述很容易误导初学者。

那我是不是可以理解为,follower有个定时任务,只要在replica.lag.time.max.ms时间内去leader那pull数据就行了。

其实不是的。千万不要这么认为,因为这里还涉及一个速率问题(你理解为蓄水池一个放水一个注水的问题)。

如果leader副本的消息流入速度大于follower副本的拉取速度时,你follower就是实时同步有什么用?

典型的出工不出力,消息只会越差越多,这种follower肯定是要被踢出ISR的。

当follower副本将leader副本的LEO之前的日志全部同步时,则认为该follower副本已经追赶上leader副本。

此时更新该副本的lastCaughtUpTimeMs标识。

Kafka的副本管理器(ReplicaManager)启动时会启动一个副本过期检测的定时任务,

会定时检查当前时间与副本的lastCaughtUpTimeMs差值是否大于参数replica.lag.time.max.ms指定的值

所以replica.lag.time.max.ms的正确理解是:

follower在过去的replica.lag.time.max.ms时间内,已经追赶上leader一次了。

follower到底出了什么问题?

两个方面,一个是Kafka自身的问题,另一个是外部原因

Kafka源码注释中说明了一般有两种情况会导致副本失效:

1、follower副本进程卡住,在一段时间内根本没有想leader副本发起同步请求,比如频繁的Full GC。

2、follower副本进程同步过慢,在一段时间内都无法追赶上leader副本,比如IO开销过大。

1、通过工具增加了副本因子,那么新增加的副本在赶上leader副本之前也都是处于失效状态的。

2、如果一个follower副本由于某些原因(比如宕机)而下线,之后又上线,在追赶上leader副本之前也是出于失效状态。

什么情况OSR中的replica会重新加入ISR?

基于上述,replica重新追上了leader,就会回到ISR中。

相关的重要概念

需要先明确几个概念:

1、LEO(last end offset):

当前replica存的最大的offset的下一个值

2、HW(high watermark):

小于 HW 值的offset所对应的消息被认为是“已提交”或“已备份”的消息,才对消费者可见。

假设ISR中目前有1个leader,3个follower。

1、leader接收一个消息,自己保存后,马上发送3个请求通知3个follower赶紧保存

2、等待3个follower响应保存成功

3、响应producer,消息提交成功

你是这么想的么?反正当时我是这么想的。

实际上不是的,这个同步是follower主动去请求leader进行同步的。

因为是每个follower情况不一样,所以才会出现LEO和HW的概念。

简言之,木桶原理

replica里存了多少数据和consumer能消费多少数据,不是一回事。

所谓木桶原理,就是把每个replica当作一个木桶的板子,桶能装多少水只取决于最短的那块板子。

这就是也有些人把HW叫成 高水位 的原因。

而 HW 的概念,也契合前文提到的【完全同步】,HW之前的所有消息,在ISR中是完全同步的。

写在最后的话

【推荐大家在看Kafka相关博客文章视频的时候,遇到任何问题不要纠结,赶紧翻书,Kafka相关的博客真的一言难尽】

就这块的知识点,大家请注意,你去看博客或者公众号或者培训机构的视频,介绍的五花八门, 含糊不清。

咱也不知道都是在哪学的.....笔者在Kafka官方文档中搜索关键字,并未搜索到,也可能是我的搜索方式不对,

总之那些又画线,又上色的,图整了不少,整的花里胡哨的,都TM不一样。

还俗称“高水位”,俩破单词不够你得瑟的了,你是不是觉得你讲的生动形象???

前提是知识点要准确啊,瞎JB比喻!

如果你把consumer可见消息比喻成水,HW比喻“水位”,

那么HW就是consumer可见的那个最大的offset,因为水位就是水面,水面也是水。

而如果不是,那我宁愿把HW比喻成船。紧贴水面的就是船,船永远在水面之上,水涨而船高。

很多图,都把replica化成了数组的模样,offset好似数组的index,

如果是这样,我宁愿把LEO比喻成 C语言字符串中的 "\0",就是标识位。

笔者猜测,LEO应该除了记录offset,还记录了一个像segment的index文件里的position一样。

指向最后一个消息有啥用,还不是要算一次偏移量,才能记录新消息。如果这个物理地址记录的是最后一个消息的后面的位置,那么新消息进来就能直接定位,直接写文件了。

【HW就是ISR中最小的LEO】有人也这么说的。有说HW <= LEO的,有说HW < LEO。爷吐了.....

随便截2篇博客,大家先尝尝。

我写的只是一个能说服我自己的概念知识点,对错我保证不了。

希望精通源码的大佬看到能在评论区解惑,不胜感激。

                                                                                                   

                                                                                                                            -------   路漫漫其修远兮,我求索NMLB。


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

相关文章

中断ISR技术架构

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

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

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

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

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

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

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

Linix(CentOS6.5)详细安装

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

Linix环境搭建及概述

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

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

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

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

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

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

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

Linu X

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

linx

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

Linux-

文章目录 基础知识Linux使用命令整理Linux系统下文件类型颜色表示含义 基础知识 Linux使用命令整理 zip 文件名——&#xff08;压缩命令&#xff09;将所有.jpg的文件压缩成一个zip包 &#xff0c;案例&#xff1a;zip all.zip &#xff1b;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、端口占用情况…

Linux目录结构与路径

目录 一、Linux目录结构 二、绝对路径与相对路径 一、Linux目录结构 Linux 系统中没有盘符的概念&#xff0c;所有的文件和目录都被组织成以一个根节点开始的倒置的树状结构&#xff0c; 文件系统的最顶层是由根目录开始的&#xff0c;系统使用 / 来表示根目录&#xff0c;呈…

Linux基础

Linix概述 unix 是多用户、多任务的操作系统&#xff0c;Linux是基于Unix的&#xff0c;Linux的版本分为两种&#xff1a;内核版本和发行版本&#xff1b;内核版本是指在 Linus领导下的内核小组开发维护的系统内核的版本号 Linux的远程访问&#xff1a;远程访问的软件:CRT lin…

0.1 什么是计算机

Redhat linux 红帽认证管理员(RHCSA,全称为Red Hat Certified System Administrator)属于红帽Linux的初级入门认证&#xff0c;要求学生能够熟练的执行linux命令&#xff0c;主要考察学生对红帽Linux系统基础管理与维护的能力&#xff0c;如添加用户、修改密码、添加硬盘分区、…

STM32中断向量表的位置,重定向

http://blog.csdn.net/u012722571/article/details/47295245 lanmanck原创】 这篇文章已经说了STM32的启动过程&#xff1a; http://blog.csdn.net/lanmanck/article/details/8252560 我们也知道怎么跳到main函数了&#xff0c;那么&#xff0c;中断发生后&#xff0c;又是…

DSP28335学习——中断向量表的初始化

在F28335有很多资源&#xff0c;同样也有很多外设&#xff0c;这些外设与相关资源都有可能发布新的任务让内核来判断与处理。F28335的中断源可分为片内外设中断源&#xff0c;如PWM、CAP、QEP、定时器等、片外中断源&#xff0c;外部中断输入引脚XINT1&#xff0c;XINT2引人的外…

IMX6ULL-IRQ中断之添加中断向量表

一. 中断向量表 中断向量表是存放中断向量的表。中断服务程序的入口地址或存放中 断服务程序的首地址成为中断向量&#xff0c;因此中断向量表是一系列中断服务程序入口地址组成的表。 当有中断事件发生时&#xff0c;处理器通过中断向量表进入相关的中断服务程序处理事件。 二…

BIOS 中断向量表

在bochs虚拟器调试中输入info ivt可以查看BIOS中断向量表 具体说明如下&#xff1a; 中断描述INT 00hCPU&#xff1a;除零错&#xff0c;或商不合法时触发INT 01hCPU&#xff1a;单步陷阱&#xff0c;TF标记为打开状态时&#xff0c;每条指令执行后触发INT 02hCPU&#xff1a;…