面试题答案
一键面试Kafka保证数据一致性及应对Broker故障措施
- 副本机制:Kafka通过副本机制来保证数据的冗余和可靠性。每个分区都有一个领导者(Leader)副本和多个追随者(Follower)副本。生产者发送的消息会首先发送到Leader副本,Follower副本会从Leader副本同步数据。
- 应对Broker故障:当某个Broker节点出现故障时,如果该节点上的分区Leader副本所在的Broker故障,Kafka会从该分区的Follower副本中选举出一个新的Leader。由于Follower副本一直在同步Leader副本的数据,所以已发送到该节点分区的消息不会丢失。并且消费者从Leader副本消费消息,新的Leader选举后,消费者继续从新Leader消费,不会出现重复消费已成功提交位移(commit offset)的消息的情况。
ISR(In - Sync Replicas)机制
- 定义:ISR是指与Leader副本保持一定程度同步的Follower副本集合。只有在ISR中的Follower副本才被认为是与Leader处于同步状态的。
- 作用:当Leader发生故障时,Kafka只会从ISR中的Follower副本中选举新的Leader。这确保了新选举出的Leader拥有较新的数据,从而保证了数据的一致性。如果某个Follower副本落后Leader太多(由参数
replica.lag.time.max.ms
控制,默认10秒),它会被移出ISR。只有当它重新追上Leader时,才会被重新加入ISR。
ACK应答机制
- 定义:ACK是生产者在发送消息后等待Kafka Broker响应的机制。生产者在发送消息时,可以设置
acks
参数来指定需要等待多少个副本确认收到消息后才认为消息发送成功。 - 作用:
acks=0
:生产者发送消息后,不需要等待任何Broker的确认,直接认为消息发送成功。这种情况下,消息丢失的可能性较大,但发送性能最高。acks=1
:生产者发送消息后,只要Leader副本确认收到消息,就认为消息发送成功。如果此时Follower副本还未同步完消息,Leader就发生故障,可能会导致消息丢失。acks=-1
或acks=all
:生产者发送消息后,需要等待ISR中的所有副本都确认收到消息,才认为消息发送成功。这种设置可以最大程度保证消息不丢失,但会降低消息发送的性能,因为需要等待多个副本的确认。通过这种方式,结合ISR机制,确保了已发送到分区的消息不会丢失,进而保证了数据的一致性。