HW
HW (High Watermark)
俗称高水位,它标识了一个特定的消息偏移量(offset
),消费者只能拉取到这个offset
之前的消息。
LEO
LEO (Log End Offset)
,标识当前日志文件中下一条待写入的消息
的offset
。上图中offset
为9的位置即为当前日志文件的 LEO
,LEO 的大小相当于当前日志分区中最后一条消息的offset
值加1
.分区 ISR 集合
中的每个副本都会维护自身的 LEO
,而 ISR
集合中最小的 LEO
即为分区的 HW
,对消费者而言只能消费 HW
之前的消息。
例子
比如有个日志文件,有1个leader,2个follwer, 如下图,假设此时HW
和LEO
都是3, 然后接下来生产者产生了新消息3和4
消息首先写入leader副本,之后写入follwer副本,
由于各种原因,follower拉取数据的速度是不同的,如下图,第一个副本LEO为5,而第二个副本LEO为4,那么当前分区的HW
取最小值4,此时消费者可以消费到offset0至3之间的消息
当H第二个副本同步完成后,此时LEO
和HW
都是5 ,因此消费者可以消费到offset
为4的消息了。
总结
HW
和LEO
实际都是一个offset
值LEO
是日志文件待写入的下一条消息的offset
Kafka
消费者只能消费HW
这个offset
之前的消息