Skip to content

MOC 滚动升级:LOG pod 间缺少稳定等待窗口,导致 DN 级联 panic 重启 7 次 #593

Description

@aptend

环境

  • 集群:cn-dev,namespace restore-freetier-01
  • 升级版本:v3.0.11 → v3.0.14-b0544ba46-2026-06-04
  • 时间:2026-06-05

升级策略配置

UPGRADE_STRATEGY={"proxy":["dn"], "dn":["cn"], "cn":["log"], "log":[]}

依赖关系:

  • log 无依赖,最先升级
  • cn 依赖 log,在 log 之后升级
  • dn 依赖 cn,在 cn 之后升级
  • proxy 依赖 dn,最后升级

预期升级顺序:LOG → CN → DN → Proxy

实际升级过程

LOG 阶段(~08:50 - 09:12 UTC)

LOG-0、LOG-1、LOG-2 三个 pod 依次滚动重启,但 pod 之间的间隔时间不足以等待 Raft quorum 恢复。

DN 写入依赖 LOG 的 WAL 确认,LOG pod 重启期间 Raft leader 丢失,剩余 pod 需要重新选举 leader。由于控制器在一个 LOG pod 重启后未等待新 leader 选出、quorum 恢复,就继续重启下一个 LOG pod,DN 持续无法完成 WAL 写入,触发超时 panic:

时间 (UTC) DN 重启 累计 原因
08:52 +2 2 LOG-0 重启,Raft leader 丢失,DN WAL 超时
08:57 +2 4 LOG-1 重启,Raft 仍未稳定
09:02 +1 5 Raft quorum 未完全恢复
09:07 +1 6 同上
09:12 +1 7 LOG 升级收尾,DN 最后一次 panic

DN 每次 panic 的错误日志:

FATAL: context deadline exceeded (WAL commit timeout due to Raft no leader)

结论:LOG 三个 pod 在约 20 分钟内全部重启完毕,期间 DN 因 Raft 不可用 panic 了 7 次。

CN 阶段(~09:12 - 09:22 UTC)

CN 收到 SIGTERM 后执行有序关闭(关闭组件 → 清理锁表 → 离开 gossip → 进程退出),然后新版本 pod 启动。

CN v3.0.14 启动成功,进程正常运行(CPU 0.4 核,内存 ~6.7GB,能执行 SQL),但未向 HAKeeper 发送心跳,HAKeeper 持续报 no CN available,Proxy 无法发现 CN,所有经 Proxy 的连接失败。

此状态持续 45+ 分钟未自行恢复。(CN 心跳不注册属于 MO 内核问题,非 operator 问题,已在 matrixone#24866 跟踪。)

DN 阶段(~09:27 UTC)

DN 升级重启(v3.0.11 → v3.0.14),这是正常的升级行为,重启 1 次。

Proxy 阶段(~09:35 - 09:48 UTC)

  • 09:35 proxy-pddkw 升级到 v3.0.14
  • 09:48 proxy-tfn4w 升级到 v3.0.14

此时 CN 仍未注册到 HAKeeper,升级控制器在 CN 阶段未通过健康检查的情况下继续推进了 Proxy 升级。

最终状态

所有组件镜像均为 v3.0.14,集群可手动连接执行 SQL,但 CN 心跳未恢复到 HAKeeper。

组件 升级重启次数 异常重启次数
LOG-0/1/2 各 1 次 0
CN 2 次 0(但心跳未注册)
DN 1 次(升级) 7 次(级联 panic)
Proxy-pddkw 1 次 0
Proxy-tfn4w 1 次 0

建议

1. 在 rolling update 的每个 pod 间增加稳定等待窗口

当前控制器重启一个 pod 后,确认该 pod Running/Ready 就继续下一个。但 Ready 不等于组件功能完全恢复。

建议对 LOG 组件增加:

  • 等待 Raft leader 选举完成(可通过 HAKeeper API 或 Raft 状态检查)
  • 等待 Raft quorum 恢复(确认集群可以正常处理写入)
  • 再开始下一个 pod 的重启

2. 增加阶段间的健康门禁

在每个组件阶段完成后,检查该组件是否真正健康,再推进下一阶段:

阶段 健康门禁条件
LOG Raft leader 存在 + quorum 恢复 + 所有 LOG pod Ready
CN CN 已向 HAKeeper 注册 + 心跳正常 + 所有 CN pod Ready
DN DN 无 FATAL 日志 + heartbeat 正常 + DN pod Ready
Proxy 至少一个 Proxy pod 可路由请求

3. 增加 DN 对 LOG 短暂不可用的容忍

DN 的 WAL commit timeout 在 LOG 升级期间过于敏感,可以考虑:

  • 在升级窗口内适当放大 DN 的 heartbeat/WAL timeout
  • 或在 operator 侧通过 annotation 通知 DN 进入升级容忍模式

Metadata

Metadata

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions