1. 总体准备与权限确认
- 步骤1:列出所有站点、域名、服务器(公网IP/私有IP)、云服务账号(AWS/GCP/Azure/Cloudflare)和负责人员名单。
- 步骤2:确认SSH、控制台、数据库、监控和DNS的访问权限;测试并记录跳板机/堡垒机入口命令,例如:ssh -i /path/key.pem ubuntu@bastion-ip,然后通过bastion跳转。
- 步骤3:备份当前配置:nginx/apache、systemd 单元文件、Docker Compose / Kubernetes 配置和数据库快照(示例:mysqldump -u root -p dbname > backup.sql)。
2. 建立基础监控与告警清单
- 部署Prometheus + Grafana或使用云监控服务,必须包含:CPU、内存、磁盘、网络带宽、响应时间、HTTP 5xx/4xx、错误率和队列长度。
- 设置告警:CPU>80%持续5分钟、95百分位响应时间>2s、错误率>1%、主数据库连接数接近上限等,并接入PagerDuty/Slack/邮件。
- 小提示:用Blackbox exporter或UptimeRobot做外部可用性检测,定期从美国不同地区访问站点做SLA验证。
3. 快速健康检查(发生故障时首要操作)
- 步骤1:从外部执行curl检查:curl -I -v https://www.example.com --max-time 10,记录HTTP状态和响应头。
- 步骤2:在应用服务器上检查进程:ps aux | egrep 'nginx|httpd|node|gunicorn|uwsgi';检查端口监听:ss -tuln | egrep ':80|:443|:3306|:6379'。
- 步骤3:查看日志:tail -n 200 /var/log/nginx/error.log; journalctl -u your-service -n 200; docker logs --since 10m container_id。
4. 网络与DNS诊断步骤
- 步骤1:本地和远端分别执行ping、traceroute/mtr:mtr -r -c 10 www.example.com,找出丢包或高延迟跳点。
- 步骤2:DNS检查:dig +trace example.com A;确认TTL与权威解析器返回值一致。若使用Cloudflare/Route53,检查健康检查与Failover策略。
- 步骤3:若出现DNS污染或解析异常,临时指向备用IP或调整TTL到低值并切换到备用负载均衡。
5. 负载层与LB故障恢复
- 步骤1:确认负载均衡器健康检查配置(路径、端口、超时);手动将异常后端剔除或加入。
- 步骤2:若LB不可用,临时修改DNS指向备用LB或使用云提供的临时公网IP;操作示例:在Route53调整A记录并选择“立即生效”。
- 步骤3:检查SSL证书与证书链:openssl s_client -connect host:443 -servername example.com,确保证书未过期。
6. 应用层故障排查详细步骤
- 步骤1:重现问题并记录请求ID/Trace ID;在日志中grep该ID查找错误栈。
- 步骤2:检查依赖服务(数据库、缓存、第三方API):mysql -e "SHOW PROCESSLIST;";redis-cli INFO;检查连接池耗尽情况。
- 步骤3:若是代码回归引起,快速回滚到上一个稳定版本(git checkout / deploy rollback),并通知发布负责人。
7. 数据库与缓存层应对方案
- 步骤1:若数据库慢查询或锁表,使用SHOW PROCESSLIST和INNODB STATUS,找出长事务并选择合理kill或优化语句。
- 步骤2:缓存穿透/雪崩:查看缓存命中率,重建热点缓存或临时降级部分非关键功能;示例:redis-cli --latency,查看延迟。
- 步骤3:若主库宕机,执行故障切换到从库(确保binlog位点一致),更新应用的DB连接字符串并验证。
8. 容器与Kubernetes环境恢复步骤
- 步骤1:kubectl get pods -n namespace,针对CrashLoopBackOff查看kubectl describe pod 和 kubectl logs pod。
- 步骤2:若镜像或配置错误,更新Deployment镜像:kubectl set image deployment/name container=repo:tag,并观察滚动更新。
- 步骤3:资源耗尽导致OOM,调整Limits/Requests并自动扩容ReplicaSet或Node Pool。
9. 恢复后的验证与流量回切
- 步骤1:在Canary或灰度流量下验证,使用流量分配工具(NGINX、Istio、ALB权重)将流量从10%逐步提升到100%。
- 步骤2:执行端到端业务场景测试(登录、下单、支付),确认无错误并监控关键指标30分钟无异常。
- 步骤3:记录变更并更新Runbook,触发事后回顾会议。
10. 自动化与预防措施建议
- 建议1:用Terraform/Ansible管理基础设施与配置,实现可回溯与可复用。
- 建议2:实现自动化故障演练(Chaos Engineering),定期进行灾备演练、数据库恢复演练与流量切换演练。
- 建议3:建立SLA/SLO、错误预算与业务优先级,明确降级策略。
11. 常用命令与脚本片段收集
- 检查HTTP:curl -sS -o /dev/null -w "%{http_code} %{time_total}\n" https://example.com
- 检查端口与进程:ss -tulnp | grep nginx;docker ps --format '{{.Names}} {{.Status}}';mysqldump 和 redis-cli 常用命令。
- 快速回滚示例(git+deploy脚本):git checkout tags/last-stable && ./deploy.sh --env=prod。
12. 事后分析与持续改进
- 步骤1:在事件结束后24小时内完成事故报告,包括时间线、根因、影响范围、恢复动作和待办项。
- 步骤2:根据报告优化监控告警阈值,补充缺失的运行数据点与自动化脚本。
- 步骤3:将关键操作制作成Runbook(可执行脚本),并在团队内进行培训与演练。
13. 问:遇到美国站群区域访问慢,是先查网络还是先查应用?
答:先从外部做网络层面的可用性检测(curl/traceroute/mtr)确认是网络丢包/延迟还是应用响应慢;若外部到LB延迟高则优先联络CDN/网络供应商;若网络正常则进入应用与后端依赖排查。
14. 问:主数据库突发高负载怎么快速缓解?
答:先开启只读模式或限制写入口(限流),并暂时缓解长查询(kill long queries);启动从库读流量分担;若支持,做主从切换并在低峰期回溯根因。
15. 问:如何避免站群在促销期出现大规模不可用?
答:提前进行压测并按业务流量建模,开启自动扩容策略、增加缓存层与CDN缓存,设置熔断与降级策略,准备快速回滚和流量分流方案,并在促销前做演练。
来源:联邦小倩美国站群稳定性评估与故障处理建议分享