写在前面:
Kafka 中说的副本指的都是相同内容文件中的一份而已,并没有「原文件」和「副本」的关系。

副本定义

Kafka 是有主题概念的,而每个主题又进一步划分成若干个分区。副本的概念实际上是在分区层级下定义的,每个分区配置有若干个副本。

所谓副本(Replica),本质就是一个只能追加写消息的提交日志

image.png

副本角色

如何保证每个副本中的数据是一致的呢?

  • 采用基于领导者(Leader-based)的副本机制

基于领导者的副本机制的工作原理如下图所示:
image.png
特点:

  • 分为 Leader replica 和 Follower replica
  • 只有 Leader replica 可以对外提供服务,Follwer 只是从 Leader 那异步拉取消息,做消息备份
  • Leader 挂了后,会根据规则从 Follwer 中选一个变为 Leader

为什么设计成只有 Leader 可以对外提供服务?

  • 方便实现“Read-your-writes”。即写了之后立刻能读
  • 方便实现单调读(Monotonic Reads)。不会出现同时刻从不同 replica 读消息得到不一样的情况

没有完全说服我为什么 Follower 不能提供读服务 看了 MySQL 主从实现,和 kafka 的基本原理是一致的,mysql 从库从主库的 binlog 中拉取信息。Kafka Follower 也是从 Leader 中拉取信息。 既然 MySQL 能实现的,Kafka 应该也可以实现才对?

In-sync Replicas(ISR)

追随者副本不提供服务,只是定期地异步拉取领导者副本中的数据而已。既然是异步的,就存在着不可能与 Leader 实时同步的风险。在探讨如何正确应对这种风险之前,我们必须要精确地知道同步的含义是什么。或者说,Kafka 要明确地告诉我们,追随者副本到底在什么条件下才算与 Leader 同步。

基于这个想法,Kafka 引入了 In-sync Replicas,也就是所谓的 ISR 副本集合。ISR 中的副本都是与 Leader 同步的副本,相反,不在 ISR 中的追随者副本就被认为是与 Leader 不同步的。那么,到底什么副本能够进入到 ISR 中呢?

特点:

  • Leader 天然在 ISR 中
  • 根据 replica.lag.time.max.ms 配置确定 Follower 能否放入 ISR

Unclean 领导者选举(Unclean Leader Election)


忽略就好,不推荐使用。