分布式故障检测、心跳、Phi与SWIM面试题
本页只放标准回答、追问和原理跳转。
1. 为什么超时不能证明节点已经死亡
标准回答: 调用方只能观察到未按时收到响应,原因可能是进程崩溃、长 GC、CPU/线程池饱和、网络分区或报文丢失。异步网络中慢节点与死亡节点不可区分,超时只能形成怀疑,不能作为永久删除或切主的唯一证据。
原理:故障检测不确定性
2. Completeness 和 Accuracy 是什么
标准回答: Completeness 表示真实故障是否最终被怀疑,Accuracy 表示正常节点是否尽量不被误判。缩短阈值提高发现速度却通常降低准确性;阈值过长则减少误判但扩大故障流量窗口。
原理:故障检测器性质
3. Push Heartbeat 和主动 Probe 有什么区别
标准回答: Push 由被监控节点周期上报,中心简单但承受汇聚压力,而且心跳线程正常不代表业务健康;Probe 由监控方主动走网络路径请求健康端点,但全连接探测可能达到 O(N²) 消息量。生产常组合心跳、主动检查和调用被动失败。
原理:心跳模型
4. 什么是 Phi Accrual Failure Detector
标准回答: 它根据历史心跳间隔分布和当前等待时间输出连续怀疑值 φ,而不是固定 true/false。简化公式为 φ=-log10(1-F(t)),φ 越大表示延迟到当前仍未到达越异常。阈值和分布实现因组件而异,Phi 仍只是怀疑证据。
原理:Phi Accrual
5. SWIM 怎样检测节点故障
标准回答: 节点随机直接 PING 目标;未收到 ACK 时请求其他节点间接 PING;仍失败先标记 SUSPECT 并 Gossip;目标若存活可用更高 Incarnation 反驳,怀疑窗口结束未反驳才标 FAILED。它降低全连接探测消息量和单路径误判。
原理:SWIM 完整流程
6. SWIM 为什么需要 Incarnation
标准回答: 成员消息会乱序和延迟。目标看到旧 SUSPECT 后用更大 Incarnation 发布 ALIVE,旧状态不能覆盖新状态;否则迟到的怀疑消息会把已恢复节点再次标坏。
7. 心跳、租约和 Session 有什么区别
标准回答: 心跳说明某路径近期可达;租约是裁决服务在期限内授予权利,旧持有者暂停恢复仍需 Fencing;Session 表示客户端与协调服务的会话生命周期,本地断连不等于服务端立即过期。它们都不自动证明业务依赖健康。
8. Kubernetes 三类 Probe 有什么区别
标准回答: Startup 保护慢启动;Readiness 决定是否接收新流量,失败主要摘流;Liveness 判断进程是否需要重启。数据库故障不应简单映射成 Liveness,否则全部实例会在数据库故障时重启。
9. 为什么健康检查不能串行调用所有下游
标准回答: 高频探针会成为额外负载源,一个非核心依赖抖动还会让所有实例同时摘流。健康应拆成存活、就绪、依赖降级、饱和和业务健康,端点必须轻量、有超时和并发保护。
原理:健康维度
10. 注册中心摘除实例后为什么仍有请求到达
标准回答: 注册状态传播到客户端缓存或 Endpoint 需要时间,HTTP/2/gRPC 旧长连接还可能绑定实例,网关和 DNS 也有缓存。应先摘流并等待传播、排空连接,调用方仍保留超时、被动摘除和有限重试。
原理:故障检测窗口
11. 故障检测能否代替 Raft 选主
标准回答: 不能。故障检测只提供可达性怀疑,不保证多个节点对唯一 Leader 达成安全一致。选主还需要 Term、投票、多数派、日志新旧判断和 Fencing;网络分区时仅按 Probe 切主会造成脑裂。
12. 实例频繁上下线怎样排查
标准回答: 先确认判断者和失败原因,再对齐探针时间与 GC、CPU Throttle、线程池、连接池、磁盘和网络;检查阈值、Phi、Suspicion、恢复滞回和探针重依赖;最后核对状态传播与长连接排空,并通过故障注入验证误判率。
原理:上下线生产Runbook
