Kafka的副本机制

662 阅读4分钟

这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战

副本机制的好处

  1. 提供数据冗余。即使系统部分组件失效,系统依然能够继续运转,因而增加了整体可用性以及数据持久性。
  2. 提供高伸缩性。支持横向扩展,能够通过增加机器的方式来提升读性能,进而提高读操作吞吐量。
  3. 改善数据局部性。允许将数据放入与用户地理位置相近的地方,从而降低系统延时。 这些都是副本能够提供的好处,但是kafka为了数据的强一致性,舍弃了第二条和第三条的优势。

kafka副本原理

假设有 3 台Kafka Broker,一个topic有三个分区,每个分区设定了3个副本,那么,每台broker的副本分布情况可能如下图这样

image.png

数据同步原理

image.png

  1. 在 Kafka 中,副本分成两类:领导者副本(Leader Replica)和追随者副本(Follower Replica)。每个分区在创建时都要选举一个副本,称为领导者副本,其余的副本自动称为追随者副本。

  2. Kafka的追随者副本是不对外提供服务的。任何一个追随者副本都不能响应消费者和生产者的读写请求。所有的请求都必须由领导者副本来处理,追随者副本不处理客户端请求,它唯一的任务就是从领导者副本异步拉取消息,并写入到自己的提交日志中,从而实现与领导者副本的同步。

  3. 领导者副本所在的 Broker 宕机时,Kafka 通过 ZooKeeper 提供的监控功能能够实时感知到,并立即开启新一轮的领导者选举,从追随者副本中选一个作为新的领导者。老 Leader 副本重启回来后,只能作为追随者副本加入到集群中。

追随者不对外提供服务的好处

  1. 方便实现Read-your-writes 因为Follower拉取Leader的数据可能有一些延迟,Kafka为了实现提交消息后,能立马读取到消息,所以只有Leader副本提供对外服务。

  2. 方便实现单调读 单调读可以理解为Mysql事务中常常提到的可重复读,因为只有Leader对外提供服务,所以,当我们提交成功消息后,不会出现多次读取消息不一致的情况。

ISR副本(In-sync Replicas)

不同的副本可能由于网络等原因,导致拉取Leader数据的情况不一致,比如,副本1拉取到的消息位移为123,副本2拉取到的消息位移为156。所以需要判定哪些副本拉取到的消息与Leader是保持同步,或者说是低延迟的。Kafka提出了ISR副本。

  1. ISR是一个集合,里面包含的Follower都可以认定是与Leader保持同步的。

  2. Broker 端通过参数 replica.lag.time.max.ms 参数值判定哪些Follower属于ISR副本,这个参数的含义是 Follower 副本能够落后 Leader 副本的最长时间间隔,当前默认值是 10 秒。

这就是说,只要一个 Follower 副本落后 Leader 副本的时间不连续超过 10 秒,那么 Kafka 就认为该 Follower 副本与 Leader 是同步的,即使此时 Follower 副本中保存的消息明显少于 Leader 副本中的消息。

  1. ISR副本是一个动态的集合,如果ISR中的成员落后这个时间,就会被“踢出”ISR集合,同理,如果非ISR成员的时间追赶上了这个时间差,也会被再次加入到ISR集合中。

Unclean 领导者选举(Unclean Leader Election)

当Leader所在的Broker宕机后,会进行选举。

Broker 端参数 unclean.leader.election.enable 控制是否允许不在ISR集合中的Follower参与选举如果开启后,可能选举出来的Leader是非ISR集合中的成员,导致数据丢失的情况,但是好处是不至于ISR成员为空时,该分区停机。提高了服务的高可用

但是生产环境,强烈不建议开其他,宁缺毋滥,虽然能提供服务,但是我认为也是没有意义的。

总结

  1. 副本提拱了数据冗余,提高服务的吞吐量,增加了服务的高可用
  2. Kafka的具备数据强一致性,提供了可重复读的能力
  3. replica.lag.time.max.ms 判定哪些副本可以在ISR集合
  4. unclean.leader.election.enable控制是否允许Unclean领导者选举