设计故障自愈系统
核心思路
故障自愈 = 自动检测异常 + 自动执行恢复动作,减少人工介入时间(MTTR)。
常见自愈场景
| 故障类型 | 检测方式 | 自愈动作 |
|---|---|---|
| 进程 Crash | 进程监控/端口探测 | systemd 自动重启 |
| 磁盘满 | df 阈值告警 | 清理日志/临时文件 |
| OOM | dmesg OOM 日志 | 重启进程 + 告警 |
| 证书过期 | certbot timer | 自动续签 |
| Pod CrashLoopBackOff | K8s Event | 重启 Pod / 回滚版本 |
| 连接数耗尽 | 连接数监控 | 重启服务释放连接 |
K8s 内置自愈
deployment.yaml
spec:
template:
spec:
containers:
- name: app
# 存活探针:失败则重启容器
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 10
periodSeconds: 10
failureThreshold: 3
# 就绪探针:失败则从 Service 摘除
readinessProbe:
httpGet:
path: /ready
port: 8080
periodSeconds: 5
restartPolicy: Always # 容器退出自动重启
自愈平台设计
自愈规则定义
rules:
- name: "磁盘空间自愈"
trigger:
alert_name: "DiskUsageHigh"
severity: warning
labels:
mount_point: "/data"
conditions:
- disk_usage > 85%
- disk_usage < 95% # 超过 95% 不自愈,直接告警
actions:
- type: ansible_playbook
playbook: clean-old-logs.yml
params:
keep_days: 7
max_retries: 2
cooldown: 30m # 冷却期内不重复执行
notify: ops-team # 执行后通知
警告
自愈系统必须设置冷却期(cooldown)和最大重试次数,防止故障循环自愈消耗资源。同时所有自愈操作必须记录日志并通知相关人员。
常见面试问题
Q1: 故障自愈的边界在哪里?哪些场景不适合自愈?
答案:
适合自愈:确定性强、恢复动作安全(重启、清理、扩容) 不适合自愈:
- 数据一致性相关(数据库故障切换需要人工确认)
- 安全事件(入侵不能简单重启解决)
- 级联故障(需要先定位根因而非逐个重启)
- 首次出现的未知故障(没有预设规则)
原则:自愈是止血手段,不是根因修复。自愈后必须创建工单跟进根因。