Files
docs/阿里云生产环境选型压测与上线手册.md
2026-09-17 10:57:21 +08:00

661 lines
31 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 阿里云生产环境选型、压测与上线手册
> 适用范围:虫虫出海国内头程与海外仓系统首次生产部署。
>
> 读者:初次负责生产运维的开发、测试和运维人员。
>
> 本文只提供选型、建设、压测和验收步骤,不授权创建、变更或删除任何阿里云生产资源,也不替代阿里云账单确认、安全评审和业务上线审批。
## 1. 先给结论
当前开发、测试环境采用单宿主机共置,8 核 32 GB 已接近占满。生产环境不建议在同一台机器上为相同服务强行启动两个实例:同机双实例只能防单进程故障,不能防宿主机、磁盘、网络或 Docker 故障,还会进一步挤压内存。
首次生产建议:
- 国内、海外分别建设独立部署单元,遵守《[双区域部署与 Nacos 规划](双区域部署与Nacos规划.md)》;
- 每个区域至少两台应用 ECS,核心服务在不同 ECS 上各运行一个实例;
- MySQL、Redis、Nacos、RocketMQ 优先使用阿里云托管服务,降低新手自建集群的运维风险;
- 国内和海外分别创建私有 OSS Bucket,文件不再依赖单机 `/data/files`;
- 上线前先在隔离的预发布环境压测,禁止第一次满负载压测直接打生产;
- 先设置 JVM 与容器资源上限,再决定 ECS 规格,不能直接把开发机占用乘以实例数采购。
生产目标拓扑:
```text
国内区域 production-cn
Internet
-> WAF(可选)/ ALB
-> ECS-CN-A: gateway + 国内核心服务副本 A
-> ECS-CN-B: gateway + 国内核心服务副本 B
RDS MySQL 高可用(国内 Schema)
Tair/Redis 高可用(国内会话、幂等与缓存)
MSE Nacos(国内实例)
RocketMQ(国内实例)
OSS-CN(国内文件)
海外区域 production-overseas
Internet
-> WAF(可选)/ ALB
-> ECS-OS-A: gateway-overseas + lastleg/warehouse-overseas 副本 A
-> ECS-OS-B: gateway-overseas + lastleg/warehouse-overseas 副本 B
RDS MySQL 高可用(海外 Schema)
Tair/Redis 高可用(海外本地数据)
MSE Nacos(海外实例)
RocketMQ(海外实例)
OSS-OS(海外文件)
跨区域仅开放:海外 Token/JWKS、受保护的双区域 API、Event Bridge/MQ 事件链路。
```
如果首期预算只能支撑一台生产 ECS:每个服务先运行一个实例,做好备份、监控和快速重建,不做同机伪双实例。准备好第二台 ECS 后,再把核心服务分布到两台机器。
## 2. 生产上线前必须补齐的工程差距
当前 Compose 可以用于开发、测试,但不能直接视为生产高可用方案:
1. 多数服务没有明确的容器内存限制和 JVM `Xms/Xmx`;同一宿主机上多个 JVM 可能共同耗尽内存。
2. Compose 使用固定 `container_name` 和宿主机端口,单机内不能直接横向扩展同一服务。
3. File 服务使用宿主机目录 `/data/files`;多机器部署后不同节点无法看到同一文件。
4. 国内、海外生产 Nacos、Redis、数据库和 Event Bridge 仍需按双区域规划落地并验收。
5. 多个模块存在 `@Scheduled` 调度器。部分 Outbox、Event Bridge 和船期任务已有数据库租约,但不能因此认定所有任务都可安全多实例运行。
6. 跨服务默认 URL 中仍可能出现 Compose 服务名;跨机器部署时应改成 Nacos 服务发现、区域内负载均衡地址或稳定内网域名。
上线门禁:
- API 实例可扩为 2 个;
- 未验证的定时任务/Worker 先保持 1 个;
- File 服务完成 OSS 适配后才能跨机器扩容;
- 所有服务具备健康检查、优雅停机、超时、重试和连接池上限;
- 数据库变更、生产部署和真实压测分别审批,不互相隐含授权。
## 3. 阿里云账号、地域和网络
### 3.1 账号安全
- 日常操作使用 RAM 用户,不使用主账号 AccessKey;
- 开启 MFA;
- 按职责授予最小权限,不直接长期授予 `AdministratorAccess`;
- 应用访问 OSS 等云资源时优先使用 ECS RAM 角色或临时凭证,不把长期 AccessKey 写进源码、Nacos、镜像或 Jenkins 日志;
- 国内和海外资源使用资源组、标签和费用中心区分,例如 `env=prod`、`region-role=cn/overseas`、`system=baiyue`。
### 3.2 地域选择
- 国内 ECS、RDS、Tair、MSE、RocketMQ、OSS、ALB 应在同一阿里云地域和 VPC,通过内网访问;
- 海外资源选择靠近主要海外仓、网络合规允许的地域,不能仅按价格选择;
- 国内与海外数据库、Redis、Nacos、OSS 分开,不做业务服务跨境直连数据库;
- 地域创建后通常不能直接修改,购买前先确认仓库位置、网络延迟、数据合规和对应产品是否在售。
### 3.3 VPC 与安全组
每个区域建议:
```text
一个生产 VPC
├─ 可用区 A 应用交换机
├─ 可用区 B 应用交换机
├─ 可用区 A 数据交换机
└─ 可用区 B 数据交换机
```
安全组原则:
- 互联网只进入 ALB/WAF 的 80/443;
- ECS 不直接暴露 MySQL 3306、Redis 6379、Nacos 8848/9848、RocketMQ 或 Actuator 管理端口;
- 数据服务白名单只允许生产 VPC/应用安全组;
- SSH 只允许堡垒机或固定运维出口,并优先使用密钥登录;
- 国内到海外只开放已经确认的 HTTPS/JWKS/Event Bridge 端口和来源白名单。
## 4. ECS 与应用实例怎么选
### 4.1 先测量,后采购
开发环境先连续采集一天或完整业务回归周期:
```powershell
docker stats
```
记录每个容器:
| 指标 | 记录方式 | 用途 |
|---|---|---|
| 内存常态/峰值 | 每 1~5 分钟采样 | 计算 JVM 和容器上限 |
| CPU 常态/峰值 | 高峰与批处理时段 | 计算 ECS 核数 |
| GC 暂停、堆占用 | JVM 指标/APM | 判断是否只是堆配置过大 |
| 数据库连接数 | RDS/连接池监控 | 防止多实例后连接翻倍 |
| 容器重启/OOM | Docker 与系统日志 | 找出不稳定服务 |
| 磁盘和日志增长 | `df`、日志平台 | 计算磁盘及保留周期 |
每个 Java 服务先设置:
```text
容器内存上限 > JVM Xmx + 非堆内存 + 线程栈 + Native 内存
```
示例不是统一生产值:
```text
轻服务:容器 1.5 GB,Xms 256 MB,Xmx 768 MB
普通业务服务:容器 3 GB,Xms 512 MB,Xmx 2 GB
File/导出类服务:根据并发文件大小单独测量,不能照抄
```
内存验收应保留至少 25%~30% 宿主机余量;CPU 长期不超过约 60%~70%,为故障切换后单机接管流量留空间。
### 4.2 初始购买建议
没有压测数据前,不把以下规格当成最终答案:
- 预发布:可先用 8 核 32 GB,拆出 MySQL、Redis、Nacos、MQ 后重新观察;
- 生产应用节点:可以两台 16 核 64 GB 作为评估起点,但必须用压测结果确认,可能需要降配或增加第三台;
- 系统盘与数据盘分开,日志写数据盘并设置轮转;
- 两台 ECS 放在同地域不同可用区,由 ALB 做健康检查和流量转发。
应用实例建议:
| 服务 | 首次生产实例数 | 说明 |
|---|---:|---|
| `gateway`、`gateway-overseas` | 每区域 2 | 放在不同 ECS/可用区 |
| `auth` | 国内 2 | 统一账号入口,Redis/RDS 也需高可用 |
| `firstleg`、`order`、国内 `warehouse` | 国内各 2 | 国内核心链路 |
| `lastleg-service`、`warehouse-overseas-service` | 海外各 2 | 海外仓核心链路 |
| `iam`、`finance` | 初期可 1,稳定后 2 | 接受单服务维护窗口时可暂缓 |
| `file` | OSS 改造完成后 2 | 本地目录模式禁止跨机器双实例 |
| `integration`、`print`、`audit` | 初期 1 | 结合业务中断容忍度调整 |
| Event Bridge/定时 Worker | 初期 1 | 完成并发领取和幂等演练后再扩 2 |
## 5. 负载均衡 ALB
国内和海外各创建一个 ALB:
1. 进入“应用型负载均衡 ALB”控制台,选择与 ECS 相同地域和 VPC;
2. 在两个可用区分别选择交换机;
3. 创建 HTTPS 监听 443,绑定证书;HTTP 80 只用于跳转 HTTPS;
4. 创建服务器组,将两台 Gateway ECS 加入服务器组;
5. 健康检查协议选 HTTP,路径使用 `/actuator/health` 或单独的轻量 `/healthz`;
6. 健康检查只验证实例能否接流量,不执行写数据库等重操作;
7. 配置连接空闲超时、请求超时、最大请求体和上传超时;
8. 开启访问日志,监控后端 5xx、健康实例数和响应时间;
9. 发布时先将新实例加入服务器组,小流量验证,再摘除旧实例。
ALB 会持续健康检查并自动屏蔽异常后端,具体配置见阿里云《[配置和管理健康检查](https://help.aliyun.com/zh/slb/application-load-balancer/alb-health-check)》。
## 6. RDS MySQL 高可用怎么选
### 6.1 推荐选择
国内、海外各购买一套独立 RDS MySQL:
| 控制台选项 | 首次生产建议 |
|---|---|
| 数据库引擎 | 与当前代码一致的 MySQL 8.0;升级到 8.4 前先做兼容验证 |
| 产品系列 | 高可用系列;业务规模和 RPO 要求进一步提高时评估集群系列 |
| 部署方案 | 多可用区,主备位于不同可用区 |
| 规格类型 | 核心业务优先独享规格;预算有限可先通用规格压测 |
| 网络 | 与本区域 ECS 相同 VPC,只开内网地址 |
| 存储 | 根据压测选择 ESSD/高性能云盘或本地盘,预留 30% 以上空间 |
| 备份 | 自动全量备份 + 日志备份/时间点恢复,定期做恢复演练 |
| 白名单 | 只允许生产应用安全组/VPC,不开放 `0.0.0.0/0` |
高可用系列是一主一备,适合大多数生产场景;多可用区可实现同地域可用区级容灾。阿里云创建说明和系列对比见《[创建 RDS MySQL 实例](https://help.aliyun.com/zh/rds/apsaradb-rds-for-mysql/create-an-apsaradb-rds-for-mysql-instance-1)》和《[RDS MySQL 选型指南](https://help.aliyun.com/zh/rds/apsaradb-rds-for-mysql/selection-guide)》。
### 6.2 初始规格如何估算
首次可把 `4 核 16 GB` 作为压测候选规格,不作为直接采购结论。满足以下任一条件时升配:
- CPU 高峰持续超过 70%;
- 活跃连接接近实例上限的 70%;
- IOPS/吞吐接近规格上限;
- Buffer Pool 命中率持续偏低且内存成为瓶颈;
- P95/P99 SQL 延迟超过业务目标;
- 主备复制或备份明显影响业务。
国内多个服务初期可以共用一个国内 RDS 实例、保持独立 Schema;海外使用另一个 RDS 实例并保持独立 Schema。不要为了“微服务形式”在首期机械地每个服务购买一套 RDS,但必须保留数据库账号和 Schema 权限隔离。
### 6.3 必做配置
- 为每个服务创建独立数据库账号,只授予所属 Schema 权限;
- 连接串使用内网地址和 TLS;
- HikariCP 等连接池设置最大连接数,实例扩容时计算“单实例连接数 × 应用实例数”;
- 打开慢 SQL、性能洞察和磁盘告警;
- 设置自动备份和保留周期,关键上线前创建手工备份;
- 每季度至少做一次“从备份恢复到新实例”的演练;只看到备份成功不等于可恢复;
- 应用具备连接重建能力,演练 RDS 主备切换时不能依赖旧连接永久有效。
## 7. Tair/Redis 高可用怎么选
国内、海外各购买一个独立实例:
| 控制台选项 | 首次生产建议 |
|---|---|
| 产品 | 云数据库 Tair(兼容 Redis),选择与当前客户端兼容的 Redis 版本 |
| 架构 | 标准架构高可用,不选单节点 |
| 可用区 | 多可用区主备 |
| 规格 | 初期可从 4 GB 候选规格压测,再按内存、带宽和连接数调整 |
| 网络 | 与应用相同 VPC,只用内网地址 |
| 认证 | 开启密码/账号 ACL,凭据由生产密钥系统注入 |
标准高可用采用主备架构并支持故障切换,单节点不建议用于生产。只有单分片容量、带宽或 QPS 确实不足时才升级集群架构;读请求远高于写请求时再评估读写分离。官方架构说明见《[Tair 产品架构概述](https://help.aliyun.com/zh/redis/product-overview/product-architecture/)》和《[标准架构](https://help.aliyun.com/zh/redis/product-overview/standard-master-replica-instances)》。
必须监控:
- 内存使用率和内存碎片率;
- 连接数、连接失败和带宽;
- CPU、命令延迟、慢查询;
- `evicted_keys`、过期 Key、热点 Key 和大 Key;
- 主备切换事件。
应用要求:
- 连接池必须支持断线重连;
- Session、Token 和幂等 Key 设置明确 TTL;
- Redis 不作为不可恢复的唯一业务事实来源;
- 海外服务不得访问国内 Redis。
## 8. OSS 怎么开、怎么接
本节说明云资源开通和通用上线要求。File Service 的已冻结接入方式、代码边界、失败处理、双区域文件链路和评审结论以《[阿里云 OSS 文件中心接入设计与评审](阿里云OSS文件中心接入设计与评审.md)》为准。
### 8.1 必须创建两个 Bucket
建议命名,实际名称需增加公司/账号随机后缀以满足全局唯一:
```text
baiyue-prod-cn-files-<suffix>
baiyue-prod-overseas-files-<suffix>
```
国内文件进入国内 Bucket,海外现场照片和海外业务文件进入海外 Bucket。禁止海外应用为了省事直接把文件写入国内 Bucket。
### 8.2 控制台创建步骤
1. 登录 OSS 控制台并开通 OSS;
2. 进入 Bucket 列表,单击“创建 Bucket”;
3. 地域选择对应应用 ECS 所在地域;
4. 存储类型首次选“标准存储”;
5. 数据冗余生产优先选择 ZRS 同城冗余,测试可用 LRS;
6. 读写权限选择“私有”;
7. 开启“阻止公共访问”;
8. 开启服务端加密:普通合规要求可先选 SSE-OSS/AES-256;必须自主管理密钥时选 SSE-KMS;
9. 开启版本控制,防止覆盖和误删;
10. 开启访问日志或接入日志服务;
11. 创建完成后记录内网 Endpoint、Bucket 名称和地域,不记录 AccessKey;
12. 为 File 服务绑定 RAM 角色或最小权限 RAM 策略,只允许指定 Bucket/前缀的必要读写操作。
OSS 官方控制台步骤见《[OSS 控制台快速入门](https://help.aliyun.com/zh/oss/user-guide/console-quick-start/)》。生产建议 ZRS,Bucket 必须私有并开启阻止公共访问,相关能力见《[Bucket 概览](https://help.aliyun.com/zh/oss/user-guide/oss-bucket-overview)》和《[阻止公共访问](https://help.aliyun.com/zh/oss/user-guide/how-to-prevent-the-creation-of-public-read-and-write-buckets)》。加密方式见《[OSS 数据加密](https://help.aliyun.com/zh/oss/user-guide/data-encryption/)》。
### 8.3 访问方式
- 浏览器/PDA 不持有 OSS 长期 AccessKey;
- 第一阶段上传和下载统一由 File 服务中转,保留现有 Admin、Client、PDA 接口和业务权限校验;
- 短时上传凭证和预签名下载 URL 属于第二阶段优化,只有真实上传耗时、失败率或带宽指标证明需要时才启用;
- URL 有效期尽量短,日志不得记录完整签名 URL;
- Bucket 不设公共读,不能把“知道 URL”当作权限控制;
- 第一阶段不需要 OSS CORS;启用 Web 直传时只允许正式 Admin/Client 域名和必要方法/Header,不使用任意来源 `*`;PDA 原生上传不依赖浏览器 CORS。
### 8.4 生命周期建议
先按文件类别划分前缀:
```text
evidence/ 现场证据和业务照片
documents/ 单证与凭证
exports/ 临时导出文件
temp/ 临时上传
logs/ OSS 访问日志
```
建议初始规则:
- 未完成的分片上传:7 天自动清理;
- `temp/`:7~30 天清理,前提是确认没有业务引用;
- `exports/`:根据产品约定 7~30 天清理;
- 历史版本:可在 90~180 天后转低频或删除,但必须先确认审计和凭证保留要求;
- `evidence/`、`documents/`:未获得财务、法务和产品明确保留期前禁止自动删除;
- 冷数据转低频/归档前确认最低存储时长和取回费用。
生命周期规则也会影响存量对象,API 更新规则具有覆盖语义,详细机制见《[OSS 生命周期概述](https://help.aliyun.com/zh/oss/user-guide/overview-54/)》。
### 8.5 代码改造门禁
开通 OSS 不代表应用自动支持 OSS。当前 File 服务仍使用 `/data/files`,需要完成:
- OSS SDK 与存储适配层;
- Bucket、Endpoint、地域、前缀配置;
- RAM 角色/临时凭证接入;
- 上传内容类型、大小、用途和客户范围校验;
- 文件元数据仍落 File 数据库,业务表只保存稳定 `fileId`;
- 第一阶段服务端流式上传/下载;第二阶段按监控结果决定是否增加预签名上传/下载 URL;
- 上传失败、重复提交、超时、断点续传和孤儿对象清理;
- 国内/海外 Bucket 路由;
- 迁移或测试文件的校验方案。
完成自动化测试和真实 OSS 测试 Bucket 验收后,才能移除生产本地文件卷。
## 9. Nacos:优先使用 MSE
对于新手运维,不建议自己在 ECS 上维护 Nacos 三节点、数据库、升级和故障恢复。国内、海外分别创建 MSE Nacos 实例:
1. 进入 MSE 控制台;
2. 选择“注册配置中心 > 创建实例”;
3. 引擎选择 Nacos,版本与现有 Spring Cloud Alibaba 客户端兼容;
4. 地域、VPC、交换机选择本区域生产网络;
5. 中小规模生产可评估 MSE Serverless;明确要求固定资源和集群节点时选择专业版;
6. 专业版高可用至少 3 节点;开发版单节点不能作为正式高可用生产配置;
7. 开启鉴权,关闭公网白名单,不暴露管理端口;
8. 国内、海外使用不同实例,不依赖跨区域 Namespace;
9. 数据库密码、JWT 私钥和内部 Token 不写 Nacos 明文,使用 Jenkins Credentials/KMS/密钥管理系统注入;
10. 上线前验证配置发布、服务注册、实例下线和故障切换。
MSE 创建与节点要求见阿里云《[创建 Nacos 实例](https://help.aliyun.com/zh/mse/user-guide/create-an-instance)》。
## 10. RocketMQ:优先使用云消息队列
国内、海外分别建立本区域 RocketMQ 实例。选型前核对当前 Java Client、协议、Topic、Consumer Group、事务/延时消息和 ACL 与阿里云实例版本兼容。
首次建议:
- 不选早期单机实例;
- 业务事件量不确定时先用按量/Serverless 做预发布验证;
- 财务、跨区域 Event Bridge 等要求堆积消息也具备多可用区数据高可用时,选择支持跨可用区数据复制的实例类型;
- Topic、Consumer Group 按 `prod-cn`、`prod-overseas` 和业务域命名隔离;
- 开启 ACL、VPC 访问、消息堆积量和最老消息年龄告警;
- 保留数据库 Outbox/Inbox 幂等与重试,不能因为使用托管 MQ 就删除业务可靠性设计。
阿里云 RocketMQ 5.x 除早期单机版外默认具备多可用区服务高可用;跨可用区消息数据同步能力取决于实例系列,见《[RocketMQ 实例容灾](https://help.aliyun.com/zh/apsaramq-for-rocketmq/cloud-message-queue-rocketmq-5-x-series/security-and-compliance/instance-disaster-recovery)》。
## 11. 压测前准备
### 11.1 压测环境
推荐建立 `staging`/预发布环境:
- 拓扑、JVM 参数、RDS/Tair 架构与生产一致;
- 规格可以缩小,但必须记录缩放比例,不能直接把小规格结果当生产结果;
- 使用独立数据库、Redis、MQ Topic、OSS Bucket/前缀和测试账号;
- 测试数据必须脱敏,不复制真实客户密码、Token、证件、单证和照片;
- 禁止压测请求进入生产支付、短信、邮件、船司、OCR、Amazon 等第三方真实接口;使用沙箱或明确 Mock;
- 压测前建立监控面板和停止开关;
- 明确执行时间、负责人、目标 RPS、最大 RPS、持续时间和停止条件。
### 11.2 选择业务场景
不能只压 `/actuator/health`。至少覆盖:
| 场景 | 建议比例 | 注意事项 |
|---|---:|---|
| 登录/刷新 Token | 5% | 避免触发真实账号锁定;使用专用账号池 |
| 列表、详情和权限读取 | 45% | 模拟常见筛选、分页和不同客户 |
| 下单/入库/状态推进 | 20% | 每次使用唯一业务号和幂等键 |
| PDA 批量扫码提交 | 10% | 模拟真实批量大小,不逐码伪造提交 |
| 海外入仓、库存、托盘查询 | 10% | 请求直接进入海外 Gateway |
| 文件上传/下载 | 5% | 与普通 API 分开测,设置文件大小分布 |
| 导出、事件和异步任务 | 5% | 观察 MQ 堆积、Worker 吞吐和最终一致性 |
比例必须根据未来真实业务调整。写场景压测后要有测试数据清理方案,但不得用广泛删除 SQL 清理生产。
### 11.3 没有线上数据时怎么估算 RPS
先估算高峰小时的真实业务事务数:
```text
平均 RPS = 高峰小时请求总数 / 3600
容量目标 RPS = 预计峰值 RPS × 2
瞬时并发 ≈ RPS × 平均响应时间(秒)
```
示例:高峰一小时预计 36,000 次 API 请求,平均约 10 RPS;考虑仓库集中操作和增长,预计峰值按 30 RPS,压测容量目标可先设 60 RPS,而不是直接从 1,000 RPS 开始。
阿里云 PTS 支持并发和 RPS 两种压力模型;容量规划更适合从 RPS 模式开始。RPS 模式下响应越慢,工具为了维持吞吐会积累更多并发,因此必须设置停止条件。参考《[PTS 压力模型](https://help.aliyun.com/zh/pts/performance-test-pts-2-0/user-guide/stress-model-1)》和《[RPS 与并发计算](https://help.aliyun.com/zh/pts/how-is-concurrency-calculated-in-rps-mode)》。
## 12. 压测执行步骤
### 12.1 分阶段施压
不要一步打满:
| 阶段 | 压力 | 建议持续时间 | 目的 |
|---|---:|---:|---|
| 冒烟 | 1~5 RPS | 5 分钟 | 验证脚本、数据和监控 |
| 基线 | 预计峰值的 25% | 10 分钟 | 获得无压力基线 |
| 爬坡 | 50%、75%、100% | 每档 10~15 分钟 | 找出首个瓶颈 |
| 稳态 | 100% 容量目标 | 60 分钟 | 观察内存泄漏、连接池和堆积 |
| 峰值 | 150%~200% 预计峰值 | 5~10 分钟 | 验证限流和降级 |
| 恢复 | 降回 10% | 10 分钟 | 确认队列、连接和 RT 恢复 |
初始验收参考值,需要产品和技术负责人确认后才成为正式 SLO:
- HTTP/业务非预期错误率 `< 0.5%`;
- 普通查询 P95 `< 500 ms`;
- 核心写操作 P95 `< 1 s`;
- CPU 稳态 `< 70%`;
- 宿主机和容器内存稳态 `< 75%`,压测结束后能回落;
- RDS 连接、IOPS、吞吐均不超过规格上限的约 70%;
- Redis 无持续淘汰、连接失败和热点 Key 风暴;
- MQ 堆积能在规定时间内清空,Outbox/Inbox 无持续增长;
- 任一应用节点下线后剩余节点能接管目标流量。
立即停止条件:
- 错误率持续超过 5%;
- P95 持续超过目标 3 倍;
- 数据库、Redis、MQ 出现不可恢复错误;
- 生产或第三方真实系统被误调用;
- CPU/内存/连接数接近耗尽;
- 出现数据跨客户、重复扣费、重复状态推进或不可清理脏数据。
### 12.2 使用阿里云 PTS
1. 开通 PTS,进入“性能测试 > 创建场景 > PTS 压测”;
2. 每个业务会话配置串行 API,例如登录 → 列表 → 详情;不同业务会话并行;
3. URL 使用预发布域名,不使用生产域名;
4. Token、账号、业务号通过参数文件和变量传递,不写进场景名称或公开报告;
5. 容量规划优先选 RPS 模式,从低 RPS 开始;
6. 设置爬坡时间、最大 RPS、持续时间、请求超时和停止条件;
7. 开启 ECS、RDS、Tair、ALB、JVM/APM 和 RocketMQ 监控关联;
8. 先调试 1 个虚拟用户,确认不会操作真实数据;
9. 发起正式压测并实时观察错误率、RT、资源和日志;
10. 导出报告,记录压测版本、环境、数据规模、RPS、P95/P99、瓶颈和结论。
PTS 官方流程见《[PTS 快速入门](https://help.aliyun.com/zh/pts/performance-test-pts-3-0/getting-started/pts-pressure-test-quick-start)》。PTS 会产生费用,发起前核对资源包和预计量级。
### 12.3 使用 k6 做低成本预压测
先安装 k6,再创建本地临时脚本;Token 通过环境变量传入,禁止提交:
```javascript
import http from 'k6/http'
import { check, sleep } from 'k6'
export const options = {
scenarios: {
api_capacity: {
executor: 'ramping-arrival-rate',
startRate: 2,
timeUnit: '1s',
preAllocatedVUs: 20,
maxVUs: 200,
stages: [
{ target: 10, duration: '5m' },
{ target: 30, duration: '10m' },
{ target: 60, duration: '10m' },
{ target: 60, duration: '30m' },
{ target: 5, duration: '5m' }
]
}
},
thresholds: {
http_req_failed: ['rate<0.005'],
http_req_duration: ['p(95)<500']
}
}
const baseUrl = __ENV.BASE_URL
const token = __ENV.ACCESS_TOKEN
export default function () {
const response = http.get(`${baseUrl}/api/platform/v1/example?page=1&size=20`, {
headers: {
Authorization: `Bearer ${token}`,
'X-Request-Id': `load-${__VU}-${__ITER}`
},
timeout: '5s'
})
check(response, {
'HTTP 200': (value) => value.status === 200,
'业务成功': (value) => String(value.json('code')) === '200'
})
sleep(0.2)
}
```
运行时只使用预发布地址:
```powershell
$env:BASE_URL='https://staging-api.example.com'
$env:ACCESS_TOKEN='<专用压测账号的短时Token>'
k6 run .\load-test.js
Remove-Item Env:ACCESS_TOKEN
```
不要把 Token 放进脚本、Git、终端截图或压测报告。写接口必须生成唯一幂等键并使用专用数据集。
## 13. 高可用与故障演练
通过容量压测后,保持约 30%~50% 目标流量执行:
1. 摘除/停止一台 Gateway ECS,验证 ALB 健康检查和剩余实例接管;
2. 滚动发布一个业务服务,验证请求无明显中断;
3. 在变更窗口执行 RDS 主备切换演练,验证连接池自动恢复;
4. 执行 Tair 主备切换演练,验证 Session、Token 和幂等请求行为;
5. 暂停 MQ 消费者,制造受控堆积,再恢复并验证 Outbox/Inbox 最终清空;
6. 停止 Event Bridge Worker,恢复后验证跨区域事件幂等重放;
7. 模拟 OSS 超时/拒绝,确认业务不会记录“文件上传成功”;
8. 验证单台 ECS 故障不会让区域入口完全不可用;
9. 验证海外区域故障不会让国内数据库或 Redis 被直接跨区访问。
每次演练记录:开始/结束时间、影响、RTO、数据丢失量、告警是否触发、人工步骤和改进项。未经审批不在真实生产高峰执行故障演练。
## 14. 监控和告警清单
| 层级 | 必须监控 |
|---|---|
| ALB | QPS、4xx/5xx、P95/P99、健康后端数、连接数 |
| ECS | CPU、内存、Load、磁盘使用率/IO、网络、OOM、容器重启 |
| JVM | Heap/Non-Heap、GC 次数与暂停、线程数、连接池、HTTP 线程池 |
| 应用 | 成功率、业务错误码、P95/P99、登录失败、幂等冲突、队列积压 |
| RDS | CPU、内存、连接数、IOPS、吞吐、磁盘、慢 SQL、锁等待、主备状态 |
| Tair | CPU、内存、连接、带宽、慢命令、淘汰、大 Key/热点 Key、切换事件 |
| MSE | 注册实例数、配置发布失败、节点状态、请求量和延迟 |
| RocketMQ | 生产/消费 TPS、堆积量、最老消息年龄、消费失败/DLQ |
| OSS | 4xx/5xx、请求量、流量、存储量、异常公网流出、生命周期执行 |
| Event Bridge | Inbox/Outbox PENDING、失败/死信、租约超时、跨区延迟 |
建议告警至少分三级:
- P1:区域入口不可用、数据库不可用、数据跨客户、持续错误率高;立即通知电话/短信;
- P2:单实例故障、资源超过 80%、MQ 持续堆积、慢 SQL;即时群通知;
- P3:容量趋势、证书临近过期、备份/生命周期异常;工作时间处理。
## 15. 备份、RTO 与 RPO
业务负责人必须确认:
- RTO:故障后最多允许多久恢复;
- RPO:最多允许丢失多久的数据;
- 财务凭证、仓库证据、审计日志和普通临时文件的保留期;
- 是否要求地域级灾备,而不仅是同地域多可用区。
没有正式指标时可以把“核心业务 RTO 30 分钟、RPO 5 分钟”作为讨论起点,不能直接写入客户 SLA。
最低要求:
- RDS 自动全量备份、日志备份和时间点恢复;
- 定期恢复到新实例并做业务校验;
- OSS 版本控制、ZRS、必要时跨区域复制/云备份;
- 配置、Jenkins Pipeline、Compose 和初始化 SQL 全部版本化;
- Redis 不承载唯一业务事实;
- RocketMQ 事件继续由数据库 Outbox/Inbox 保证可重放;
- 生产密钥有备份、轮换和紧急吊销流程。
## 16. 成本控制
- 预发布先按量付费,压测确认后生产长期资源再评估包年包月;
- 不为每个微服务机械购买独立 RDS/Tair,先按区域实例 + Schema/账号隔离;
- OSS 先标准存储,获得真实访问频率后再配生命周期;
- 建立预算和费用告警,重点关注公网流量、OSS 下载/取回、日志、PTS 和跨区域流量;
- 资源统一打标签,每月检查闲置 ECS、磁盘、快照、公网 IP、测试 RDS 和 OSS 历史版本;
- 任何降配前先看 7~30 天监控和业务增长,不以单日低谷判断。
## 17. 首次上线执行清单
### 17.1 建设前
- [ ] 确认国内和海外地域、可用区及数据合规;
- [ ] 确认预算、RTO、RPO 和文件保留期;
- [ ] 收集开发环境 `docker stats`、JVM、MySQL、Redis 指标;
- [ ] 完成 File 服务 OSS 方案和多实例调度审计;
- [ ] 建立 RAM 用户、MFA、资源组、标签和费用告警。
### 17.2 云资源
- [ ] 每区域至少两个应用交换机/可用区;
- [ ] 国内和海外 ALB;
- [ ] 国内和海外 RDS MySQL 高可用多可用区;
- [ ] 国内和海外 Tair 标准高可用;
- [ ] 国内和海外 MSE Nacos;
- [ ] 国内和海外 RocketMQ;
- [ ] 国内和海外私有 OSS Bucket;
- [ ] 日志、监控、告警和备份策略。
### 17.3 应用
- [ ] JVM/容器资源上限;
- [ ] 数据库和 Redis 连接池上限;
- [ ] 国内/海外配置、Token、JWKS 和 API Base 隔离;
- [ ] File 服务 OSS 适配;
- [ ] Gateway 和核心服务双实例;
- [ ] Worker/调度器单实例或数据库租约验证;
- [ ] 健康检查、优雅停机、超时、重试、限流;
- [ ] 密钥仅由生产 Credentials/KMS 注入。
### 17.4 验收
- [ ] 冒烟、爬坡、稳态、峰值和恢复压测;
- [ ] 单 ECS 故障和滚动发布演练;
- [ ] RDS/Tair 切换演练;
- [ ] MQ/Event Bridge 堆积与恢复演练;
- [ ] OSS 上传、下载、拒绝和权限隔离验收;
- [ ] 备份恢复演练;
- [ ] 监控告警通知到真实值班人;
- [ ] 输出最终容量报告和上线/回滚方案。
## 18. 容量报告模板
```text
版本/Commit:
压测环境与地域:
应用实例与规格:
RDS/Tair/MQ/OSS 规格:
测试数据量:
业务场景及比例:
目标/实际 RPS:
持续时间:
成功率:
P50/P95/P99:
ECS CPU/内存峰值:
JVM Heap/GC:
RDS CPU/连接/IOPS/慢SQL:
Tair 内存/CPU/连接/淘汰:
MQ 最大堆积及清空时间:
发现的瓶颈:
故障切换结果:
本版本安全容量:
建议生产规格:
未覆盖风险:
审批人和日期:
```
只有完成容量压测、故障演练和备份恢复,才能把“能启动”升级为“具备生产上线条件”。