summary
2012-02-29(闰日),Azure 因证书过期日期计算 bug 发生约 8-10 小时中断。Guest Agent 在生成用于 VM 与宿主 OS 之间加密通信的 transfer certificate 时,将过期日设为创建日 +1 年,即 2013-02-29(该日期不存在),证书校验失败,VM 启动停滞。Host Agent 在连续三次启动失败后按既定策略将其判定为硬件故障并上报 Fabric Controller,触发跨服务器/跨集群的自动迁移,使 bug 扩散为全局中断。
timeline
02-29 00:00 UTC(Dublin)起,证书生成失败导致新 VM 启动停滞。Host Agent 每 25 分钟重试,三次失败后上报硬件故障,Fabric Controller 将 VM 迁移至其他服务器,bug 随迁移扩散到其他集群。约 2.5 小时后定位根因,7.5 小时内完成主修复;但因修复过程中自身代码兼容问题,7 个集群发生二次中断,最晚至次日 09:15 才完全恢复。
root_cause
证书过期日计算为当前年 +1,未处理闰年边界:2012-02-29 生成证书得到 2013-02-29(不存在的日期),证书被视为无效,VM 初始化停滞。该停滞被宿主的「三次失败即硬件故障」启发式误判,触发自动化自愈迁移,将故障传播到健康服务器。
amplifiers
① 故障误判:本应处理软件缺陷的硬件故障启发式反而放大了事故。② 自愈反噬:自动迁移把坏证书带到新服务器,形成正反馈。③ 修复附带损伤: rush 推送修复时自身代码不兼容,造成二次中断。④ 时间耦合:恰逢平台软件新版滚动发布,需生成新证书,扩大了触发面。
mitigation
修复证书日期计算(闰日边界处理);停止误迁移;分批推送修复并隔离受影响集群。微软向受影响客户提供当月 33% 抵扣作为 SLA 补偿。
lessons
日期/时间计算必须覆盖闰秒与闰年边界;不要把单一软件失败信号直接映射为硬件故障并自动迁移;自愈逻辑需区分「已知软件缺陷」与「真实硬件故障」。
checklist
① 所有日期运算单测覆盖闰日/闰秒。② 证书有效期校验拒绝无效日期而非静默失败。③ 自动迁移前增加软件缺陷指纹识别,避免缺陷扩散。④ 修复发布前做兼容性回归。