【kafka学习笔记】什么是高低水位

709 阅读2分钟

为了高可用,kafka提供了备份机制,即副本(Replication)。

Kafka 定义了两类副本:领导者副本(Leader Replica)和追随者副本(Follower Replica)。前者对外提供服务,这里的对外指的是与客户端程序进行交互;而后者只是被动地追随领导者副本而已,不能与外界进行交互。

副本的工作机制也很简单:生产者总是向领导者副本写消息;而消费者总是从领导者副本读消息。 至于追随者副本,它只做一件事:向领导者副本发送请求,请求领导者把最新生产的消息发给它,这样它能保持与领导者的同步。

image.png

那么,怎么标记同步到哪里了呢?水位的概念出来了。

水位

image.png

HW: high-water,一个特殊的offset,只有在这个offset以下的消息才能被消费者(consumer)读到,高水位的具体值取决于主从副本数据同步的状态,这里不再展开。

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

ISR: in-sync-replica,处于同步状态的副本集合,是指副本数据和主副本数据相差在一定返回(时间范围或数量范围)之内的副本,当然主副本肯定是一直在ISR中的。 当主副本挂了之后,新的主副本将从ISR中被选出来接替它的工作。

OSR: 和IRS相对应 out-sync-replica,其实就是指那些不在ISR中的副本。

image.png

简单点说:

古惑仔们在被人追,老大跑在最前面,所在的位置就是LEO。

设定追击者还有10米距离。则10米就是HW。

在老大10米范围内的,就是ISR,万一老大死了,就从这些人里面选一个当新老大继续跑。 即,ISR最后一个所在的位置也是10米。

不在这个范围的,就是OSR。

关于挂掉的逻辑

(1)follower 故障

follower 发生故障后会被临时踢出ISR,待该 follower 恢复后,follower 会读取本地磁盘记录的上次的 HW,并将 log 文件高于 HW 的部分截取掉,从 HW 开始向leader 进行同步。等该 follower 的 LEO 大于等于该 Partition 的 HW,即 follower 追上 leader之后,就可以重新加入 ISR 了。

(2)leader 故障

leader 发生故障之后,会从 ISR中选出一个新的 leader,之后,为保证多个副本之间的数据一致性,其余的 follower 会先将各自的 log 文件高于 HW 的部分截掉,然后从新的leader同步数据。

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

更专业的研究: