上一篇kafka之三HW与leader epoch有很大一部分也提到了副本同步机制,但有些细节点没提到,这里再转载一篇文章来聊聊副本同步机制。

副本同步机制

我们知道,kafka每个topic的partition会有N个副本,kafka通过多副本机制实现故障自动转移,当kafka集群中一个broker失效情况下,会在N个副本中重新选出一个broker作为leader提供服务,从而做到高可用。N个副本中,其中一个为leader,其他的都为follower,leader处理partition的所有读写请求,follower会定期地复制leader上的数据。

Kafka提供了数据复制算法,如果leader发生故障或挂掉,Kafka确保从同步副本列表中选举一个副本为leader,新leader被选举并被接受客户端的消息写入。leader负责维护ISR(In-Sync Replicas的缩写,表示副本同步队列)中所有消息。当producer发送一条消息到broker后,leader写入消息,并复制到所有follower。消息提交之后才被成功复制到所有的同步副本。消息复制延迟受最慢的follower限制,kafka会检测慢副本,如果follower“落后”太多或者失败,leader将会把他从ISR中删除。

副本同步队列ISR

所谓同步,必须满足两个条件:

  1. 副本节点必须能与zookeeper保持会话(心跳机制)
  2. 副本能复制leader上的所有写操作,并且不能落后太多(卡主或滞后的副本控制由replica.lag.time.max.ms配置)

默认情况下,Kafka topic的replica数量为1,即每个partition都有一个唯一的leader,为了确保消息的可靠性,通常应用中将其值(由broker的参数offsets.topic.replication.factor指定)大小设定为1。所有的副本(replicas)统称为AR (Assigned Replicas)。ISR是AR的一个子集,由leader维护ISR列表,follower从Leader同步数据有一些延迟,任意一个超过阈值都会把follower踢出ISR,存入OSR(Outof-Sync Replicas)列表,新加入的follower也会先存放到OSR中。AR = ISR + OSR

HW(HighWatermark)俗称高水位,取一个partition对应的ISR中最小的LEO作为HW,consumer最多只能消费到HW所在的位置。另外每个replica都有HW,leader和follower各自负责更新自己的HW的状态。对于leader新写入的消息,consumer不能立即消费,leader会等待该消息被所有ISR中的replicas都同步后,才更新HW,此时消息才能被consumer消费,这样就保证了如果Leader所在的broker失效,该消息仍可从新选举的leader中获取。对于来自内部的broker的读取请求,没有HW的限制。

下图详细说明了当producer生产消息到broker后,ISR及HW和LEO(log end offset)的流转过程:
image.png

由此可见,Kafka的复制机制既不是完全的同步复制,也不是单纯的异步复制,而是基于ISR的动态复制方案。事实上,同步机制要求所有能工作的follower都复制完,这条消息才会被commit,这种复制方式极大的影响了吞吐率。而异步复制方式下,follower异步的从leader复制数据,数据只要被Leader写入log就被任务已经commit,这种情况下如果follower没有全复制完,落后与Leader,突然leader宕机,则会丢数据。基于ISR的动态复制指的是ISR是由Leader动态维护的,如果Follower不能紧“跟上”Leader,它将被Leader从ISR中移除,待它又重新“跟上”Leader后,会被Leader再次加加ISR中。每次改变ISR后,Leader都会将最新的ISR持久化到Zookeeper中。而Kafka这种使用ISR的方式则很好的均衡了确保数据不丢失以及吞吐率,实现了可用性与数据一致性的动态平衡(也可以称作可调整一致性)(参考:Kafka设计解析(六)- Kafka高性能架构之道)。

Kafka的ISR管理最终都会反馈到Zookeeper节点上,具体位置为:
/brokers/topics/[topic]/partitions/[partition]/state。目前有两个地方会对这个Zookeeper节点进行维护:

  1. Controller维护:Kafka集群中的其中一个Broker会被选举为Controller,主要负责Partition管理和副本状态管理,也会执行类似于重分配partition之类的管理任务。在符合某些特定条件下,Controller下的LeaderSelector会选举新的leader, ISR和新的leader_epoch及controller_epoch写入Zookeeper的相关节点中。同时发起LeaderAndIsrRequest通知所有的replicas。
  2. leader来维护:leader有单独的线程定期检查ISR中follower是否脱离ISR,如果发现ISR变化,则会将新的ISR的信息返回到Zookeeper的相关节点中。

副本不同的异常情况:

  1. 慢副本:在一定周期时间内,follower不能追赶上leader。最常见的原因之一是IO瓶颈导致follower追加复制消息速度慢于从leader拉取速度
  2. 副本卡住:在一定周期时间内,follower停止从leader拉取请求。follower replica卡住了是由于GC暂停或follower失效或死亡。
  3. 新启动副本:当用户给topic增加副本因子时,新的follower不再同步副本列表中,直到他们完全追赶上leader日志。

‘可调节一致性’的叫法参考:再谈一致性


步履不停
38 声望13 粉丝

好走的都是下坡路