副本是分布式系统中对数据和服务提供的一种冗余方式。为了对外提供可用的服务,往往会对数据和服务进行副本处理。
Kafka 从 0.8 版本开始为分区引入了多副本机制,通过增加副本数量提升数据容灾能力。同时,Kafka通过多副本机制实现了故障自动转移,在 Kafka 集群中的某个节点失效的情况下仍然保证服务可用。从生产者发出的一条消息,首先会被写入分区的 Leader 副本,然后需要等待 ISR 集合中的所有 Follower 副本同步完成之后才能被认为已经提交,接着更新分区的 HW,进而消费者可以消费到这条消息。
副本:相对于分区而言的,即副本是特定分区的副本。一个分区包含一个或者多个副本,其中一个为 Leader 副本,其余为 Follower 副本,各个副本位于不同的 broker 节点上。只有 Leader 副本对外提供服务,Follower 副本只负责与 Leader 副本进行数据同步。
AR:分区中的所有副本的统称。
ISR:所有与 Leader 副本保持同步状态的副本集合(Leader 副本也是 ISR 集合的一员)。
LEO:标识每个分区的最后一条消息的下一个位置,分区的每个副本都有自己的 LEO。
HW:ISR 中最小的 LEO,俗称高水位,消费者只能拉取到 HW 之前的消息。
失效副本
处于失效状态(同步失效或者功能失效)的副本会被剥离出 ISR 集合,失效副本对应的分区称为失效分区,即 under-replicated 分区。
可以通过如下脚本命令查看失效分区:
bin/kafka-topics.sh --bootstrap-server 10