当前位置: 首页 > news >正文

Kafka的ISR、OSR、AR详解

Kafka中的ISR、OSR和AR是副本管理机制的核心概念,它们共同保障了Kafka的高可用性和数据一致性。下面我将详细解释这些概念及其相互关系。

1. 基本概念

1.1 AR (Assigned Replicas) - 分配副本

定义:一个分区的所有副本集合称为AR,即Kafka为主题分区分配的所有副本。

特点

  • 包含该分区的所有副本(Leader和Follower)
  • AR = ISR + OSR
  • 由Kafka控制器(Controller)负责管理分配

1.2 ISR (In-Sync Replicas) - 同步副本

定义:与Leader副本保持同步的副本集合(包括Leader自己)。

特点

  • 实时与Leader保持数据同步
  • 只有ISR中的副本才有资格被选举为Leader
  • 生产者消息需要被ISR中所有副本确认才算提交成功(取决于acks配置)

1.3 OSR (Out-of-Sync Replicas) - 非同步副本

定义:与Leader副本同步滞后过多的副本集合。

特点

  • 未能及时跟上Leader的同步进度
  • 不在ISR集合中
  • 当OSR副本重新追上Leader进度后,可以重新加入ISR

2. 工作机制详解

2.1 副本状态转换

[新副本] → [ISR] ↔ [OSR]
  • 新创建的副本初始加入ISR
  • 当副本滞后超过replica.lag.time.max.ms(默认30秒)时,从ISR移到OSR
  • 当OSR副本追上Leader进度后,重新加入ISR

2.2 同步判定标准

副本是否保持同步由以下参数控制:

  1. replica.lag.time.max.ms (默认30000ms)

    • Follower副本在此时间内未向Leader发送FETCH请求
    • 或在此时间内未追上Leader的最新offset
  2. replica.lag.max.messages (已弃用)

    • 旧版本用于判断消息滞后条数
    • 新版本已移除该配置

2.3 Leader选举

当分区Leader失效时:

  1. 只能从ISR集合中选举新Leader
  2. 如果ISR为空,根据unclean.leader.election.enable配置决定:
    • false(默认):不允许选举,分区不可用
    • true:可以从OSR中选举(可能丢失数据)

3. 配置参数

参数默认值说明
default.replication.factor1新建主题的默认副本数
min.insync.replicas1最小同步副本数(影响生产者acks=all时的可用性)
replica.lag.time.max.ms30000副本滞后时间阈值
unclean.leader.election.enablefalse是否允许从非同步副本选举Leader

4. 数据一致性保障

Kafka通过ISR机制实现不同级别的一致性:

  1. acks=0:不等待确认,可能丢失数据
  2. acks=1:仅等待Leader确认(默认)
  3. acks=all:等待ISR中所有副本确认

生产环境推荐配置:

min.insync.replicas=2
acks=all

这样即使一个副本失效,仍能保证数据安全。

5. 监控与管理

5.1 查看副本状态

使用kafka-topics命令:

bin/kafka-topics.sh --describe --bootstrap-server localhost:9092 --topic test

输出示例:

Topic: test Partition: 0 Leader: 1 Replicas: 1,2,3 Isr: 1,2
  • Replicas: AR列表(1,2,3)
  • Isr: 同步副本列表(1,2)
  • OSR = AR - ISR = 3

5.2 重要监控指标

  1. UnderReplicatedPartitions:非充分复制分区数(ISR < AR)
  2. IsrShrinksPerSec:ISR收缩次数(副本离开ISR)
  3. IsrExpandsPerSec:ISR扩展次数(副本加入ISR)

6. 生产环境建议

  1. 设置replication.factor≥3,保证高可用
  2. 设置min.insync.replicas=2,平衡可用性与一致性
  3. 监控ISR变化,异常时及时报警
  4. 避免频繁的Leader切换(配置合理的replica.lag.time.max.ms
  5. 保持unclean.leader.election.enable=false,防止数据丢失

7. 故障场景分析

场景1:Follower副本同步慢

  • 现象:某个Follower持续在OSR中
  • 可能原因:
    • 磁盘I/O瓶颈
    • 网络延迟
    • 机器负载过高
  • 解决方案:
    • 检查副本节点硬件状态
    • 优化Kafka JVM配置
    • 考虑替换问题节点

场景2:ISR频繁收缩/扩展

  • 现象:IsrShrinks/IsrExpands指标频繁变化
  • 可能原因:
    • replica.lag.time.max.ms设置过小
    • 网络不稳定
  • 解决方案:
    • 适当增大replica.lag.time.max.ms
    • 检查网络状况

通过合理配置和监控ISR机制,可以确保Kafka集群在保证数据一致性的同时,维持高可用性。

http://www.xdnf.cn/news/1320769.html

相关文章:

  • 特赞内容运营解决方案,AI重构品牌内容价值链
  • 普通用户使用docker命令
  • 信创产业:从技术突围到生态重构的强国之路
  • 华曦达港股IPO观察丨以创新研发为笔,构建AI Home智慧生活新蓝图
  • Apache IoTDB集群部署实战:1C2D架构的高性能时序数据库搭建与优化指南
  • 静配中心配药智能化:基于高并发架构的Go语言实现
  • 十年回望:Vue 与 React 的设计哲学、演进轨迹与生态博弈
  • fit函数
  • Topaz Gigapixel AI:图片无损放大,细节增强的利器
  • LeetCode100 -- Day1
  • 【Linux指南】gcc/g++编译器:从源码到可执行文件的全流程解析
  • leetcode面试笔试-双指针题型总结
  • linux下查看 UDP Server 端口的启用情况
  • Redis 客户端接口介绍
  • Redis——基础篇
  • 【redis、ruoyi-vue】基于ruoyi-vue实现数据redis的增删改查
  • Java面试宝典:Redis高级特性和应用(发布 订阅、Stream)
  • [python学习记录1]python简介
  • 最小路径和
  • 在职老D渗透日记day19:sqli-labs靶场通关(第26a关)get布尔盲注 过滤or和and基础上又过滤了空格和注释符 ‘)闭合
  • 线程(基本概念和相关命令)
  • LeetCode热题100--104. 二叉树的最大深度--简单
  • Rust:实现仅通过索引(序数)导出 DLL 函数的功能
  • STM32单片机学习日记
  • 网络常识-SSE对比Websocket
  • 记一次安装OpenStack(Stein)-nova报错问题解决
  • 数据赋能(396)——大数据——抽象原则
  • 智能汽车领域研发,复用云原生开发范式?
  • 48.Seata认识、部署TC服务、微服务集成
  • http工作流程