如上图,为正常情况
leader 节点:kafka191
follower 节点:kafka192,kafka193
(1)follower 从 leader 备份数据,可以看到 高水位线 HW 在数据 C ,offset 值为 3 的位置
(2)由于 ISR 列表检测周期是30秒检测一次,在30s内的 ISR 的所有副本的 LEO 可能不一致,此时 leader 挂掉,数据可能会丢失。
(3)当 leader 挂掉时,所有的follower副本中 LEO 大的优先成为 leader,剩余的副本跟随新的leader,如图中情况,也就是 kafka192 节点成为新的 leader。
图中可以看到,191节点在写入到数据E 的时候发生故障,192、193节点还没来得及同步,此时 192 当选新的 leader,而生产者还在持续写入数据,因为数据E 已经写入到 91 节点,则生产者不会再将数据 E 写入到 192 节点,会直接从数据 G 开始持续写入,H、I,这时 数据 E 就已经丢失了。
因为当旧的 leader 重启加入 kafka 集群时,会将上一次的 HW 后的所有 offset 数据全部清空,并跟随新的 leader 同步数据,这个过程可能会导致数据的丢失。
所以当 191 节点故障恢复重新起来后,会直接将故障之前 (HM) 高水位线之后的所有数据删除(也就是数据 C,offset 值为3 后面的数据删除,也就是将数据D、E 删除),如下图
然后重新从 leader 中同步数据,请看下图;
当follower挂掉时:
并不会影响 leader,当 follower 重新加入集群时,也是会找 HW 后的数据跟新的leader同步数据。
注意:
当涉及到重要业务数据的时候,不建议使用 kafka。
如果需要处理的数据是关于日志等方面不重要的数据时可以考虑使用 kafka