从一次线上故障复盘说起:我是如何用阿里云SLB+ECS+OSS架构,差点搞垮自己网站的
阿里云架构实战一次SLB健康检查引发的网站雪崩与深度修复1. 故障现场凌晨三点的报警风暴那是个再普通不过的周三凌晨我的手机突然开始疯狂震动。打开监控平台满屏的HTTP 503错误像瘟疫般蔓延——公司核心电商网站正在大面积瘫痪。更可怕的是这种故障呈现波浪式扩散最初只是部分用户无法访问商品详情页10分钟后整个支付网关开始超时最终连首页都彻底失去响应。关键故障现象阿里云监控显示SLB健康检查成功率从99.98%暴跌至12.3%ECS CPU使用率异常部分实例持续100%另一些却低于5%OSS外网流量激增300%费用预警短信接踵而至# 紧急排查时使用的SLB状态检查命令 aliyun slb DescribeHealthStatus --LoadBalancerId lb-bp1b6c719dfa08****当我登录SLB控制台时发现了更诡异的现象——同一个服务器组内的ECS实例有的被标记为正常有的却是异常。而这些实例运行的是完全相同的Docker镜像理论上行为应该一致。2. 抽丝剥茧健康检查的致命陷阱2.1 安全组配置的隐藏冲突深入检查发现问题根源在于安全组配置的精细度失控。我们为支付服务ECS配置的安全组规则中错误配置示例{ SecurityGroupRule: { IpProtocol: tcp, PortRange: 443/443, SourceCidrIp: 0.0.0.0/0, Policy: accept } }看似开放的443端口实际上与SLB健康检查机制产生了冲突。阿里云SLB的健康检查流量来自100.64.0.0/10地址段而我们的安全组却未明确放行SLB专用IP段未区分内网/外网访问策略未设置健康检查专用端口关键发现SLB健康检查包被安全组误判为恶意流量导致50%的ECS实例被错误隔离2.2 多米诺骨牌效应随着健康检查失败SLB开始将流量集中到剩余正常实例上引发连锁反应幸存ECS因流量过载出现HTTP 503前端自动重试机制导致请求风暴静态资源回源到OSS产生巨额外网流量CDN缓存失效加剧了OSS压力流量激增对比表时间点正常QPS故障QPSOSS流量(Mbps)00:002,5002,50012000:30-8,70049001:00-12,3008903. 紧急止血三线作战的修复方案3.1 立即措施手动接管流量分配SLB权重调整aliyun slb SetBackendServers --LoadBalancerId lb-bp1b6c719dfa08**** \ --BackendServers [{ServerId:i-bp1g6zv0ce8o****,Weight:100}]安全组紧急更新# 使用Python SDK添加健康检查规则 import aliyunsdkcore from aliyunsdkecs.request.v20140526 import AuthorizeSecurityGroupRequest request AuthorizeSecurityGroupRequest.AuthorizeSecurityGroupRequest() request.set_SecurityGroupId(sg-bp15ed6xe1yx****) request.set_IpProtocol(tcp) request.set_PortRange(80/80) request.set_SourceCidrIp(100.64.0.0/10) request.set_Policy(accept)CDN预热关键静态资源# 使用OSSUTIL进行批量预热 ossutil64 prefetch oss://bucket-name/path/to/file --endpoint oss-cn-hangzhou.aliyuncs.com3.2 架构优化构建弹性防护体系新版安全组设计原则分层隔离web/应用/DB分别独立安全组最小权限精确到端口级的访问控制健康检查专用通道优化后的安全组规则矩阵类型协议端口源IP适用场景SLB-HCTCP8088100.64.0.0/10健康检查专用Internal-APITCP500010.0.0.0/16内部服务通信Public-WEBTCP4430.0.0.0/0对外HTTPS服务3.3 成本控制OSS流量治理方案启用CDN全站加速-- 通过RAM配置CDN访问策略 { Version: 1, Statement: [ { Effect: Allow, Action: oss:GetObject, Resource: acs:oss:*:*:mybucket/*, Condition: { StringLike: { acs:Referer: [https://www.example.com/*] } } } ] }设置OSS生命周期规则LifecycleConfiguration Rule IDtransition-to-ia/ID Prefixlogs//Prefix StatusEnabled/Status Transition Days30/Days StorageClassIA/StorageClass /Transition /Rule /LifecycleConfiguration4. 防患未然构建四层监控体系4.1 实时健康检查看板使用云监控CMS搭建的监控看板应包含SLB健康检查成功率ECS实例异常率对比安全组规则命中次数OSS外网流量突增告警Prometheus监控规则示例groups: - name: slb_healthcheck rules: - alert: SLBHealthCheckCritical expr: sum(rate(slb_health_check_failed_total[1m])) by (slb_id) / sum(rate(slb_health_check_total[1m])) by (slb_id) 0.3 for: 5m labels: severity: critical annotations: summary: SLB {{ $labels.slb_id }} 健康检查失败率超过30%4.2 混沌工程测试方案建立常态化故障演练机制网络隔离测试# 模拟安全组误操作 iptables -A INPUT -p tcp --dport 8088 -j DROP负载突增测试# 使用Locust模拟流量激增 from locust import HttpUser, task class StressTest(HttpUser): task def get_product(self): self.client.get(/product/123)故障切换演练# Terraform模拟ECS实例故障 resource alicloud_instance web { count 2 # ... } resource null_resource kill_instance { triggers { instance_id alicloud_instance.web[0].id } provisioner local-exec { command aliyun ecs StopInstance --InstanceId ${alicloud_instance.web[0].id} } }5. 价值提炼从故障中学到的五个认知健康检查不是银弹必须与安全组、ACL等协同设计故障传播速度远超预期需要建立级联熔断机制成本失控可能加剧故障流量治理应作为架构基础能力监控需要立体视角从SLB到OSS的全链路观测人为响应总有延迟必须实现关键环节的自动修复这次事故后我们团队建立了架构评审的三问机制这个变更会影响健康检查吗故障时流量会如何重新分配是否有实时监控可以立即发现问题当你在阿里云架构中组合使用SLB、ECS和OSS时记住它们之间的交互远比表面看起来复杂。真正的稳定性不在于单个服务的SLA而在于如何让这些服务像精密的齿轮组一样协同工作——每个齿牙的咬合角度都需要精心校准。