Kafka详解(五)Kafka副本机制

所谓的副本机制(Replication),也可以称之为备份机制,通常是指分布式系统在多台网络互联的机器上保存有相同的数据拷贝。它的作用主要有以下几点:

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

这些是分布式教科书中对副本作用的定义。但是对Kafka而言,目前只提供第一个作用,也就是提供数据冗余,实现高可用和高持久性。

1. 副本定义

Kafka中的副本(Replica),本质就是一个只能追加写消息的提交日志。同一个分区下的所有副本保存有相同的消息序列,这些副本分散保存在不同的Broker上,从而能够对抗部分Broker宕机带来的数据不可用。

在实际生产环境中,每台 Broker 都可能保存有各个主题下不同分区的不同副本,因此,单个 Broker 上存有成百上千个副本的现象是非常正常的。如下图所示:

2. 副本角色

Kafka采用的是基于领导者(Leader-based)的副本机制。以此来确保同一分区,多个副本下的数据一致性。基于领导者的副本机制的工作原理如下图所示:

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

3. Kafka副本机制的优点

Kafka副本机制有两个方面的好处:

1 方便实现“Read-your-writes”

所谓 Read-your-writes,顾名思义就是,当你使用生产者 API 向 Kafka 成功写入消息后,马上使用消费者 API 去读取刚才生产的消息。如果允许追随者副本对外提供服务,由于副本同步是异步的,因此有可能出现追随者副本还没有从领导者副本那里拉取到最新的消息,从而使得客户端看不到最新写入的消息。

2 方便实现单调读(Monotonic Reads)

单调读定义:对于一个消费者用户而言,在多次消费消息时,它不会看到某条消息一会儿存在一会儿不存在。

如果允许追随者副本提供读服务,那么假设当前有 2 个追随者副本 F1 和 F2,它们异步地拉取领导者副本数据。倘若 F1 拉取了 Leader 的最新消息而 F2 还未及时拉取,那么,此时如果有一个消费者先从 F1 读取消息之后又从 F2 拉取消息,它可能会看到这样的现象:第一次消费时看到的最新消息在第二次消费时不见了,这就不是单调读一致性。但是,如果所有的读请求都是由 Leader 来处理,那么 Kafka 就很容易实现单调读一致性。

4. In-sync Replicas(ISR)

ISR副本是指与Leader保持同步的副本集合。这个副本集合不只是追随者副本,也(必然)包括Leader副本。甚至在某些情况下,ISR只有Leader副本。

Broker 端参数 replica.lag.time.max.ms 决定一个追随者副本是否在ISR集合中。这个参数的含义是追随者副本落后领导者副本的最长时间间隔。在这个时间间隔内,追随者副本没有做fetch操作,就被视为与领导者副本不同步,从而被踢出ISR集合。

后续倘若该副本的LEO不小于Leader副本的HW时,它会被重新加入到ISR集合中。

这表明,ISR是一个动态调整的集合,而非静止不变的。

生产者写入的一条消息只有被ISR中的所有副本都接收到,才被视为“已提交”状态。由此可见,若ISR分区中有n个副本,那么该分区最多可以忍受n-1个副本崩溃而不丢失已提交的消息。

5. Unclean领导者选举(Unclean Leader Election)

Broker 端参数 unclean.leader.election.enable 控制是否允许 Unclean 领导者选举。当这个参数开启时,Leader副本所在的Broker宕机,且ISR集合为空,就会发生Unclean领导者选举。

  • 开启Unclean领导者选举可能会造成数据丢失,但是好处是,始终会选出新的分区Leader副本,不至于停止对外服务,因此提升了高可用性。
  • 禁止Unclean领导者选举的好处是维护了数据的一致性,避免了消息丢失,但牺牲了高可用性。

强烈建议不要开启Unclean领导者选举,避免数据丢失。

发布了8 篇原创文章 · 获赞 0 · 访问量 7280

猜你喜欢

转载自blog.csdn.net/fedorafrog/article/details/103988582