当前位置: 首页 > 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.lryc.cn/news/593598.html

相关文章:

  • LeetCode Hot100【7. 整数反转】
  • 创意 C++ 文本冒险战斗游戏代码
  • Uniapp之自定义图片预览
  • 下一场范式革命:Transformer架构≠最终解法
  • Spring IOC容器在Web环境中是如何启动的(源码级剖析)?
  • Java多线程进阶
  • Node.js net.Socket.destroy()深入解析
  • [spring6: AspectMetadata AspectInstanceFactory]-源码解析
  • 零基础学习性能测试第二章-监控体系
  • OllyDbg技巧学习
  • Redis 如何保证高并发与高可用
  • Python爬虫实战:研究pefile库相关技术
  • PCB 混合介质叠层:材料特性匹配与性能提升的技术解析
  • 1. Spring AI概述
  • OSPF高级特性之Overflow
  • 【c++】提升用户体验:问答系统的交互优化实践——关于我用AI编写了一个聊天机器人……(12)
  • Buildroot vs Yocto:SDK 构建机制的核心差异与实践案例
  • 多线程 示例
  • QT窗口(8)-QFileDiag
  • esp32 sd卡
  • Kubernetes常用命令总结
  • MySQL 深度性能优化配置实战指南
  • 单例模式的设计与实现
  • Salesforce 与外部系统实时集成:基于事件驱动的异步集成架构
  • ChatGPT Agent深度解析:告别单纯问答,一个指令搞定复杂任务?
  • (LeetCode 面试经典 150 题) 49. 字母异位词分组 (哈希表)
  • 软件工程:可行性分析的任务及报告
  • picoCTF 2024: [[NoSQL]] Injection - Writeup
  • JAVA中的Collections 类
  • 【数据结构】二叉树初阶详解(一):树与二叉树基础 + 堆结构全解析