661 lines
31 KiB
Markdown
661 lines
31 KiB
Markdown
# 阿里云生产环境选型、压测与上线手册
|
||
|
||
> 适用范围:虫虫出海国内头程与海外仓系统首次生产部署。
|
||
>
|
||
> 读者:初次负责生产运维的开发、测试和运维人员。
|
||
>
|
||
> 本文只提供选型、建设、压测和验收步骤,不授权创建、变更或删除任何阿里云生产资源,也不替代阿里云账单确认、安全评审和业务上线审批。
|
||
|
||
## 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 最大堆积及清空时间:
|
||
发现的瓶颈:
|
||
故障切换结果:
|
||
本版本安全容量:
|
||
建议生产规格:
|
||
未覆盖风险:
|
||
审批人和日期:
|
||
```
|
||
|
||
只有完成容量压测、故障演练和备份恢复,才能把“能启动”升级为“具备生产上线条件”。
|