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

kafka--基础知识点--6.1--LEO、HW、LW

在 Apache Kafka 中,LEO(Log End Offset)HW(High Watermark)、和 LW(Low Watermark) 是副本机制和日志管理中的核心概念,共同确保数据一致性、可见性和存储效率。以下是它们的详细解释及关系:

1. LEO(Log End Offset,日志末端偏移量)

  • 定义
    表示当前日志文件中下一条待写入消息的偏移量。每个副本(Leader 或 Follower)都有自己的 LEO,用于跟踪自身的写入进度。
  • 特点
    • 动态增长:新消息写入时,LEO 会递增。
    • 副本独立:Leader 和 Follower 的 LEO 可能不同,Follower 的 LEO 表示已从 Leader 同步到的位置。
  • 示例
    若副本中最大消息的偏移量为 6,则 LEO 为 7(下一个写入位置)。

2. HW(High Watermark,高水位)

  • 定义
    分区中已成功复制到所有 ISR(In-Sync Replicas)副本的最后一条消息的偏移量 +1。取 ISR 中所有副本 LEO 的最小值。
  • 作用
    • 消息可见性:消费者只能读取 HW 之前的消息,HW 之后的消息对消费者不可见。
    • 数据一致性:确保消费者读取的消息已持久化到所有 ISR 副本,避免数据丢失。
  • 更新机制
    • Leader 更新:Leader 根据所有 Follower 的 LEO 动态更新 HW,公式为 HW = min(Leader_LEO, Follower1_LEO, Follower2_LEO, ...)
    • Follower 更新:Follower 从 Leader 获取最新 HW,并取自身 LEO 与 Leader HW 的较小值作为自己的 HW。
  • 示例
    若 ISR 的 LEO 分别为 10、9、8,则 HW = 8。消费者只能读取偏移量 0-7 的消息。

3. LW(Low Watermark,低水位)

  • 定义
    AR(Assigned Replicas)集合中最小的 logStartOffset 值。logStartOffset 是日志文件的起始偏移量,可通过日志清理策略调整。
  • 作用
    • 日志清理:标记最早还能被 Kafka 保留的偏移量,LW 以下的数据会被自动清理,防止日志无限增长。
    • 存储优化:通过配置日志保留策略(如按时间或大小),Kafka 自动删除 LW 之前的旧数据。
  • 示例
    若 LW = 1000,则偏移量小于 1000 的消息会被清理,消费者无法读取。

4. 关系与对比

概念层级作用更新频率与消费者关系
LEO副本级跟踪副本写入进度,决定新消息写入位置消费者不可见,仅用于内部同步
HW分区级定义消费者可见的消息范围,确保数据一致性消费者只能读取 HW 之前的消息
LW分区级标记日志清理边界,优化存储空间消费者无法读取 LW 之前的数据

典型场景与配置

  1. 消息写入与同步

    • 生产者发送消息到 Leader,Leader 更新 LEO。
    • Follower 同步消息后更新 LEO,并反馈给 Leader。
    • Leader 根据所有 Follower 的 LEO 更新 HW,确保消息对消费者可见。
  2. Leader 故障切换

    • 新 Leader 被选举后,会截断日志到 HW,确保不包含未提交的消息。
    • Follower 从新 Leader 的 HW 位置开始同步,恢复 ISR 状态。
  3. 日志清理与存储

    • 配置 log.retention.hourslog.retention.bytes 定义日志保留策略。
    • Kafka 自动清理 LW 之前的旧数据,释放存储空间。

参数调优建议

  • 可靠性优先
    • 设置 acks=allmin.insync.replicas=2,确保消息写入所有 ISR 副本。
    • 缩短 replica.lag.time.max.ms(默认 30 秒),快速检测落后副本。
  • 性能优先
    • 设置 acks=1,仅需 Leader 确认,提高吞吐量。
    • 增大 log.retention.byteslog.retention.hours,减少日志清理频率。
http://www.dtcms.com/a/287236.html

相关文章:

  • Validation - Spring Boot项目中参数检验的利器
  • web.m3u8流媒体视频处理
  • Flutter基础(前端教程①③-单例)
  • 定时器与间歇函数
  • Web3.0与元宇宙:区块链驱动的数字新生态解析
  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - snowNLP库实现中文情感分析
  • 如何增强LLM(大语言模型)的“置信度”和“自信心” :LLM的“自信”不是“什么都能答”,而是“该答的答得准,不该答的敢说不”。
  • 【unity游戏开发入门到精通——3D篇】3D光源之——unity使用Lens Flare (SRP) 组件实现太阳耀斑镜头光晕效果
  • 《Origin画百图》之多分类矩阵散点图
  • 2025最新版 Go语言Goland 专业安装及配置(超详细)
  • 华为仓颉编程语言语法简介与示例
  • 从0开始学习R语言--Day51--PH检验
  • 操作系统-分布式同步
  • 【REACT18.x】creat-react-app在添加eslint时报错Environment key “jest/globals“ is unknown
  • Spring AI 项目实战(十九):Spring Boot + AI + Vue3 + OSS + DashScope 构建多模态视觉理解平台(附完整源码)
  • 在 .NET Core 中创建 Web Socket API
  • Redis 如何保证高并发与高可用
  • Elasticsearch 重命名索引
  • OllyDbg技巧学习
  • Go-Redis × 向量检索实战用 HNSW 在 Redis 中索引与查询文本 Embedding(Hash JSON 双版本)
  • 子线程不能直接 new Handler(),而主线程可以
  • LLM大模型微调技术与最佳实践
  • C语言:20250719笔记
  • 目标检测中的标签分配算法总结
  • 【OD机试】停车场收费
  • OpenCV特征点提取算法orb、surf、sift对比
  • Netty网络聊天室及扩展序列化算法
  • 2025年睿抗机器人开发者大赛CAIP-编程技能赛(省赛)-RoboCom 世界机器人开发者大赛-本科组
  • 微软原版系统下载的几个好用网站
  • LVS——nat模式