kafka数据一致性(HW只能保证副本之间的数据一致性,并不能保证数据不丢失ack或者不重复。)

  数据一致性问题:消费一致性和存储一致性

例如:一个leader 写入 10条数据,2个follower(都在ISR中),F1、F2都有可能被选为Leader,例如选F2 .后面Leader又活了。可能造成每个副本数据不一致

F1   8条

F2   9条 

LEO:每个副本的最后一个offset。例如 F1的LEO为8, F2的LEO为9

HW(High Watermark):所有副本中最小的LEO。

LEO:指的是每个副本最大的 offset;

HW:指的是消费者能见到的最大的 offset,ISR 队列中最小的 LEO。

   为啥要引入HW?

假设没有HW,消费者消费leader到19,下面消费者应该消费20。

此时leader挂掉。选下面某个follower为leader,此时消费者找新leader消费数据,发现新Leader没有20数据,报错。

1、如果leader故障

  leader 发生故障之后,会从 ISR 中选出一个新的 leader。之后,为保证多个副本之间的

数据一致性(各个副本存储一致性),其余的 follower 会先将各自的 log 文件高于 HW 的部分截掉,然后从新的 leader 同步数据。

假设图中follower2被选为leader,那么其余follower都截取到HW,leader不截取。并让其余follower同步新leader。

2、follower 故障

  follower 发生故障后会被临时踢出 ISR,待该 follower 恢复后,follower 会读取本地磁盘 记录的上次的 HW,并将 log 文件高于 HW 的部分截取掉,从 HW 开始向 leader 进行同步。

   等该 follower 的 LEO 大于等于该 Partition 的 HW,即 follower 追上 leader 之后,就可以重 新加入 ISR 了。

原文地址:https://www.cnblogs.com/wsw-seu/p/13423847.html