说真的,入行6年见过太多这种黄金抢修时间(中小互联网多数就是10分钟顶格了)被新手或者兼岗后端浪费在瞎试操作、查无关日志、不敢拍板回滚上的情况。所以年初我结合这几年踩的坑、中小团队的人手配置(一般1个全栈运维+几个兼岗后端)、主流云厂商最近的小功能更新,整理了一套2026精简应急响应流程,上周六小李靠这套流程的简化版(去掉了后续复盘的部分要求,留足后续补的空间),从我到楼下便利店接到电话、到我们俩初步临时回滚恢复核心商品浏览和支付(虽然预热活动的优惠券领取暂时关了,但至少保住了大半订单),一共才花了17分钟。
这里一定要敲黑板,这套流程不是官方那种几十页的PPT,全是落地就能用的,而且优先级排得死死的——先保核心业务,再查故障根因,最后补复盘。很多新手一开始钻牛角尖,非要先弄清楚到底是哪里出了问题再救,结果错过时间窗口,业务损失可能比你排查几天还大。
第一步不是查top命令,不是看error.log,是先快速确认故障范围和核心优先级。中小团队可以提前用思维导图列出来核心业务链路和非核心业务,比如我们公司的电商小程序,核心就是「商品列表(SKU查询)」「购物车结算」「支付回调」「库存扣减」这四个,非核心的是「用户头像上传」「优惠券分享」「积分商城」「评论区」。上周六小李一开始连评论区打不开都慌,后来我让他用现成的curl脚本测四个核心接口:
# 测SKU核心接口(提前存到/home/ops/check_core.sh)
curl -s "https://api.yourecom.com/sku/list?page=1&size=10" | jq '.code'
curl -s "https://api.yourecom.com/cart/submit" -X POST -H "Content-Type: application/json" -d '{"sku_id":1,"num":1}' | jq '.code'
这两个curl命令加了-s是静默输出,用jq只看返回的状态码,中小电商核心接口一般200/0是正常,提前把jq装上很有必要
测出来SKU接口502,支付回调偶尔504,购物车提交和库存扣减在预热关了库存超卖保护后(老板临时同意的,救急!)暂时200,这就把非核心的立刻排除了。
第二步是执行快速临时恢复预案,这个预案也要提前列好,最好存在Git仓库的ops分支,拉下来就能用,比如我们常用的:核心接口限流+核心服务节点重启+最近一次稳定版本的蓝绿切换(如果有条件的话,中小团队没有蓝绿就用灰度先切一部分流量到备用节点,或者直接回滚到Git上的稳定tag镜像)。上周六我们公司SKU查询用的是Redis+MySQL的主从架构,备用Redis节点上个月扩容完刚上线,我就让小李先查主Redis的情况:
# 用redis-cli查主节点的INFO命令
redis-cli -h 172.16.1.100 -p 6379 -a YourRedisPwd123 INFO MEMORY

输出里找used_memory_rss_human和maxmemory_human
果不其然,used_memory_rss_human飙到了12.8G,而maxmemory_human只有12G,触发了Redis的maxmemory-policy(虽然之前设的是volatile-lru,但上周六预热加塞了好多本地老客的专属活动SKU,全是永久不过期的volatile?不对不对,是永久不过期的allkeys,小李之前改促销SKU的时候顺手把Redis的键过期时间写错了!全写成了-1永久有效!)
那临时恢复预案就不用蓝绿了,太麻烦,直接切Redis的只读流量到备用节点,然后把主Redis的allkeys-lfu临时改成maxmemory-policy volatile-ttl(虽然大部分都是永久,但先让系统能清一点点缓存垃圾?不对,先执行FLUSHDB ALLSYNC?不行不行,预热的SKU永久键虽然有问题,但全清了用户就更看不到了,先切主从,让备用节点先扛只读SKU查询,然后主节点先清几个冗余的测试永久键,再赶紧让运营后台的同事批量修改促销SKU的过期时间到12小时后活动结束)。切主从的命令(提前也存到脚本里了,避免手滑):
# 备用节点执行:取消只读,变成临时主
redis-cli -h 172.16.1.101 -p 6379 -a YourRedisPwd123 SLAVEOF NO ONE
Nginx的SKU查询反向代理脚本:直接替换upstream里的主Redis为备用
sed -i 's/172.16.1.100:6379/172.16.1.101:6379/g' /usr/local/nginx/conf/upstreams/redis-sku.conf
重新加载Nginx,注意中小团队用reload别用restart
/usr/local/nginx/sbin/nginx -s reload
第三步就是等核心业务稳定个10-15分钟,再慢慢查根因,写复盘报告,补全临时忽略的非核心业务。上周六的根因很简单,就是小李批量改促销SKU的时候复制粘贴,把原本的过期时间字段expire_at改成了-1,运营后台的代码又没有对永久SKU的数量做限制(中小团队这点很容易忽略,老板总说赶进度赶进度,这些校验就省了)。
这里给新手兼岗的朋友两个专属避坑提醒:第一个是赶什么都别赶赶进度省掉核心业务的前置校验,批量操作、数据库变更、Redis参数修改这些,一定要走审批流程,哪怕审批人只有你自己,也要写个简单的操作日志;第二个是一定要提前存好快速恢复的脚本和稳定版本的镜像,Git仓库里要单独留ops分支,别和业务代码混在一起,而且要定期测试备份和恢复流程,别等故障来了才发现镜像拉不下来,脚本早就过期了。
你们在运维工作中有没有遇到过因为赶进度或者忽略前置校验导致的线上故障?欢迎在评论区分享你的排查经验,我会抽时间回复的。

评论列表 (0条):
加载更多评论 Loading...