面试题答案
一键面试Kafka确保多副本数据一致性的机制
- ISR(In - Sync Replicas)机制:
- Kafka为每个分区维护一个ISR集合,该集合包含了与Leader副本保持同步的Follower副本。只有在ISR中的副本才被认为是同步的。
- 当Producer发送消息到Kafka时,Leader副本将消息写入本地日志后,会等待ISR中的所有Follower副本成功拉取并写入消息到它们各自的日志中,才会向Producer发送ACK。这样可以确保消息在多个副本上成功保存,从而保证数据一致性。
- HW(High Watermark)机制:
- HW是一个分区中所有副本都已成功写入的最高偏移量(offset)。消费者只能读取到HW之前的消息。
- 当Leader副本收到消息并写入本地日志后,会更新HW,只有HW之前的消息才是对消费者可见的,这就保证了消费者不会读取到尚未完全同步到所有同步副本的消息,确保了数据一致性。
- LEO(Log End Offset)机制:
- LEO是每个副本日志文件的最后一个偏移量,即下一条待写入消息的偏移量。Leader副本的LEO不断增加,Follower副本会定期从Leader副本拉取消息,更新自己的LEO。
- 只有当Follower副本的LEO追上Leader副本的LEO时,该Follower副本才会被认为是同步的,加入到ISR中。通过LEO的比较和更新,保证了副本之间数据的同步进度。
Kafka面对Broker节点故障维持高可用性的策略
- 副本机制:
- Kafka通过多副本机制来提高可用性。每个分区有多个副本,包括一个Leader副本和多个Follower副本。当Leader所在的Broker节点发生故障时,Kafka可以从ISR集合中选举出一个新的Leader副本,其他Follower副本继续从新的Leader副本同步数据。这样,即使某个Broker节点故障,分区仍然可以继续提供读写服务,保证了高可用性。
- Zookeeper的作用:
- Zookeeper在Kafka中用于管理集群元数据,包括Broker节点的状态、分区的Leader选举等。当Broker节点故障时,Zookeeper会检测到节点的下线,并通知Kafka集群。
- Kafka集群根据Zookeeper提供的信息,在ISR集合中选举出新的Leader。Zookeeper的存在确保了整个选举过程的有序性和可靠性,帮助Kafka在Broker故障时快速恢复,维持系统的高可用性。
- Producer端的配置:
- Producer可以通过设置acks参数来控制消息的发送确认机制。例如,设置acks = all(或acks = -1),Producer会等待ISR中的所有副本都确认收到消息后才认为消息发送成功。这样即使Leader副本所在的Broker节点故障,由于消息已经被ISR中的其他副本接收,消息也不会丢失。
- Consumer端的配置:
- Consumer在读取消息时,可以通过设置auto - commit.offset = false来手动控制偏移量的提交。这样在Consumer读取消息后,即使Broker节点故障导致分区重新分配,Consumer可以根据之前保存的偏移量继续从正确的位置读取消息,保证了消息的正常读取。同时,Kafka会将Consumer的偏移量信息保存到内部的__consumer_offsets主题中,进一步确保偏移量信息的可靠性。