kafka 的 LEO 、LW 、HW

744 阅读2分钟

Log Start Offset

Log Start Offset 直译日志开始偏移量,它标识的是当前 Replication 中的消息的最小 Offset,代表着当前 Replication 中存储的最早消息

一般情况下,日志起始偏移量 logStartOffset 是等于第一个日志分段的 baseOffset,但这并不是绝对的,logStartOffset 的值可以通过 DeleteRecordsRequest 请求 (比如使用 KafkaAdminClientdeleteRecords () 方法、使用 kafka-delete-records.sh 脚本、日志的清理和截断等操作进行修改。

LogStartOffset 不可以缩写为LSO,因为在 Kafka 中,LSO 特指 LogStableOffset

Log End Offset (LEO)

什么是 LEO

Log End Offset (LEO) 直译日志结束偏移量,它标识的是当前 Replication下一条待写入的消息的 offset,代表着当前 Replication 的最新写入进度

Leader LEO

Leader ReplicationLEO

Follower LEO

Follower ReplicationLEO

Remote LEO

Leader Replication 除了要保存自己的 LEO 之外,还要保存集群中所有 Follower ReplicationLEO,用于了解集群中其他副本数据保存进度的情况,这些 Follower ReplicationLEOLeader Replication 称为 Remote LEO

为了跟 Remote LEO 对应,有些地方也称 Leader LEOLocal LEO

各 LEO 关系图

image.png

各 LEO 的更新时机

Leader LEO 的更新时机 : Leader Replication 收到消息并落盘后更新

Follower LEO 的更新时机 : Follower Replication 拉取到 Leader Replication 中的数据并保存到 xxx.log 文件中

Remote LEO 的更新时机 : Follower Replication 拉取 Leader Replication 的数据时,会将它最新的 LEO 带过来,这个时候更新

Low Watermark(LW)

低水位线 Low Watermark(LW),指的是 Assigned Replication(AR) 集合中最小的 Log Start Offset ,它代表该分区中能被消费到的最早消息

Low Watermark(LW) 的上升

副本的拉取请求(FetchRequest),可能会触发新建日志分段,而导致旧的的被清理,进而导致 Log Start Offset 的增加。当所有副本的 Log Start Offset 都增加了,低水位线也随之升高。

同理删除请求DeleteRecordRequest 也会导致 Log Start Offset 的增加,进而导致 Low Watermark(LW) 的升高

High Watermark(HW)

高水位线 High Watermark(HW),指的是 in-sync Replica(ISR) 集合中同步程度最落后的副本Log End Offset (LEO) 值,它代表该分区中能被消费到的最大消息

High Watermark(HW) 的上升

in-sync Replica(ISR) 集合中,所有最小 LEO 的副本被移出集合时,High Watermark(LW) 会上升

image.png

如图,刚开始 in-sync Replica(ISR) 集合中的最小 LEO 为 2,随着 LEO 为 2 的这台 Follower Replication 的宕机,in-sync Replica(ISR) 集合中的最小 LEO 变为 3,High Watermark(LW) 随着升高

跟常见的情况是,随着 in-sync Replica(ISR) 集合中 Follower ReplicationLeader Replication 的数据同步,High Watermark(HW) 会上升

当有 out-sync Replica(OSR) 集合中的某个 Follower ReplicationLEO 大于等于该分区的 High Watermark(LW) 时,会被加入到 in-sync Replica(ISR) 集合中,也就是说 High Watermark(LW) 只会上升,不会下降

Offset、副本集、水位线之间的关系图

image.png