3. Kafka 的副本机制
复制功能是 Kafka 架构的核心功能,在 Kafka 文档里面 Kafka 把自己描述为 一个分布式的、可分区的、可复制的提交日志服务。复制之所以这么关键,是因为消息的持久存储非常重要,这能够保证在主节点宕机后依旧能够保证 Kafka 高可用。副本机制也可以称为备份机制(Replication),通常指分布式系统在多台网络交互的机器上保存有相同的数据备份/拷贝。
Kafka 使用主题来组织数据,每个主题又被分为若干个分区,分区会部署在一到多个 broker 上,每个分区都会有多个副本,所以副本也会被保存在 broker 上,每个 broker 可能会保存成千上万个副本。下图是一个副本复制示意图:
如上图所示,为了简单我只画出了两个 broker , 每个 broker 指保存了一个 Topic 的消息,在 broker1 中 分区 0 是 Leader,它负责进行分区的复制工作,把 broker1 中的 分区 0 复制一个副本到 broker2 的主题 A 的 分区 0。同理,主题 A 的 分区 1 也是一样的道理。
3.1. Leader 副本
副本类型分为两种:一种是 Leader(领导者) 副本,一种是 Follower(跟随者)副本
3.2. Follower 副本
除了 Leader 副本以外的副本统称为 Follower 副本,Follower 不对外提供服务。下面是 Leader 副本的工作方式:
需要注意以下几点:
Kafka 中,Follower 副本也就是追随者副本是不对外提供服务的。这就是说,任何一个追随者副本都不能响应消费者和生产者的请求。所有的请求都是由领导者副本来处理。或者说,所有的请求都必须发送到 Leader 副本所在的 broker 中,Follower 副本只是用做数据拉取,采用异步拉取的方式,并写入到自己的提交日志中,从而实现与 Leader 的同步;
当 Leader 副本所在的 broker 宕机后,Kafka 依托于 ZooKeeper 提供的监控功能能够实时感知到,并开启新一轮的选举,从追随者副本中选一个作为 Leader。如果宕机的 broker 重启完成后,该分区的副本会作为 Follower 重新加入。
3.3. Follower 和 Leader 副本同步
Leader 的另一个任务是搞清楚哪个 Follower 的状态与自己是一致的。Follower 为了保证与 Leader 的状态一致,在有新消息到达之前先尝试从 Leader 那里复制消息。为了与 Leader 保持一致,Follower 向 Leader 发起获取数据的请求,这种请求与消费者为了读取消息而发送的信息是一样的。
Follower 向 Leader 发送消息的过程是这样的,先请求消息 1,然后再接收到消息 1,在时候到请求 1 之后,发送请求 2,在收到领导者给发送给跟随者之前,跟随者是不会继续发送消息的。这个过程如下:
Follower 副本在收到响应消息前,是不会继续发送消息,这一点很重要。通过查看每个 Follower 请求的最新偏移量, Leader 就会知道每个 Follower 复制的进度。
如果 Follower 在 10s 内没有请求任何消息,或者虽然 Follower 已经发送请求,但是在 10s 内没有收到消息,就会被认为是不同步的。如果一个副本没有与 Leader 同步,那么在 Leader 掉线后,这个副本将不会称为 Leader ,因为这个副本的消息不是全部的。
与之相反的,如果 Foll