《Apache Kafka 实战》笔记 - 6.1.4 LEO和HW的更新机制

 

概念回顾

LEO:last end offset,日志末端偏移量,记录了该副本对象底层日志文件中下一条消息的位移值。举一个例子,若LEO=10,那么表示在该副本日志上已经保存了10条消息,位移范围是[0,9]。

HW:highwatermark,高水印值,任何一个副本对象的HW值一定不大于其LEO值,而小于或等于HW值的所有消息被认为是“已提交的”或“已备份的”。

HW指向的是实实在在的消息,而LEO总是指向下一条待写入消息,也就是说LEO指向的位置上是没有消息的,例如HW值是7,这表示前8条消息(位移从0计数)都已经处于“已备份状态”;而LEO值是12,则表示当前日志中写入了11条消息,而消息8、9、10、11尚未完全备份,即它们属于未提交消息。

follower更新LEO的机制

follower副本的LEO保存在2个地方:

(1)follower副本所在的broker缓存里
(2)leader所在broker的缓存里,也就是leader所在broker的缓存上保存了该分区所有副本的LEO

(1)的LEO何时更新呢?在follower发送FETCH请求后,leader将数据返回给follower,此时follower开始向底层log写数据,从而自动更新其LEO值,每当新写入一条消息,其LEO值就会加1。

(2)的LEO何时更新呢?发生在leader处理follower FETCH请求时。一旦leader接收到follower发送的FETCH请求,它首先会从自己的log中读取相应的数据,但是在给follower返回数据之前它先去更新follower的LEO。

leader更新LEO机制

leader的LEO就保存在其所在broker的缓存里,leader写log时就自动更新其LEO值。

follower更新HW的机制

follower更新HW发生在其更新LEO之后,一旦follower向log写完数据,它就会尝试更新HW值。具体算法就是比较当前LEO值与FETCH响应中leader的HW值,取两者的小者作为新的HW值。这告诉我们一个事实:如果follower的LEO值超过了leader的HW值,那么follower HW值是不会越过leader HW值的。

leader更新HW的机制

leader更新HW的时机:

  1. producer 向 leader 写消息时
  2. leader 处理 follower 的 fetch 请求时
  3. 某副本成为leader时
  4. broker 崩溃导致副本被踢出ISR时

leader更新HW的方式:
当尝试确定分区HW时,它会选出所有满足条件的副本,比较它们的LEO(当然也包括leader自己的LEO),并选择最小的LEO值作为HW值。

这里的满足条件主要是指副本要满足以下两个条件之一:

  1. 处于ISR中
  2. 副本LEO落后于leader LEO的时长不大于replica.lag.time.max.ms参数值(默认值是10秒)

猜你喜欢

转载自blog.csdn.net/u011250186/article/details/113260667