自愈的边界在哪
自愈的价值是把可预期的重复故障从人工流程中移除,边界在于三个前提:自动动作必须可回退、影响面可估算、失败能交回人工。安全的自愈动作通常是重启进程、摘除实例、清理可重建的临时数据;数据删除、缩容、权限与网络变更则不应进入自动路径。
基本信息
| 可自愈范围 | 重启进程、摘除流量、重建无状态实例 |
|---|---|
| 必须人工 | 数据删除、缩容、权限与网络变更 |
| 前置条件 | 判定信号明确且故障可复现 |
| 保护措施 | 动作限流、时间窗限制、失败转人工 |
| 回退要求 | 每个自动动作都有对应回退路径 |
典型使用场景
- 进程无响应:重启或拉起实例,前提是不依赖本地持久化状态
- 实例级故障:从负载均衡摘除并重建,避免影响同组其他实例
- 缓存与临时目录异常:清理可重建的临时数据,不触碰业务数据
- 反复重启无效:达到尝试上限即停止并升级人工,避免重启循环
- 演练验证:先在预演环境验证自愈逻辑与回退路径,再开放生产权限
动作风险分级
| 动作 | 风险 | 处理方式 |
|---|---|---|
| 重启进程 | 低,短暂中断 | 可直接自动执行 |
| 摘除实例 | 中,容量下降 | 需配合最小实例数保护 |
| 重建实例 | 中,本地数据可能丢失 | 需确认无本地状态 |
| 删除或缩容 | 高且不可逆 | 必须人工审批 |
自愈动作的护栏写法
自愈动作的护栏写法
# 护栏一:动作限流,避免短时间内反复重启
if [ $retry_count -ge 3 ]; then
echo give-up-escalate-to-human >> selfheal.log # 达到上限转人工
exit 0
fi
# 护栏二:只在允许窗口内执行,避开业务高峰
hour=$(date +%H)
[ $hour -ge 2 ] && [ $hour -le 5 ] || exit 0
# 护栏三:最小实例数保护,摘除前确认同组仍有可用实例
running=$(curl -fsS http://lb/status | grep -c up)
[ $running -gt 2 ] || echo keep-instance >> selfheal.log自愈动作要有次数与时间窗限制,并记录每次执行前后的状态。缺少记录时,反复重启会被当成稳定的自愈成功,从而掩盖进程正在反复崩溃这一事实。
任何不可逆动作都不应自动执行。删除数据、缩容、修改权限与网络配置一旦被误触发,恢复成本远高于节省的时间,这类动作必须保留人工审批与二次确认。