面试题答案
一键面试副本的选举策略
- 领导者副本选举
- 在 Kafka 中,每个分区都有一个领导者副本(Leader Replica)和多个追随者副本(Follower Replica)。当领导者副本所在的 broker 发生故障时,需要从追随者副本中选举出新的领导者副本。
- Kafka 使用 Zookeeper 来管理集群元数据,包括分区的领导者副本信息。选举过程依赖于 ISR(In - Sync Replicas,同步副本集合)。只有在 ISR 中的副本才有资格被选举为领导者。
- 通常,ISR 中的第一个副本(按照副本 ID 顺序)会被选举为新的领导者。这是一种简单且高效的策略,因为 ISR 中的副本被认为是与领导者保持同步的,选举其中的副本可以最大程度地减少数据丢失和不一致的风险。
- ISR 管理
- 领导者副本会跟踪哪些追随者副本与自己保持同步。一个追随者副本只要能及时从领导者副本拉取数据并追加到自己的日志中,就会被认为是同步的,从而被包含在 ISR 中。
- Kafka 通过配置参数
replica.lag.time.max.ms
来定义副本同步滞后的时间阈值。如果一个追随者副本超过这个时间没有向领导者副本发送 FETCH 请求,或者虽然发送了 FETCH 请求但落后领导者副本太多(通过replica.lag.max.messages
配置,不过这个参数在新版本中逐渐被废弃,主要依赖时间阈值),就会被移出 ISR。当它重新追上领导者副本时,又会被重新加入 ISR。
同步过程
- 生产者发送数据
- 生产者将数据发送到领导者副本所在的 broker。领导者副本首先将数据写入自己的本地日志文件,并向生产者发送 ACK 确认。
- 根据生产者配置的
acks
参数不同,确认机制有所不同:acks = 0
:生产者发送数据后不等待任何确认,继续发送下一批数据,这种情况下数据丢失风险高,但吞吐量最高。acks = 1
:生产者等待领导者副本写入成功的确认,只要领导者副本写入本地日志,就认为成功,这种情况下如果领导者副本在返回确认后但追随者副本同步前发生故障,可能会导致数据丢失。acks = all
或acks = -1
:生产者等待所有在 ISR 中的副本都同步成功的确认,只有当所有 ISR 副本都同步了数据,领导者副本才会向生产者发送 ACK。这种方式提供了最高的数据可靠性,但可能会因为等待所有副本同步而降低系统的吞吐量。
- 追随者副本同步数据
- 追随者副本定期向领导者副本发送 FETCH 请求,拉取领导者副本的日志数据,并追加到自己的日志文件中。
- 追随者副本会维护一个
highwatermark
(高水位标记),表示它已经成功同步到的领导者副本日志位置。只有当领导者副本的highwatermark
之前的数据都被所有 ISR 副本同步后,这个数据才可以被消费者读取。
对数据一致性的影响
- 数据一致性保障
- Kafka 通过 ISR 和领导者 - 追随者副本同步机制来保障数据一致性。当
acks = all
时,只有所有 ISR 副本都同步了数据,生产者才会收到成功确认,这确保了数据至少在所有 ISR 副本中都存在,从而提供了强一致性保证。 - 由于只有 ISR 中的副本才有资格被选举为领导者,新选举的领导者副本包含了所有已确认数据,消费者读取到的数据都是已经被成功同步到多个副本的数据,减少了数据不一致的可能性。
- Kafka 通过 ISR 和领导者 - 追随者副本同步机制来保障数据一致性。当
- 数据不一致风险
- 如果 ISR 中的副本数量过少(例如只有领导者副本本身),并且领导者副本发生故障,可能会导致数据丢失,从而引发数据不一致。为了降低这种风险,Kafka 建议配置足够数量的副本,并合理设置副本同步相关参数,确保 ISR 中始终有多个副本。
- 在极端情况下,当领导者副本发生故障,而新选举的领导者副本可能落后于旧领导者副本,可能会导致部分未完全同步的数据丢失,这种情况可能会影响数据的一致性,但通过合理的配置和运维可以尽量避免。