基本概念

20220412231218.png

  • Log Start Offset:是起始位移,该副本中第一条消息的offset,如图所示,这里的起始位移是0,如果一个日志文件写满1G后(默认1G后会log rolling),这个起始位移就不是从0开始了。
    • log rolling:==是啥?==
  • HW(high watermark):俗称高水位,它标识了一个特定的消息偏移量(offset),消费者只能拉取到这个 offset 之前的消息。。
    • 如图所示,HW的值为6,代表offset为 [0,5] 的6条消息都可以被消费到,他们是对消费者可见的,而 [6,8] 这3条消息由于未提交,对消费者是不可见的。
  • LEO(log end offset):标识当前日志文件中下一条待写入的消息的 offset。上图中 offset 为 9 的位置即为当前日志文件的 LEO,LEO 的大小相当于当前日志分区中最后一条消息的 offset 值加 1。
    • 分区 ISR 集合中的每个副本都会维护自身的 LEO ,而 ISR 集合中最小的 LEO 即为分区的 HW,对消费者而言只能消费 HW 之前的消息。
    • Follower副本每次从Leader副本同步数据之后会更新分区的HW。

Follower故障处理

1、Follower发生故障后会被临时踢出ISR

2、这个期间Leader和其他Follower继续接收数据

3、待改Follower恢复后,Follower会读取本地磁盘记录的上次的HW,并将log文件中大于等于HW的部分截取抛弃掉,从HW开始从Leader同步数据。

4、等改==Follower的LEO大于等于该分区的HW时==,即Follower追上Leader之后,可以重新加入ISR了。

Leader故障处理

20220412232800.png

1、Leader发生故障之后,会从ISR中选出一个新的Leader

2、为保证多个副本之间的数据一致性,其余的Follower会先将各自的log文件高于分区HW的部分截掉,然后从新的Leader同步数据。

==注意==:这只能保证副本之间的数据一致性,并不能保证数据不丢失或者不重复。

  • ==不丢失==:由于之前offset 为 5,6,7的数据还没有消费,Follower还没有同步,Leader就挂掉了,导致这部分数据就丢失了。

参考