一。基本概念
LEO和HW
每个分区副本对象都有两个重要的属性:LEO和HW。
LEO:即日志末端位移(log end offset),记录了该副本日志中下一条消息的位移值。如果
LEO=10,那么表示该副本保存了10条消息,位移值范围是[0, 9]。另外,Leader LEO和
Follower LEO的更新是有区别的。
HW:即上面提到的水位值。对于同一个副本对象而言,其HW值不会大于LEO值。小于等于
HW值的所有消息都被认为是“已备份”的(replicated)。Leader副本和Follower副本的HW更
新不同。
Follower副本不停地向Leader副本所在的broker发送FETCH请求,一旦获取消息后写入自己的日志中进行备份。
二。LEO和HW的更新
Leader写Log时自动更新自己的LEO值
Kafka有两套Follower副本LEO:
- 一套LEO保存在Follower副本所在Broker的副本管理机中,帮助Follower副本更新其HW值;
- 另一套LEO保存在Leader副本所在Broker的副本管理机中。Leader副本机器上保存了所有的follower副本的LEO,帮助Leader副本更新其HW
LEO更新时间:
1.Follower副本的本地LEO何时更新?
Follower副本的LEO值就是日志的LEO值,每当新写入一条消息,LEO值就会被更新。当
Follower发送FETCH请求后,Leader将数据返回给Follower,此时Follower开始Log写数据,从而自动更新LEO值。
2.Leader端Follower的LEO何时更新?
Leader端的Follower的LEO更新发生在Leader在处理Follower FETCH请求时。一旦Leader接收到Follower发送的FETCH请求,它先从Log中读取相应的数据,给Follower返回数据前,先更新Follower的LEO。
HW更新:
Follower更新HW发生在其更新LEO之后,一旦Follower向Log写完数据,尝试更新自己的HW值。比较当前LEO值与FETCH响应中Leader的HW值,取两者的小者作为新的HW值。
Leader broker上保存了一套Follower副本的LEO以及自己的LEO。
当尝试确定分区HW时,它会选出所有满足条件的副本,比较它们的LEO(包括Leader的LEO),并选择最小的LEO值作为HW值。