Kafka副本机制

Kafka副本机制

Scroll Down

唯美.jpg

Kafka中,主题下有若干个分区,每个分区又会配置若干副本。层级为主题-分区-副本。

副本定义

副本,本质是一个只能追加写消息的提交日志。 同一个分区下的所有副本保存相同的消息,这些副本分散保存再不同的Broker上,来对抗Broker宕机带来的数据不可用。

副本角色

image.png

如上图所示,Kafka中副本角色有两类,分别如下:

  • Leader副本。对外提供服务,每个分区都会有一个leader副本。
  • Follower副本。不对外提供服务,也就是值,这些Follower副本不能响应consumer和producer的读写请求。

Follower副本是从leader副本异步拉取消息,并且写入到自己的提交日志中,来保持和leader的同步。

假如leader副本挂了,或者说leader副本所在的Broker宕机后,Kafka会利用zookeeper提供的监控功能实时感知到谁宕机,然后会开启新一轮的领导者选举,从追随者选出一个副本作为leader副本。

leader副本机制的优点

Kafka没有像Mysql一样,它的follower副本是不对外提供服务,这样做的好处为一下两点:

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

Read-your-writes是指producer写入的消息,能马上被consumer读取到。Follower副本是异步拉取消息的,所以可能会存在producer写入的消息,还没有同步到Follower。Kafka规定只用leader副本对外提供服务,就避免这种情况出现。

  1. 方便实现的单调读。

什么是单调读呢?就是对于一个消费者用户而言,在多次消费消息时,它不会看到某条消息一会儿存在一会儿不存在。

举个例子,一个leader有两个Follower,分别为F1、F2。因为是异步拉取消息,F1和F2的同步进度,很有可能会不一样,所以假如消费者先在F1读取消息,可以读取到,在F2上读取消息,也许就读不到了。

In-sync Replicas(ISR)

Kafka中有个概念叫ISR,它是表示ISR中的副本都是与Leader同步的副本。有个点需要注意的是,ISR中包含leader副本。

如何判断副本是否在ISR中呢?

这个取决与Broker端参数replica.lag.time.max.ms,参数默认为10s。表示Follower副本能够落后Leader副本的最长时间间隔。

Follower 副本唯一的工作就是不断地从 Leader 副本拉取消息,然后写入到自己的提交日志中。如果这个同步过程的速度持续慢于 Leader 副本的消息写入速度,那么在 replica.lag.time.max.ms 时间后,此 Follower 副本就会被认为是与 Leader 副本不同步的,因此不能再放入 ISR 中。此时,Kafka 会自动收缩 ISR 集合,将该副本“踢出”ISR。

Unclean 领导者选举

有可能会出现这种情况:ISR为空,代表leader也挂掉,这时候Kafka会重新选举leader。

Kafka 把所有不在 ISR 中的存活副本都称为非同步副本。 既然是非同步副本,也就意味着落后leader副本太多,如果用这些副本作为leader副本,会导致消息丢失。

Broker 端参数 unclean.leader.election.enable 控制是否允许 Unclean 领导者选举。

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

建议关闭好,还有其他方式提高可用,没必要牺牲数据一致性。

参考

  • 极客时间-《Kafka核心技术与实践》