follower副本设计的原因
1.方便实现“Read-your-writes”:即只要写入了可以直接消费掉,不存在延迟
2.方便实现单调读:单调读一致性,即不会存在从x1读取到某个消息但是从x2读取不到这个消息
ISR
ISR 不只是追随者副本集合,它必然包括 Leader 副本。甚至在某些情况下,ISR 只有 Leader 这一个副本。进入这个副本集合的条件是:Broker 端参数 replica.lag.time.max.ms代表follower副本落后leader副本允许的最大时间,如果落后超过了这个时间则被移除ISR,但是如果追上了leader之后也会重回ISR
ISR是AR中的一个子集,由leader维护ISR列表,follower从leader同步数据有一些延迟。任意一个超过阈值都会把follower剔除出ISR, 存入OSR(Outof-Sync Replicas)列表,新加入的follower也会先存放在OSR中。AR=ISR+OSR。
副本同步机制
相关概念
ISR:in-sync replics,每个分区(Partition)中同步的副本列表。
Hight Watermark:副本水位值,表示分区中最新一条已提交(Committed)的消息的Offset。
LEO:Log End Offset,Leader中最新消息的Offset。
Committed Message:已提交消息,已经被所有ISR同步的消息。
Lagging Message:没有达到所有ISR同步的消息。
高水位和LEO
高水位以前的日志是可以被消费的,LEO表示副本写入下一条消息的位移值。
分区的高水位是指Leader副本的高水位
高水位更新机制
可以看到Leader副本除了保存自己的高水位和LEO还会保存所有follower的LEO。
对于Leader副本
当写入消息到本地磁盘后,
1.更新自己的LEO
2.更新自己的高水位:
获取自己现在的高水位以及所有follower副本的LEO的最小值,比较这两个的最大值。即currentHW = max{currentHW, min(LEO-1, LEO-2, ……,LEO-n)}
3.更新follower的LEO:当follower拉取了消息,则更新Leader中存储的follower的LEO
对于Follower副本
1.写入消息到本地磁盘,
2.更新 LEO 值。
3.更新高水位值:获取 Leader 发送的高水位值:currentHW。获取步骤 2 中更新过的 LEO 值:currentLEO。 更新高水位为 min(currentHW, currentLEO)。