kafka-04数据同步原理ISR、ACK、LEO、HW

article/2025/9/13 17:58:31

1. 分区策略

  1. 分区的原因
    (1)方便在集群中扩展,每个 Partition 可以通过调整以适应它所在的机器,而一个 topic
    又可以有多个 Partition 组成,因此整个集群就可以适应任意大小的数据了;
    (2)可以提高并发,因为可以以 Partition 为单位读写了。
  2. 分区的原则
    我们需要将 producer 发送的数据封装成一个 ProducerRecord 对象。
    在这里插入图片描述

2.数据的可靠性

为保证 producer 发送的数据,能可靠的发送到指定的 topic,topic 的每个 partition 收到 producer 发送的数据后,都需要向 producer 发送 ack(acknowledgement 确认收到),如果 producer 收到 ack,就会进行下一轮的发送,否则重新发送数据。
在这里插入图片描述
副本数据同步机制

方案优点缺点
半数以上完成同步延迟第选举新的leader时,容忍n台节点故障,需要2n+1个副本
全部完成同步才发送选举新的leader时,容忍n台节点故障,需要n+1个副本延迟高

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

  • 同样为了容忍 n 台节点的故障,第一种方案需要 2n+1 个副本,而第二种方案只需要 n+1 个副本,而 Kafka 的每个分区都有大量的数据,第一种方案会造成大量数据的冗余。
  • 虽然第二种方案的网络延迟会比较高,但网络延迟对 Kafka 的影响较小。
概念:
AR(Assigned Repllicas)一个partition的所有副本(就是replica,不区分leader或follower)
ISR(In-Sync Replicas)能够和 leader 保持同步的 follower + leader本身 组成的集合。
OSR(Out-Sync Relipcas)不能和 leader 保持同步的 follower 集合
公式:AR = ISR + OSR

Kafka对外依然可以声称是完全同步,但是承诺是对AR中的所有replica完全同步了吗?
并没有。Kafka只保证对ISR集合中的所有副本保证完全同步。
至于,ISR到底有多少个follower,那不知道,别问,问就是完全同步,你再问就多了。
这就好比网购买一送一,结果邮来了一大一小两个产品。
你可能觉得有问题,其实是没问题的,商家说送的那个是一模一样的了吗?并没有。
ISR就是这个道理,Kafka是一定会保证leader接收到的消息完全同步给ISR中的所有副本。
而最坏的情况下,ISR中只剩leader自己。

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

ISR 的核心就是:动态调整

K a f k a 采 用 的 就 是 一 种 完 全 同 步 的 方 案 , 而 I S R 是 基 于 完 全 同 步 的 一 种 优 化 机 制 。 Kafka采用的就是一种完全同步的方案,而ISR是基于完全同步的一种优化机制。 KafkaISR

1、 Leader选举(选取ISR表中follower 速度慢)

ISR(in-sync replicas)列表。每个分区的 leader 会维护一个 ISR 列表,ISR 列表里面就是 follower 副本的 Borker 编号,只有“跟得上” Leader 的 follower 副本才能加入到 ISR 里面,这个是通过 replica.lag.time.max.ms 参数配置的。只有 ISR 里的成员才有被选为 leader 的可能

当 Leader 挂掉了,而且 unclean.leader.election.enable=false 的情况下,Kafka 会从 ISR 列表中选择第一个 follower 作为新的 Leader,因为这个分区拥有最新的已经 committed 的消息。通过这个可以保证已经 committed 的消息的数据可靠性。

因此,为了保证数据的可靠性,需要配置一下几个参数:

producer 级别:acks=all(或者 request.required.acks=-1),同时发生模式为同步producer.type=sync topic 级别:设置 replication.factor>=3,并且min.insync.replicas>=2;
broker 级别:关闭不完全的 Leader 选举,即 unclean.leader.election.enable=false;

即 ack机制设置为所有follower均收到消息才响应;(producer)发生模式设置为同步; 副本数设置大于等于3,最小同步数设置为2;关闭不完全的Leader选举。

总结
leader会维持一个与其保持同步的replica集合,该集合就是ISR,每一个leader partition都有一个ISR,leader动态维护, 要保证kafka不丢失message,就要保证ISR这组集合存活(至少有一个存活),并且消息commit成功,Partition leader 保持同步的 Partition Follower 集合, 当 ISR 中的Partition Follower ,完成数据的同步之后,就会给 leader 发送 ack 如果Partition follower长时间(replica.lag.time.max.ms) 未向leader同步数据,则该Partition Follower将被踢出ISR,Partition Leader 发生故障之后,就会从 ISR 中选举新的 Partition Leader。当replica重新追上了leader,OSR中的replica就会重新加入ISR中。
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副本之前也是出于失效状态。

