出现很卡的情况通常由网络、资源和应用三类问题引起。网络层面包括带宽拥塞、攻击(如DDoS)或运营商链路问题;资源层面为CPU、内存、磁盘I/O或数据库连接耗尽;应用层面有代码阻塞、缓存失效或慢查询。
先看资源占用:使用 top、htop、iostat、sar 等工具检查CPU/内存/磁盘;再看网络:使用 ifstat、vnstat、tcpdump、mtr、ping 排查链路和丢包;最后看应用:查看 Web 服务器(nginx/apache)/应用日志和数据库慢查询。
top -b -n1 | head -20;iostat -xz 1 3;ss -s;tcpdump -n -c 1000 host 你的IP
在高峰期不要马上重启服务,先备份日志并记录当前状态以便事后分析。
临时扩容优先选择水平扩容(增加实例)而非垂直扩容(升级单机),因为水平扩容能更快上线且风险小。方案包括启动备用服务器、启用云上弹性伸缩组或临时挂载更多容器副本。
1)准备镜像:使用现有镜像或容器镜像(Docker)快速启动新实例;2)加入负载均衡:将新实例加入现有负载均衡(Nginx upstream、云负载均衡或 LVS);3)同步状态:确保会话或缓存(如 Redis)能够被新实例访问,必要时使用共享会话或 sticky session。
将新实例加入负载均衡:在 nginx upstream 中新增服务器并 reload:nginx -s reload;或在云控制台将实例添加到后端池。
新增实例前务必检查镜像版本和配置一致性,避免配置漂移导致更多问题。
流量分流可以通过 CDN、DNS 解析策略、负载均衡权重、或应用层流量拆分实现。目标是把部分或全部非核心流量转移到其他区域或缓存层,降低台湾节点负载。
1)CDN 缓存:开启静态资源 CDN,尽量把图片、JS、CSS 交由 CDN 返回;2)DNS 加权或 GeoDNS:降低台湾节点权重或把部分请求导向新区域;3)负载均衡/网关流量拆分:在 LB 层配置流量权重;4)应用层路由:使用 nginx 的 split_clients 或 lua 实现灰度分流。
使用 split_clients 根据 IP 或 cookie 分流一部分流量到备用后端:split_clients "${remote_addr}" $variant { 50% A; * B; } 然后根据 $variant 决定 proxy_pass 到不同 upstream。
分流前先降低 DNS TTL(如30秒)以便快速切换,并在非高峰时段优先做小流量验证。
CDN 是最快见效的手段,可以把大量静态和可缓存的动态内容卸载到边缘节点。合理设置 Cache-Control、Etag、Expires,以及对动态接口使用边缘缓存(如 CDN 的动态缓存或缓存键白名单)能显著降低 origin 压力。
1)识别可缓存资源:静态资源、可缓存的 API(比如 60s 缓存);2)调整响应头:设置 Cache-Control:max-age、public;3)配置 CDN 缓存规则:按路径或请求参数缓存,必要时配置按 cookie 例外;4)预热缓存:通过脚本请求热点资源,避免缓存穿透。
使用 curl 或自动化脚本对热门页面和接口并发请求,确保 CDN 节点有热点数据。
对接口进行缓存时注意数据一致性和用户敏感信息,不要缓存带有认证信息的响应。
常见风险包括配置不一致导致错误、会话或状态丢失、DNS 切换延迟、缓存失效造成瞬时高峰、以及安全风险(如扩容暴露更多攻击面)。
1)配置管理:使用基础镜像/容器并通过 IaC(Terraform/Ansible)保证一致性;2)会话共享:采用 Redis/数据库共享会话或使用 token 无状态化设计;3)灰度发布与监控:分批次增流并实时观察指标(RTT、QPS、错误率);4)限流降级:在网关/NGINX 层设置限流(limit_req)和熔断策略,保护后端。
确保有监控告警(Prometheus/Grafana/云监控),配置自动或手动回滚步骤(如降低负载均衡权重、恢复 DNS 指向)。
在应急过程中记录每一步操作(时间、变更项、回滚点),便于事后复盘与改进。