每个kafka副本对象都持有2个重要的属性:日志末端位移LEO,高水印HW
Kafka对leader副本和follower副本的LEO更新机制是不同的,后面我们会详细讨论。
Kafka对leader副本和follower副本的hw值更新机制也是不同的。
消费者无法消费分区leader副本上那些位移大于分区hw的消息。分区hw就是leader副本的hw值。
关于LEO
2套follower副本LEO属性:一套LEO值保存在follower副本所在broker的缓存上;另一套LEO值保存在leader副本所在的broker的缓存上。
follwer副本的LEO:每写一条消息就+1
leader上的副本LEO:收到FETCH请求之后,先从自己的log中读取相应的数据,但是在给follower返回数据之前它先去更新follower的LEO
关于HW(时机+算法)
follower更新hw:follower更新hw发生在其更新LEO之后,一旦follower向log写完数据,它就会尝试更新HW值,具体的算法就是比较当前LEO值与FETCH响应中leader的HW值,取两者的小者作为新的HW值。
leader更新hw的时机:
1.副本成为leader时
2.broker出现崩溃导致副本被踢出ISR时
3.producer向leader副本写入消息时
4.leader处理followerFETCH请求时:首先会从底层的log读取数据,之后再尝试更新分区HW值。
如何更新:
当确定分区hw时,它会选出所有满足条件的副本,比较他们的LEO,并选择最小的LEO值作为HW值,这里的满足条件主要是指副本满足一下两个条件之一:
1.出于ISR中
2.副本LEO落后于leaderLEO的时长不大于replica.lag.time.max.ms参数值(默认时10秒)
原文地址:https://www.cnblogs.com/lccsblog/p/11219108.html