面试题答案
一键面试Kafka副本同步机制
- 基本概念:Kafka 采用多副本机制,每个分区有一个领导者副本(Leader Replica)和多个追随者副本(Follower Replica)。生产者发送消息到 Leader 副本,Follower 副本定期从 Leader 副本拉取消息进行同步。
- 同步流程:
- 生产者将消息发送到 Leader 副本,Leader 副本写入本地日志后,向生产者发送确认响应。
- Follower 副本通过 Fetch 请求从 Leader 副本拉取消息,将拉取到的消息写入本地日志。
ISR(In - Sync Replicas)工作原理
- 定义:ISR 是指与 Leader 副本保持同步的副本集合。只有在 ISR 中的副本才被认为是同步的,能参与选举成为新的 Leader。
- 维护:
- Kafka 控制器负责监测副本的同步状态。如果 Follower 副本落后 Leader 副本太多(由
replica.lag.time.max.ms
配置,默认 10000 毫秒),则该 Follower 副本会被移出 ISR。 - 当落后的 Follower 副本追上 Leader 副本(达到一定同步程度),会被重新加入 ISR。
- Kafka 控制器负责监测副本的同步状态。如果 Follower 副本落后 Leader 副本太多(由
- 选举:当 Leader 副本发生故障时,Kafka 会从 ISR 中选举一个新的 Leader。如果 ISR 为空,会根据
unclean.leader.election.enable
配置决定是否从非 ISR 副本中选举 Leader(不建议开启,可能导致数据丢失)。
合理配置副本因子
- 影响:
- 数据可靠性:副本因子越大,数据冗余度越高,数据可靠性越强。例如,副本因子为 3 时,允许 2 个副本故障而不丢失数据。
- 性能:副本因子增加会增加磁盘 I/O、网络传输等开销,降低 Kafka 的整体性能。每个副本都需要占用一定的存储空间,且 Follower 副本同步消息会消耗网络带宽。
- 配置建议:根据实际需求权衡,对于可靠性要求极高的场景,可适当提高副本因子(如 3 或 4);对于性能敏感且允许一定数据丢失风险的场景,可降低副本因子(如 2)。同时要考虑集群的硬件资源,避免因副本因子过高导致资源耗尽。
调整副本同步策略
- 同步策略类型:
- acks = 1:生产者发送消息到 Leader 副本,Leader 副本写入本地日志后即向生产者发送确认。这种策略性能最高,但存在数据丢失风险,若 Leader 副本未及时同步给 Follower 副本就发生故障,可能导致数据丢失。
- acks = all(或 acks = -1):生产者发送消息到 Leader 副本,Leader 副本等待所有 ISR 中的副本都同步消息后才向生产者发送确认。这种策略数据可靠性最高,但性能相对较低,因为需要等待所有同步副本完成同步。
- acks = 0:生产者发送消息后不等待任何确认,直接继续发送下一条消息。这种策略性能最高,但数据丢失风险极大,一般很少使用。
- 策略调整建议:
- 对于可靠性要求高且性能可接受一定牺牲的场景,选择
acks = all
。 - 对于性能敏感且可容忍少量数据丢失的场景,选择
acks = 1
。可通过调整min.insync.replicas
(默认 1)配置,当 ISR 中的副本数小于min.insync.replicas
时,生产者会收到错误,进一步保障数据可靠性。
- 对于可靠性要求高且性能可接受一定牺牲的场景,选择