AIOps智能故障自愈服务器自动处理告警
为什么需要智能故障自愈
传统服务器告警依赖人工盯屏和手动处理,效率低且容易漏掉。
AIOps智能故障自愈的思路是:监控系统检测到异常后,自动执行预定义的修复动作(重启服务、清理磁盘、扩容等),大幅缩短故障恢复时间。
本文从零开始,教你搭建一套能自动处理常见告警的自愈系统。
准备工作:你需要哪些组件
实现自动告警处理,至少需要三层:
- 监控采集端:推荐 Prometheus + node_exporter,采集CPU、内存、磁盘、进程等指标。
- 告警引擎:Alertmanager,负责接收告警并路由到执行器。
- 自愈执行器:可以是一台管理机上的脚本,通过SSH或API调用目标服务器执行修复命令。
环境假设:一台监控中控机(CentOS 7+),若干被管服务器。
已安装 Docker 可快速部署 Prometheus 和 Alertmanager。
分步搭建自动告警与自愈流程
步骤1:部署 Prometheus 和 Alertmanager
在中控机上执行:
# 拉取镜像并启动 Prometheus
docker run -d --name prometheus -p 9090:9090 \
-v /opt/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus
# 启动 Alertmanager
docker run -d --name alertmanager -p 9093:9093 \
-v /opt/alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml \
prom/alertmanager
修改 prometheus.yml,添加告警规则和 Alertmanager 地址。
步骤2:配置自动触发自愈的 Webhook
Alertmanager 支持 webhook 接收器,当告警触发时,它会 POST 一个 JSON 到指定 URL。
我们写一个简单 Python 自愈脚本(selfheal.py),接收告警后根据告警标签执行对应修复。
#!/usr/bin/env python3
import json, subprocess, sys
from flask import Flask, request
app = Flask(__name__)
FIX_MAP = {
"disk_usage": "df -h | grep /data && echo '清理日志' || true",
"high_cpu": "systemctl restart mysqld"
}
@app.route('/webhook', methods=['POST'])
def webhook():
data = request.json
for alert in data.get('alerts', []):
labels = alert.get('labels', {})
fix_key = labels.get('alertname')
cmd = FIX_MAP.get(fix_key)
if cmd:
# 通过 SSH 在被管服务器上执行(需预先配好免密)
subprocess.run(['ssh', labels['instance'], cmd])
return 'ok'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
运行脚本:python3 selfheal.py &,确保端口可达。
步骤3:配置 Alertmanager 发送到自愈 Webhook
编辑 alertmanager.yml:
receivers:
- name: 'selfheal'
webhook_configs:
- url: 'http://中控机IP:5000/webhook'
route:
group_wait: 10s
group_interval: 30s
repeat_interval: 5m
receiver: 'selfheal'
重载 Alertmanager:docker restart alertmanager。
避坑指南与常见问题
- 免密 SSH 必须提前配置:自愈脚本通过 SSH 执行命令,如果没配免密,脚本会卡住。在中控机生成密钥并分发到所有被管服务器。
- 告警重复执行:Alertmanager 可能重复发送告警,脚本内应加幂等逻辑(比如检查服务是否已恢复)。
- 测试告警:使用
amtool或直接向 Prometheus 打一条测试告警,验证 Webhook 是否触发。 - 权限问题:自愈命令可能需要 root 权限,建议被管服务器允许中控机以 root 登录,或配置 sudo 免密。
- 日志与回滚:每次自动修复执行前,先备份状态(如保存进程列表),修复失败时能手动回滚。
效果验证:让故障自己修复
在任意被管服务器上模拟磁盘使用率过高:
dd if=/dev/zero of=/tmp/bigfile bs=1M count=500
等待 Prometheus 告警触发(默认规则如 disk_usage > 80%),Alertmanager 会 POST 到自愈脚本,脚本执行清理命令,几秒后告警自动消除。
查看中控机日志可确认脚本执行记录。
如果你已经完成上述步骤,现在你的服务器已经可以自动处理常见告警了。
后续可以根据业务需要补充更多修复动作,比如重启 Nginx、扩容磁盘等。
建议从简单的告警开始,逐步完善自愈规则,避免误操作。
常见问题 FAQ
Q:自愈脚本没有执行怎么办?
A:检查 Webhook 端口是否开放,Alertmanager 网络是否可达,以及脚本是否打印了错误日志。
Q:告警只触发一次,但脚本执行了多次?
A:检查 Alertmanager 的 repeat_interval 和 group_interval,可能重复发送。可在脚本内用缓存去重。
Q:如何查看自愈记录?
A:自愈脚本可以写入日志文件,或发送到 Elasticsearch。简单做法:脚本内 print 输出并重定向到文件。