在kafka集群中,一个topic主题可以分布到一个到多个broker中,每个分区会有多个副本,其实就是一种备份机制,当某台broker宕机的时候,不至于消息不可用,保证kafka的高可用和性。

kafka副本机制和相关概念

副本有2种类型领导者(Leader) 和 跟随着(Follower)

在上图粉色方框中 主题1分区0副本1、主题1分区1副本1、主题1分区2副本1为领导者(Leader),其余的为跟随着(Follower)。

  • 领导者(Leader) 提供对外服务,跟随着(Follower)不提供对外的生产消费服务。副本Follow的数据来源于异步拉取Leader副本的数据。
  • Leader副本的broker宕机的时候,zookeer会感知到并从剩下的Follow副本中重新选举副本当作Leader。

副本同步机制

了解副本同步机制之前需要先了解2个参数 HW和LEO

kafka HW和LEO

  • HW 高水位 highWaterMark缩写,这个值代表消费者可以拉取这个偏移量之前的消息,上图中,HW为5。
  • LEO 日志末端偏移量 log end offset 缩写,表示下一次数据写入的offset 位置,上图中,LEO为9。

上图代表一个日志文件,日志文件中有9条消息,第一条消息的offset为0,最后一条消息为offset 8,offset 9是LEO值,代表下一次数据写入offset的位置。

日志文件的HW为5,消费者可以拉取0-4位置的消息,offset5对消费者不可见。

同步过程

  1. leader副本把数据写入本地磁盘
  2. leader副本更新LEO
  3. follower副本发送FETCH同步数据请求,携带自身的LEO
  4. leader副本会读取底层日志文件中的消息数据,更新本地保存的其他副本LEO
  5. leader副本尝试更新ISR列表
  6. leader副本更新HW
  7. leader副本给follower副本返回数据,携带leader副本的HW值
  8. follower副本接收响应并写入数据,更新自身的LEO
  9. follower副本更新HW值

副本Leader ISR选举机制

当某台broker节点宕机的时候,为了保证kafka集群的高可用性,需要从剩下的broker节点中的跟随着(Follow)中选举一个节点作为领导者(Leader)。

kafka的副本选举机制是ISR,全称为 In-Sync Replicas。ISR 是一个存放分区副本ID的集合,如果某个副本所在的 Broker 正常并且能够与 zookeepeer建立连接的情况下,那这个副本的ID就会存放到该集合中,如果某个副本节点宕机之后,该副本数据就会从该ISR集合中剔除。

当Leader 收到消息数据同步给Follower 节点时,如果 Follower 节点一直阻塞,长时间不给Leader 节点发送 ack ,超过replica.lag.time.max.ms这个参数,默认值是10s,这种情况也会从ISR集合中剔除。

如果 Leader 节点宕机之后,其他副本就会将ISR中的 Leader 节点移除,而ISR列表中最前面的副本就被选举为一个新的Leader 节点。

kafka副本ISR选举

在上面图示中,当broker1宕机时,主题1分区0副本1是领导者(Leader),需要从ISR集合中最前面的副本选举一个节点主题1分区0副本2作为新的领导者(Leader)。