AWS 可靠性最佳实践:从架构设计到故障恢复一把梭
可靠性支柱到底是啥先来一个简明定义AWS Well-Architected Framework 的可靠性支柱关注的是工作负载如何正确地、一致地执行其预期功能并在中断时快速恢复。说白了就这九字真言不出事出了能修修得快。整个支柱分为 5 个核心设计原则我整理了一个表格方便对照设计原则核心思想一句话说人话自动恢复检测故障后自动修复/替换无需人工介入机器自己修自己别等着运维被告警惊醒水平扩展通过增加实例数量来吸收流量波动而非升级单体扛不住了就加机器扛得少就缩回去冗余部署跨多个可用区AZ甚至多区域Region部署鸡蛋别放一个篮子里可观察性全面收集指标日志链路快速定位异常出了事你要能知道在哪、为什么灾难恢复定义 RTO/RPO并演练备份/恢复流程真到了救火的时候有预案不乱下面我逐一展开讲讲实战中的做法和踩过的坑。1. 自动恢复让机器学会“自愈”自动恢复是最基础也是最重要的设计原则。它不是一个功能而是一整套机制健康检查 自动替换ALB/NLB 健康检查后端实例挂了 ALB/NLB 自动摘除不转发流量。Auto Scaling 的自动替换ASG 检测到 EC2 状态异常如 StatusCheckFailed后自动 terminate 重新拉起。弹性伸缩策略基于 CPU/Mem/请求数/队列数等指标的伸缩策略让集群自动适应流量变化。我之前的项目里有个生产环境出现过一次 EC2 底层硬件故障结果 ASG 自愈机制在 2 分钟内自动替换掉了故障实例业务几乎无感。运维同学第二天看到 CloudWatch 告警历史才反应过来——这才是理想的自愈体验。Notes: 自动恢复的关键在于检测(这不又到我的监控老本行了嘛)。你需要在健康检查上定义合理的阈值既不要太敏感误报也不要太迟钝故障扩散。一般建议设置 3 次连续的失败才标记为不健康。2. 水平扩展别再做“大就是好”这种蠢事传统运维思维是“扛不住就升级配置”(垂直扩容)但云原生时代这玩意儿不香了。水平扩展的核心是通过增加实例数量来分摊负载(水平扩容)而不是升级单实例规格。具体做法使用Auto Scaling Group管理 EC2 实例池定义最少/最多/期望实例数基于CloudWatch 指标如 CPU 70%、ALB 请求数 阈值触发伸缩Scheduled Scaling对已知流量高峰如促销、季度末结算提前扩容Predictive Scaling基于 ML帮你预测未来流量趋势自动提前扩容示例某司一个承保系统原来固定 3 台 c5.2xlarge 跑每到月底就告警。后来改成 ASG 基于 CPU 和请求数的伸缩策略平时 3~4 台月底自动扩到 8 台之后缩回。成本没增加多少但再也没有因为流量高峰出过告警。3. 冗余部署鸡蛋放 N 个篮子里冗余部署的核心是消除单点故障SPOF。在 AWS 上最基础的做法就是跨 AZ 部署。多 AZ 部署的最佳实践应用层EC2/ECS/EKS 至少部署到 3 个可用区数据层RDS Multi-AZ同步备用实例、Aurora跨 AZ 自动故障转移缓存层ElastiCache 集群模式跨 AZ 复制组DNS 层Route53 多值路由/故障转移路由我见过一个经典的配置某客户在单 AZ 部署了 OpenSearch 集群结果 AZ 故障后数据丢失了 8 小时的数据。最后重建索引花了整整 3 天。这就是典型的省钱省出大麻烦。声明: 这里不是说一定要所有组件都跨 AZ。对于非关键组件开发环境、内部工具单 AZ 可以接受。但生产环境的核心业务起码两 AZ 起步强烈建议三 AZ。关于 Route53 的“DNS 容错”很多人容易忽略 DNS 层的容错设计。你可以通过 Route53 的多值路由Multi-Value Answer Routing或故障转移路由Failover Routing来实现跨 Region/跨 AZ 的自动切换。比如基于 Route53 的健康检查一旦某个 ALB 不可用DNS 自动将流量导向备用 ALB。这玩意儿对读取类业务特别有用。4. 可观察性出事了你得知道在哪、为什么没有可观察性你连系统是不是正常都不知道更别提自动恢复了。AWS 提供的主打工具是 CloudWatch X-Ray。CloudWatchMetricsEC2/EBS/ALB/RDS 等核心指标全覆盖Logs集中收集各类日志应用日志、系统日志、VPC Flow LogsAlarms基于指标阈值触发告警配合 SNS 发送通知Composite Alarms多个条件组合判断减少误报X-Ray服务映射可视化应用的调用链追踪分析找出慢调用、错误调用、依赖关系与 CloudWatch 联动通过 X-Ray 追踪头信息定位具体问题我个人最推荐的组合CloudWatch 做指标告警 X-Ray 做链路追踪 CloudWatch Logs Insights 做日志分析。这样一旦告警触发你可以一键跳到具体日志和时间段快速定位根因。当然, AWS 的这套比较贵, 替换为 Prometheus 各种开源 Tracing (如 Jaeger, Zipkin 等) 可以更灵活地监控和分析。5. 灾难恢复别等出大事才后悔灾难恢复DR是可靠性的最后一道防线。核心指标是RTO恢复时间目标和RPO恢复点目标。AWS 上常见的 DR 策略从 RTO/RPO 长到短排序策略描述适用场景备份 恢复定期备份数据到 S3/Glacier灾难时重新部署开发/测试环境成本优先Pilot Light启动一小部分核心服务做 DR灾难时扩到全量关键业务但预算有限Warm Standby启动一个缩小版的 DR 环境可快速切换核心生产业务Multi-Site Active/Active多 Region 同时提供服务无切换时间对高可用要求极高的业务如金融交易我比较推荐的做法是至少做到 Warm Standby 级别。对于保险科技这样的行业RTO 超过 30 分钟基本上就是不行的RPO 最好控制在 5 分钟内。(当然, 代价是成本就上去了) 之前有朋友问我这玩意儿不是有 Multi-AZ 就行了干嘛搞 DR回答Multi-AZ 解决的是 AZ 级别的故障但遇到 Region 级别的问题比如整个区域断网、自然灾害、美伊战争你就抓瞎了。DR 就是为了应对这种极端情况。写到这里回头看看AWS 可靠性设计说到底就是一句话承认故障会发生提前准备好应对方案。核心其实就那几件事自动恢复用健康检查 自动替换让系统自愈水平扩展实例不够就加多了就缩别跟单机死磕冗余部署跨 AZ 部署Route53 做 DNS 容错