文件

68 行
4.9 KiB
Markdown

# 企业微信 OA 备份恢复通知异常排查
## Goal
定位企业微信群中反复出现的“内部 OA 运维告警/恢复通知”的真实发送源和触发原因,判断其是否表示备份或恢复异常,并形成不影响真实备份能力的处置建议。
## Background
- 用户截图显示发送应用名为“OA 备份告警”,但消息状态是 `FAIL_APP_HEALTH` / `PASS_APP_HEALTH_READY`,失败类别是 `dns_or_connect_failed`。
- 同一晚至少出现两轮恢复消息,其中一轮在告警后很快恢复,表现为间歇性故障而非持续不可用。
- 本任务只做诊断和方案建议;未经另行明确批准,不修改生产或 ARM 配置,不停用 timer,不重启服务,不发送测试消息。
## Confirmed Facts
- `scripts/send-wecom-group-alert.py:123` 只在故障/提醒类别变化或从故障/提醒恢复为健康时发送;相同状态应由独立状态文件降噪。
- `scripts/send-wecom-group-alert.py:133` 将所有健康恢复统一命名为“内部 OA 运维恢复通知”。该标题表示监控状态恢复,不表示执行过数据库、附件或整机恢复。
- 截图中的 `FAIL_APP_HEALTH` 只能由 ARM 公网健康探测产生,不来自每日备份、备份新鲜度 watchdog、异机归档 dead-man 或季度恢复提醒。
- ARM 健康探测每 5 分钟运行一次,连续两次失败才告警,一次成功即发送恢复通知。因此每轮告警至少代表约两个连续探测窗口未能完成公网 `/ready` 请求。
- 当前实现把 DNS 解析失败和 TCP 连接失败合并为 `dns_or_connect_failed`,现有消息无法进一步区分两者。
- 生产最近 14 天每日备份和新鲜度 watchdog 均按预期各运行一次且结果成功;未发现生产备份失败、重复调度或真实恢复操作证据。
- 两个生产 SSH 入口落在同一台机器、不同账号上,不是重复部署实例。
- ARM 当前健康探测成功,额外连续 5 次只读 `/ready` 请求全部通过;故障已自行恢复。
- ARM 当前使用单一静态 DNS 解析入口,未运行本机解析服务,解析链路缺少冗余。结合短时失败后恢复的模式,ARM 侧 DNS/外网连接间歇抖动是首要假设。
- 现有 ARM 入口不能读取 root-only 状态历史和完整 journal;若要把原因从“DNS 或连接”进一步精确到某一层,需要额外的 root 只读证据或先增强脱敏诊断。
## Requirements
- 明确区分应用健康告警、备份告警、备份新鲜度告警、异机 dead-man 和季度提醒。
- 用截图、代码、timer、状态和近期只读运行证据解释当前问题。
- 给出最小处置建议,并区分“当前无需紧急动作”“后续代码增强”“ARM 配置调整”三类。
- 不记录 Secret、完整账号、主机地址、原始消息 payload、真实业务数据或完整运维路径。
- 任何代码、部署或 ARM DNS 配置变更均需后续单独批准。
## Scope
- 企业微信截图中的稳定状态、类别和时间窗口分析。
- 公网健康探测、共用告警 helper、自动备份与异机 dead-man 的调用关系。
- 生产及 ARM 相关 timer 的只读状态、近期脱敏结果和当前公网 `/ready` 可用性。
- 诊断结论、证据限制、后续代码增强与 ARM 配置建议。
## Acceptance Criteria
- [x] 能确认截图消息的唯一发送源,并说明“恢复通知”不等于执行恢复。
- [x] 能判断生产备份当前是否正常,是否存在重复 timer 或重复实例。
- [x] 能说明当前可证实的故障边界以及仍无法区分的 DNS/TCP 子原因。
- [x] 给出不影响备份和监控可靠性的分级处置建议、验证方法与回滚边界。
- [x] 全过程不执行未经批准的生产/ARM 写入、任务停用、服务重启或外部消息发送。
## Out of Scope
- 本任务内修改 ARM DNS、网络、systemd timer 或企微机器人配置。
- 停止公网健康监控,或通过提高阈值掩盖真实持续故障。
- 数据库重置、真实恢复、恢复演练或备份数据下载。
- 主动发送测试告警、修改群成员或企业微信应用配置。
## Test Plan
- 用截图状态反查唯一调用方,并与源码 allowlist、状态机和 timer 配置交叉核对。
- 只读检查生产/ARM timer 唯一性、启用状态和最近结果。
- 复核生产最近 14 天自动备份及新鲜度 watchdog 结果。
- 在 ARM 侧执行有限次数 `/ready` 只读请求,只记录成功/失败计数。
- 运行 task validate、Trellis 治理门禁和 `git diff --check`。
## Deferred Items
- 若用户后续要求修复,建议另行批准:先增强探测器,将 DNS、TCP、TLS 和 HTTP 阶段分开,并保留短期脱敏计数;再依据证据决定是否为 ARM 配置冗余解析入口。
- ARM root-only 历史日志采集可进一步确认具体故障层,但不阻塞本任务对“发送源不是备份、当前问题是 ARM 公网健康链路抖动”的判断。