副本

副本机制的好处:

  1. **提供数据冗余。**即使系统部分组件失效,系统依然能够继续运转,因而增加了整体可用性以及数据持久性。
  2. **提供高伸缩性。**支持横向扩展,能够通过增加机器的方式来提升读性能,进而提高读操作吞吐量。
  3. **改善数据局部性。**允许将数据放入与用户地理位置相近的地方,从而降低系统延时。

Kafka 的副本机制只有提供数据冗余这一个好处。

副本数据一致
Kafka 的解决方案是采用基于领导者的副本机制。
在这里插入图片描述

  • 在 Kafka 中,副本分成两类:领导者副本(Leader Replica)和追随者副本(Follower Replica)。每个分区在创建时都要选举一个副本,称为领导者副本,其余的副本自动称为追随者副本。
  • Kafka 的副本机制比其他分布式系统要更严格一些。**在 Kafka 中,追随者副本是不对外提供服务的。**这就是说,任何一个追随者副本都不能响应消费者和生产者的读写请求。所有的请求都必须由领导者副本来处理,或者说,所有的读写请求都必须发往领导者副本所在的 Broker,由该 Broker 负责处理。追随者副本不处理客户端请求,它唯一的任务就是从领导者副本异步拉取消息,并写入到自己的提交日志中,从而实现与领导者副本的同步。
  • 当领导者副本挂掉了,或者说领导者副本所在的 Broker 宕机时,Kafka 依托于 ZooKeeper 提供的监控功能能够实时感知到,并立即开启新一轮的领导者选举,从追随者副本中选一个作为新的领导者。老 Leader 副本重启回来后,只能作为追随者副本加入到集群中。

为什么追随者副本是不对外提供服务的?

数据一致性:Kafka 使用复制机制来保证数据的一致性和可靠性。每个主题分区通常都有多个副本,其中一个被选为 Leader,负责处理读写请求,其他副本则负责备份数据。如果所有副本都能提供读服务,就可能出现数据不一致的情况,因为不同副本之间可能存在短暂的数据同步延迟。
这样设计的好处:

  1. 方便 Read-your-writes。当生产者向 Kafka 成功写入消息后,消费者可以马上读取刚才生产的消息。
  2. 方便实现单调读。如果 follower 提供读服务,可能会由于副本数据不一致,可能会看到:第一次消费时看到的最新消息在第二次消费时不见了。

In-sync Replicas(ISR)

Kafka 引入了 In-sync Replicas(ISR 副本集合)。ISR 中的副本都是与 Leader 同步的副本,不在 ISR 中的追随者副本就被认为是与 Leader 不同步的。

Leader 副本天然就在 ISR 中。也就是说,ISR 不只是追随者副本集合,它必然包括 Leader 副本。在某些情况下,ISR 只有 Leader 这一个副本。

**Broker 端参数 replica.lag.time.max.ms。**这个参数的含义是 Follower 副本能够落后 Leader 副本的最长时间间隔,当前默认值是 10 秒。也就是说,只要一个 Follower 副本落后 Leader 副本的时间不连续超过 10 秒,那么 Kafka 就认为该 Follower 副本与 Leader 是同步的,即使此时 Follower 副本中保存的消息明显少于 Leader 副本中的消息。

Follower 副本唯一的工作就是不断地从 Leader 副本拉取消息,然后写入到自己的提交日志中。如果这个同步过程的速度持续慢于 Leader 副本的消息写入速度,那么在 replica.lag.time.max.ms 时间后,此 Follower 副本就会被认为是与 Leader 副本不同步的,因此不能再放入 ISR 中。此时,Kafka 会自动收缩 ISR 集合,将该副本踢出ISR。倘若该副本后面慢慢地追上了 Leader 的进度,那么它是能够重新被加回 ISR 的。这也表明,ISR 是一个动态调整的集合,而非静态不变的。

Unclean 领导者选举(Unclean Leader Election)

有一种情况:ISR 为空。因为 Leader 副本天然就在 ISR 中,如果 ISR 为空了,就说明 Leader 副本也挂掉了,Kafka 需要重新选举一个新的 Leader。可是 ISR 是空,此时该怎么选举新 Leader 呢?

Kafka 把所有不在 ISR 中的存活副本都称为非同步副本。通常来说,非同步副本落后Leader 太多,因此,如果选择这些副本作为新 Leader,就可 能出现数据的丢失。毕竟,这些副本中保存的消息远远落后于老 Leader 中的消息。在 Kafka 中,选举这种副本的过程称为 Unclean 领导者选举。

Broker 端参数 unclean.leader.election.enable 控制是否允许 Unclean 领导者选举。
开启 Unclean 领导者选举可能会造成数据丢失,好处是它使得分区 Leader 副本一直存在,不至于停止对外提供服务,因此提升了高可用性。

禁止 Unclean 领导者选举的好处在于维护了数据的一致性,避免了消息丢失,但牺牲了高可用性。

Logo

Kafka开源项目指南提供详尽教程,助开发者掌握其架构、配置和使用,实现高效数据流管理和实时处理。它高性能、可扩展,适合日志收集和实时数据处理,通过持久化保障数据安全,是企业大数据生态系统的核心。

更多推荐