面试题答案
一键面试Kafka副本同步工作原理
- 副本角色:Kafka每个分区都有一个领导者(Leader)副本和多个追随者(Follower)副本。生产者发送消息以及消费者读取消息都直接与Leader副本交互。Follower副本会定期从Leader副本拉取消息进行同步。
- 消息同步:当生产者向Kafka写入消息时,Leader副本会将消息追加到本地日志中,Follower副本通过Fetch请求从Leader副本拉取消息,然后写入自己的日志。
ISR(In - Sync Replicas)概念
- 定义:ISR是指与Leader副本保持“同步”状态的Follower副本集合。这里的“同步”意味着Follower副本落后Leader副本的消息数量在一定范围内(可通过参数
replica.lag.max.messages
和replica.lag.time.max.ms
控制)。 - 作用:只有ISR中的副本才有资格被选举为新的Leader。当Leader发生故障时,新的Leader将从ISR中选举产生,这有助于保证选举出来的新Leader拥有较新的消息,从而保障数据的一致性。
副本选举过程
- Leader故障检测:Kafka通过心跳机制来检测副本的存活状态。当Leader副本发生故障时,Kafka控制器(Controller)会检测到该故障。
- 新Leader选举:控制器会从ISR中选择一个副本作为新的Leader。选择策略通常是选择ISR中第一个副本(在某些情况下,也可能会根据副本的日志大小等因素选择)。如果ISR为空,那么就会从所有存活的副本中选择一个,但这种情况可能会导致数据丢失或不一致,因为非ISR副本可能落后Leader副本较多。
异常情况下保证消息一致性和可靠性
- 网络波动时的ISR调整:在网络波动情况下,一些Follower副本可能因为暂时无法及时从Leader副本拉取消息而落后。当落后程度超过设定的阈值(
replica.lag.max.messages
或replica.lag.time.max.ms
)时,这些Follower副本会被移出ISR。当网络恢复,副本重新追上Leader副本时,又会被重新加入ISR。 - 数据一致性保证:
- 生产者方面:生产者可以设置
acks
参数来控制消息的确认机制。当acks = all
(或acks = -1
)时,意味着只有当所有ISR中的副本都成功写入消息后,生产者才会收到确认,这保证了消息至少被ISR中的所有副本保存,即使Leader发生故障,数据也不会丢失。 - 新Leader选举后:新Leader选举出来后,它会截断那些未被ISR中所有副本同步的消息(如果有的话),以保证数据一致性。例如,假设某个消息被Leader写入,但还未被所有ISR副本同步,此时Leader故障,新Leader选举出来后,会将这条未完全同步的消息截断,从而避免数据不一致。同时,Kafka还通过高水位(High Watermark,HW)机制来标识哪些消息是已经被所有ISR副本同步的,消费者只能读取到HW之前的消息,进一步保障了数据一致性。
- 生产者方面:生产者可以设置