Ch05-Kafka 之 Partition

Ch05-Kafka 之 Partition

July 2, 2018
Apache Kafka
kafka

Kafka Partition 相关的机制是比较复杂的,它自身保留了一个 leader 来对外提供消息操作的能力,若干 follower 通过 leader 同步消息保证数据可靠性。

1. 基础概念 #

partition

Term Name 说明
AR Assigned Replicas 所有的副本统称为 AR,AR=ISR+OSR
ISR In-Sync Replicas ISR 是 AR 的一个子集,即所有和主副本保持同步的副本集合
OSR Out-of-Sync Replicas OSR 也是 AR 的一个子集,所有和主副本未保持一致的副本集合。Kafka 通过一些算法来判定从副本是否保持同步,处于失效的副本也可以通过追上主副本来重新进入 ISR。
LEO Log End Offset LEO 是下一个消息将要写入的 offset 偏移,在 LEO 之前的消息都已经写入日志了,每一个副本都有一个自己的 LEO。
HW High Watermark 所有和主副本保持同步的副本中,最小的那个 LEO 就是 HW,这个 offset 意味着在这之前的消息都已经被所有的 ISR 写入日志了,消费者可以拉取了,这时即使主副本失效其中一个 ISR 副本成为主副本消息也不会丢失。

2. 主副本 HW 与 LEO #

leo-hw

LEO 和 HW 都是消息的偏移量,其中 HW 是所有 ISR 中最小的那个 LEO。

  1. 生产者将消息发送给 leader;
  2. leader 追加消息到日志中,并更新自己的偏移量信息,同时 leader 也维护着 follower 的信息(比如 LEO 等);
  3. follower 向 leader 请求同步,同时携带自己的 LEO 等信息;
  4. leader 读取日志,拉取保存的每个 follower 的信息(LEO);
  5. leader 将数据返回给 follower,同时还有自己的 HW;
  6. follower 拿到数据之后追加到自己的日志中,同时根据返回的 HW 更新自己的 HW,方法就是取自己的 LEO 和 HW 的最小值。

从上面这个过程可以看出,一次同步过程之后 leader 的 HW 并没有增长,只有再经历一次同步,follower 携带上一次更新的 LEO 给 leader 之后,leader 才能更新 HW,这个时候才能确认消息确实是被所有的 ISR 副本写入成功了。所以 leader 的 HW 很重要,因为这个值直接决定了消费者可以消费的数据。

3. 故障恢复 #

3.1 Follower 故障 #

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

3.2 Leader 故障 #

leader 发生故障后,会从 ISR 中选出一个新的 leader,之后,为保证多个副本之间的数据一致性,其余的 follower 会先将各自的 log 文件高于 HW 的部分截掉,然后从新的 leader 同步数据。注意:这只能保证副本之间的数据一致性,并不能保证数据不丢失或者不重复。

4. 参考文献 #