kafka副本机制详解

kafka副本机制详解

  • 什么是副本机制
  • 副本机制的好处
  • 副本中的角色
  • 与其他产品中副本的区别,为什么?
  • In-sync Replicas (ISR/同步副本)
  • Unclean领导者选举

什么是副本机制

  副本就是一些冗余的数据,副本是在分区的基础上定义的。副本是分区的副本,一个分区可以有多个副本。
所谓副本,本质就是一个只能追加写消息的提交日志。同一个分区下的所有副本保存着相同的消息序列,这些副本可以分散的保存在不同的borker上,从而能够一定程度上对抗Broker宕机带来的数据不可用。
  在实际生产环境中,每台Borker都可能保存有各个主题下不同分区的不同副本。

副本机制的好处

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

以上是副本机制的好处,但是目前kafka的副本机制只能提供第一个好处。

副本中的角色

  副本中有两种角色:领导者(leader)、追随者(follower)。每个分区创建时都会选举一个副本作为领导者,其余的副本是追随者。

与其他产品中副本的区别,为什么?

  像mysql集群中,追随者也是可以对外提供服务的,只不过只可以提供读服务。但是在kafka中只有领导者可以对外提供服务,一切的读写请求都只能发送给领导者,追随者只可以做一件事情:从领导者哪里异步拉取消息,并写入到自己的提交日志中,从而实现与领导者副本的同步。
  这也是为什么kafka的副本只能提供第一个好处的原因。

那为什么要这样设计呢?

  1. 方便实现”Read-your-writes“
      也就是生产者API成功向写入kafka写入消息后,马上使用消费者就可以读取到刚刚才生产的消息。
      如果允许追随者副本对外提供服务,那由于同步是异步的就有可能出现从追随者哪里拿不到最新的消息。
  2. 方便实现单调读”Monotonic Reads“
      就是在一个消费者在多次消费消息时,不会看到某条消息一会存在一会不存在。
      如果允许追随者对外提供服务,那假设当有两个追随者时,如果一个拉取消息及时,一个拉取不及时。此时如果有一个消费者先从拉取消息及时的追随者拉去了消息,之后又从不及时的追随者上拉去了消息,此时就会出现一个消息一开始有,后来又没有了的情况。但是使用读请求都由Leader来处理,这种情况就不会发生了。

In-sync Replicas (ISR/同步副本)

  首先我们要明确此处”同步“的定义,同步的标准是什么?我们可能会认为只要是与leader的消息完全相同就算是同步的,否则就是不同步的。但事实上,kafka对同步的定义没有这么严格。
  kafka中对同步的标准是由Broker端参数replica.lag.time.max.ms参数值定义的。这个参数的含义是:Follower副本可以落后Leader副本的最长时间间隔,默认10秒。也就是说,只要一个Follower副本落后Leader副本的时间不连续超过10秒,那kafka就认为他们是同步的。
只要是同步的副本就可以存在于ISR副本集合中。
  如果持续落后于Leader副本超过指定时间,就会被踢出ISR集合,如果之后慢慢的赶上来了,还可以再加入ISR集合。

Unclean领导者选举

  由上面的解释我们可知ISR是动态改变的,所以有可能会出现为空的情况,也就是Leader副本挂掉了。
  kafka对于不在ISR中的存活的副本都称为非同步副本。一般来说非同步副本落后Leader很多,所以如果让它们竞选成为了Leader,则会导致大量的数据丢失。在kafka中我们称非同步副本竞争Leader为Unclean领导者竞选。
  在Broker端的参数unclean.leader.election.enable可以控制是否允许Unclean领导者选举。一般情况下建议不要开启Unclean领导者选举。

你可能感兴趣的:(kafka,kafka)