面试题答案
一键面试Kafka消息队列Partition的副本机制
Kafka 中的每个 Partition 可以有多个副本(Replica),其中一个副本被指定为领导者(Leader)副本,其余的为追随者(Follower)副本。
- 数据写入:生产者(Producer)发送消息到 Partition 的 Leader 副本,Follower 副本会从 Leader 副本同步数据,保持数据一致。
- 数据读取:消费者(Consumer)通常从 Leader 副本读取数据。
不同场景下确保高可用性和一致性
- 主副本故障
- 高可用性:当 Leader 副本所在的 Broker 发生故障时,Kafka 会从 Follower 副本中选举出一个新的 Leader 副本。这确保了 Partition 仍然可用,生产者和消费者可以继续与新的 Leader 进行交互,从而保证了高可用性。
- 一致性:Follower 副本会不断从 Leader 副本同步数据,在 Leader 故障前,Follower 副本会尽量保持与 Leader 副本的数据一致。新的 Leader 选举出来后,它会从之前已同步的最新位置继续提供服务,保证了数据的一致性。
- 网络分区
- 高可用性:如果网络分区导致部分 Broker 与其他 Broker 隔离,Kafka 集群会尝试在可用的 Broker 中维持 Partition 的可用性。如果 Leader 副本在隔离的 Broker 中,集群会选举出一个新的 Leader 副本,使得 Partition 在其他可用的 Broker 上继续提供服务。
- 一致性:在网络分区恢复后,被隔离的 Broker 重新加入集群,Follower 副本会与新的 Leader 副本进行数据同步,确保所有副本的数据最终达到一致。
选举策略
- ISR(In - Sync Replicas):Kafka 维护了一个与 Leader 副本保持同步的 Follower 副本集合,称为 ISR。只有在 ISR 中的副本才有资格被选举为新的 Leader。
- 选举过程:当 Leader 副本故障时,Kafka 首先会在 ISR 集合中的 Follower 副本中选举新的 Leader。选举算法通常会选择 ISR 中第一个副本作为新的 Leader,因为这个副本被认为是与 Leader 同步程度最高的。如果 ISR 为空,Kafka 可能会从所有 Follower 副本中选举新的 Leader,但这可能会导致数据不一致的风险。为了降低这种风险,Kafka 可以通过配置参数(如
unclean.leader.election.enable
)来控制是否允许从不干净(不在 ISR 中)的副本中选举 Leader。如果该参数设置为false
,当 ISR 为空时,Partition 将不可用,直到有副本重新加入 ISR 并成为 Leader。