多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# Kafka 高水位和 Leader Epoch 机制 * 高水位(High Watermark) * Leader Epoch:Kafka V0.11 推出 ## 高水位 * 水位 * 用于流式处理领域 * 经典定义:在时刻 T,任意创建时间(Event Time)为T‘,且 T‘ <= T 的所有事件都到达或被观测到,那么 T 被定义为水位 * Streaming System 定义:水位是一个单调增加且表征最早未完成工作(oldest work not yet completed)的时间戳 ![](https://img.kancloud.cn/fb/2c/fb2c9e883b78c5d10b09b4a9773b8c13_1950x624.png) * Completed:已完成工作 * In-Flight:正在进行中的工作 * 两者边界就是水位线 Kafka 中水位概念不同 * Kafka 的水位不是时间戳,与时间无关,其和位置信息绑定 * i.e. 用消息位移表征水位 * Kafka 中的表述为`高水位` * Kafka 中也有低水位(Low Watermark):与 Kafka 删除消息相关联的概念 ## 高水位的作用 * 定义消息可见性,即用来标识分区下的哪些消息是可以被消费者消费的 * 帮助 Kafka 完成副本同步 ![](https://img.kancloud.cn/c2/24/c2243d5887f0ca7a20a524914b85a8dd_1704x618.png) * 上图:某个 Partition Leader 副本的高水位图 * 分区高水位以下的消息:已提交消息;反之:未提交消息 * 消费者只能消费已提交消息 * Kafka 事务机制会影响消费者看到的消息范围 * 依赖高水位判断 * 依赖 LSO(Log Stable Offset)的 offset 判断事务型消费者的可见性 * offset 等于高水位的消息也属于未提交消息,i.e. 高水位上的消息是不能被消费者消费的 * LEO(Log End Offset):日志末端位移 * 副本写入下一条消息的 offset * 数字 15 所在的方框是虚线,i.e. 这个副本当前只有 15 条消息(0-14),下一条新消息的 offset 是 15 * 介于高水位和 LEO 之间的消息属于未提交消息 * 同一个副本对象,其高水位值不会大于 LEO 值 * 高水位和 LEO 是副本对象的两个重要属性 * 分区的高水位就是其 Leader 副本的高水位 ## 高水位更新机制