2、Producer 往 Broker 发送消息

ack应答机制:Kafka 在 Producer 里面提供了消息确认机制。也就是说我们可以通过配置来决定有几个副本收到这条消息才算消息发送成功。

对于某些不太重要的数据,对数据的可靠性要求不是很高,能够容忍数据的少量丢失,
所以没必要等 ISR 中的 follower 全部接收成功。

Kafka 为用户提供了三种可靠性级别,用户根据对可靠性和延迟的要求进行权衡, 选择以下的配置。(在 0.8.2.X 版本之前是通过request.required.acks 参数设置的。

ack参数配置:

  1. acks=0:producer不会等待任何来自服务器(broker)的响应(ack)。 这一操作提供了一个最低的延迟,broker一接收到还没有写入磁盘就已经返回,当broker故障时有可能丢数据。

  2. acks=1(默认值):producer 等待brokerd的ack,partition的leader落盘成功后返回ack,如果在follower同步成功之前leader故障,那么将会丢失数据。

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

Producer 发送消息还可以选择同步(默认,通过 producer.type=sync 配置) 或者异步(producer.type=async)模式。如果设置成异步,虽然会极大的提高消息发送的性能,但是这样会增加丢失数据的风险。如果需要确保消息的可靠性,必须将 producer.type 设置为 sync。

3、Topic 分区副本 (数据的冗余备份)

在 Kafka 0.8.0 之前,Kafka 是没有副本的概念的,那时候人们只会用 Kafka 存储一些不重要的数据,因为没有副本,数据很可能会丢失。为了保证数据的可靠性,Kafka 从 0.8.0 版本开始引入了分区副本。

每个分区可以人为的配置几个副本(比如创建主题的时候指定 replication-factor,也可以在 Broker 级别进行配置 default.replication.factor),一般会设置为3。

Kafka 可以保证单个分区里的事件是有序的,分区可以在线(可用),也可以离线(不可用)。在众多的分区副本里面有一个副本是 Leader,其余的副本是 follower,所有的读写操作都是经过 Leader 进行的,同时 follower 会定期地去 leader 上复制数据。当 Leader 挂掉之后,其中一个 follower 会重新成为新的 Leader。通过分区副本,引入了数据冗余,同时也提供了 Kafka 的数据可靠性。


http://chatgpt.dhexx.cn/article/5qojdCM7.shtml

相关文章

Cisco ISR4221 路由器密码重置方法

【Cisco路由器重置】Cisco ISR4221 路由器密码重置方法 使用usb-console线连接路由器,使用secureCRT连接 记得使用串口serial模式,Port如果没有自动识别,可能是你没有安装FT232R USB UART驱动。教程:https://www.cnblogs.com/iBo…

KafKa - 分区副本ISR选举机制

一、KafKa分区副本ISR选举机制 kafka 中每一个主题又进一步划分成若干个分区。副本的概念实际上是在分区层级下定义的,每个分区配置有多若干个副本。 所谓的副本,本质上就是一个只能追加写消息的提交日志,根据kafka副本机制的定义&#xff…

Kafka 设计原理——副本与ISR设计

目录 副本与ISR设计Follower副本同步ISR设计 副本与ISR设计 一个Kafka分区本质就是一个备份日志,即利用多份相同的备份共同提供冗余机制来保持系统高可用性。 这些备份在Kafka中被称为副本(replica)。Kafka把分区的所有副本均匀地分配到所有broker上。 并从这些副本…

ISR吞吐性能问题

ISR大致可以分几类: Cisco 860、880、890 ISR1800 (fixed)、1800 (modular)、2800、3800 Series ISR1900、2900、3800、3900 Series ISR4K 每一代的设备,设备的性能肯定都不一样,本摘要,将主要记录ISR的吞吐性能问题。 1、下图主要…

生产故障|Kafka ISR频繁伸缩缩引发性能急剧下降原因分析

本文是笔者双十一系列第二弹,源于一个双十一期间一个让笔者猝不及防的生产故障,本文将详细剖析Kafka的副本机制,以及ISR频繁变更(扩张与伸缩)为什么会导致集群不可用。 1、Kafka副本机制 Kafka数据组织方式是topic-parition的结构&#xff…

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

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

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…