半夜三点,手机突然疯狂震动,打开一看又是线上服务报警。这种场景对很多运维人员来说太熟悉了。以前每次出问题都得爬起来手动重启服务、查日志、临时扩容,久而久之成了“救火队员”。SRE(站点可靠性工程)的核心目标之一,就是把人从重复、紧急的操作中解放出来,减少人工干预。
监控不是为了让人看,而是为了让系统自己反应
很多人觉得监控就是画几张图表,方便值班时盯着看。但真正的SRE思维是:如果一个告警每次都靠人来处理,那它就不该存在。比如数据库连接池耗尽,传统做法是收到通知后登录服务器调参数。而在SRE实践中,系统应该在检测到连接数超过阈值时,自动触发连接清理或临时扩容。
举个例子,某电商平台在大促期间发现购物车服务频繁超时。他们设置了一条规则:当接口平均延迟连续30秒超过500ms,且错误率上升至5%以上时,自动执行预设的降级脚本,关闭非核心推荐功能,并增加实例数量。
用自动化脚本替代“操作手册”
很多团队都有厚厚的应急手册,写着“出现A情况请执行B命令”。这看似规范,实则隐患重重——不同人操作可能不一致,紧急时刻还容易手抖输错命令。SRE的做法是把这些步骤写成可验证的自动化脚本。
比如部署回滚,不再靠工程师手动执行git reset和重启服务,而是通过CI/CD流水线提供一键回滚按钮。背后其实是封装好的脚本:
#!/bin/bash
SERVICE_NAME="user-api"
LAST_STABLE=$(etcdctl get /deploy/$SERVICE_NAME/stable)
docker stop $SERVICE_NAME && docker rm $SERVICE_NAME
docker run -d --name $SERVICE_NAME $LAST_STABLE
这样既避免人为失误,又大幅缩短恢复时间。
故障演练常态化,让系统学会“自愈”
Netflix的Chaos Monkey会随机杀死生产环境中的服务实例,听起来很疯狂,但这正是SRE减少人工依赖的关键手段。通过定期注入故障,可以验证自动恢复机制是否有效。
比如每周五下午自动关闭某个可用区的部分节点,观察负载均衡能否正确重定向流量,备份服务是否及时接管。如果过程中需要人工介入,就说明自动化还不完善,必须补上漏洞。
把“例外”变成“例常”
每当发生一次人工干预,SRE都会问一个问题:下次还能不能避免?如果答案是否定的,那就把它变成自动化流程的一部分。比如曾经因为磁盘满导致服务崩溃,之后就应部署自动清理策略:
*/30 * * * * /usr/local/bin/clean_logs.sh --keep-days 7 --service user-service
再比如API被恶意刷请求,与其每次手动封IP,不如接入实时风控模块,自动识别异常行为并加入黑名单。
工具只是手段,关键是思维方式转变
减少人工干预不是一味堆砌自动化工具,而是建立“机器优先”的响应机制。每一次手动操作都应该被视为系统的缺陷,目标是让同类问题永远不再需要人来处理。当你发现一个月都没收到需要动手的告警时,才说明SRE真正起作用了。