RIT-MESH/sre-reliability-platform

GitHub: RIT-MESH/sre-reliability-platform

一个生产级 AWS SRE 作品集项目,以电商 API 为场景展示多可用区高可用架构、IaC、自动化、可观测性与事件响应的端到端实践。

Stars: 0 | Forks: 0

# sre-reliability-platform 一个生产级别的 **站点可靠性工程**(SRE)作品集项目,展示了 在 AWS 上的可靠性、容错能力、可扩展性、可观测性、性能工程、 基础设施即代码、自动化以及事件响应。 它提供了一个小型的电商风格 API(FastAPI + PostgreSQL + Redis),封装在 通过 Terraform 定义的多可用区 AWS 拓扑中,并配备了完整的监控、自动化 脚本、安全的本地故障演练以及 SLO/SLI/错误预算文档。 ## 项目概述 | 领域 | 本项目展示的内容 | | --- | --- | | 可靠性 | 多可用区应用,RDS 多可用区故障转移,Redis 故障转移,重试/超时,优雅关闭,Redis 降级回退至仅数据库模式 | | 可扩展性 | ALB + Auto Scaling Group,基于 CPU 目标追踪和 ALB 请求计数扩展,滚动实例刷新 | | 可观测性 | 本地 Prometheus + Grafana,AWS 中的 CloudWatch 仪表盘/警报 + SNS,结构化 JSON 日志,请求 ID,Prometheus 指标 | | 性能 | Redis 缓存,数据库索引,连接池,Nginx gzip + 缓存头,分页,Locust 负载测试 | | IaC | 模块化 Terraform(网络、安全、计算、数据库、缓存、存储、监控),支持 dev/prod 环境 | | 自动化 | 用于 up/down/validate/terraform 操作/备份/恢复/健康检查/日志/负载测试/事件/恢复的 Bash 脚本 | | 事件响应 | 6 个带有运行手册的本地事件模拟文档;AWS 操作需要明确确认 | | CI/CD | GitHub Actions:lint、测试、tf fmt/validate、Docker 构建/扫描、安全扫描、OIDC 手动部署 | ## 业务问题 一家小型在线商店需要一个 API 来列出和查看商品。业务方 要求**高可用性、低延迟、快速故障恢复以及 具有成本效益的扩展**。本项目展示了 SRE 如何端到端地设计、插桩、 自动化和运维此类服务。 ## 技术栈 AWS · Terraform · Docker / Docker Compose · Python FastAPI · PostgreSQL · Redis · Prometheus · Grafana · CloudWatch · GitHub Actions · Nginx · Locust · Bash/Python ## 架构 ### AWS 架构 ``` flowchart LR User([Users]) --> IGW[Internet Gateway] IGW --> ALB[Application Load Balancer
public subnets, 2 AZs] ALB --> EC2a[EC2 app instance
private subnet AZ-a] ALB --> EC2b[EC2 app instance
private subnet AZ-b] EC2a --> RDS[(RDS PostgreSQL
Multi-AZ)] EC2b --> RDS EC2a --> Redis[(ElastiCache Redis
replication group)] EC2b --> Redis EC2a --> NAT[NAT Gateway] --> Internet((Internet)) EC2a & EC2b --> CW[CloudWatch
logs/metrics/alarms] CW --> SNS[SNS alert topic] EC2a & EC2b --> S3[(S3 ops bucket
backups + logs)] S3 --> S3Backup[(S3 lifecycle
IA -> Glacier)] ``` ### 本地 Docker 架构 ``` flowchart LR Client([Client :8080]) --> Nginx[Nginx :80] Nginx --> App[FastAPI app :8000] App --> PG[(Postgres :5432)] App --> Redis[(Redis :6379)] App --> Prom[Prometheus :9090] Prom --> Grafana[Grafana :3000] Locust[Locust :8089] -. load .-> Nginx ``` 请参阅 [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) 获取完整设计。 ## 可靠性设计 - **多可用区**:应用跨 2 个以上的可用区;RDS 多可用区;带有 自动故障转移的 Redis 复制组(生产环境)。 - **健康检查**:ALB `/health`(存活)和 `/ready`(就绪)探针; ASG ELB 健康检查替换不健康的实例。 - **重试与超时**:带退避机制的数据库重试和有限的连接超时; 带重试的 Redis 受限套接字超时。 - **优雅关闭**:SIGTERM/SIGINT 处理程序在可配置的超时时间内清除进行中的请求。 - **Redis 降级回退**:当 Redis 不可用时,应用在降级模式下由 Postgres 提供服务 —— 用户侧不会出现可见的 5xx 错误。 - **备份**:RDS 自动备份 + 通过 `pg_dump` 手动备份至 S3 并设置生命周期转移到 Glacier;删除时创建最终快照(生产环境)。 ## 容错设计 - 没有任何单一可用区是提供流量的硬依赖(生产环境使用 3 个可用区)。 - 缓存和数据库是独立的故障域;当缓存发生故障时,应用会优雅降级。 - ASG 自动替换发生故障的实例;ALB 停止将流量路由至不健康的 目标。 - 删除保护 + 最终快照可防止数据意外丢失(生产环境)。 ## 可扩展性设计 - ALB 分发流量;基于平均 CPU 使用率进行目标追踪自动扩展 (目标约为 55–65%)。 - 在生产环境中可选择基于 ALB 每个目标的请求数进行扩展。 - 具有最小健康实例比例 50% 的滚动实例刷新。 - 无状态应用的水平扩展;有状态层(DB/Redis)通过只读副本/故障转移 进行垂直扩展。 ## 监控与警报 - **指标**:请求总数、状态码、错误率、延迟直方图 (P50/P95/P99)、DB/Redis 可用性指标、缓存命中/未命中、 进行中的请求。 - **本地**:Prometheus 抓取 + 告警规则 + Grafana 仪表盘配置。 - **AWS**:CloudWatch 仪表盘 + 警报(CPU、不健康目标、5xx 比率、 延迟、RDS 存储/CPU/连接数、Redis CPU/内存) → SNS。 - **日志**:带有请求关联 ID 的结构化 JSON。 请参阅 [`docs/MONITORING.md`](docs/MONITORING.md)。 ## 性能优化 - 商品列表/详情响应的 Redis 缓存(TTL 可配置)。 - 数据库中 `category` 和 `name` 的索引;连接池。 - 针对商品端点的 Nginx gzip 压缩 + `Cache-Control` 头。 - 具有受限页面大小的分页。 - 可配置的 worker 数量;带有报告模板的 Locust 负载测试。 请参阅 [`docs/PERFORMANCE_TESTING.md`](docs/PERFORMANCE_TESTING.md)。 ## 基础设施即代码 位于 `terraform/` 下的模块化 Terraform: ``` bootstrap/ # state bucket, lock table, GitHub OIDC role modules/ # networking, security, compute, database, cache, storage, monitoring environments/ # dev (cost-optimised) and prod (availability-optimised) ``` 请参阅 [`docs/DEPLOYMENT.md`](docs/DEPLOYMENT.md)。 ## 自动化 使用 `make ` 或 `bash scripts/