From b1a2a9e7bfb7d9d89872cede7f13a7c89a296bd2 Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Fri, 21 Aug 2026 09:20:52 +0800 Subject: [PATCH] 1 --- README.md | 1 + 阿里云生产环境选型压测与上线手册.md | 658 ++++++++++++++++++++++++++++ 2 files changed, 659 insertions(+) create mode 100644 阿里云生产环境选型压测与上线手册.md diff --git a/README.md b/README.md index 101a09b..694b036 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,7 @@ - [跨区域认证与服务通信契约](跨区域认证与服务通信契约.md):统一账号、国内/海外 Token、双区域 API、JWKS、Outbox/Inbox 与服务身份边界。 - [双区域部署与 Nacos 规划](双区域部署与Nacos规划.md):开发/测试同机共置、生产国内/海外独立控制面、Nacos、数据库及 Event Bridge 部署边界。 +- [阿里云生产环境选型、压测与上线手册](阿里云生产环境选型压测与上线手册.md):面向新手运维的 ECS/ALB、RDS MySQL、Tair/Redis、OSS、MSE Nacos、RocketMQ 选型,压测步骤、高可用演练、监控、备份与上线清单。 - [平台、客户层级与权限契约](平台客户层级与权限契约.md):平台/客户两级产品语义、列表包含详情的只读权限和跨层同步要求。 - [AI 工程执行与协作约束](AI工程执行与协作约束.md):临时目录、依赖复用、当前开发阶段、部署数据库授权、质量门禁和独立任务协作规则。 - [财务管理闭环盘点与范围建议](财务管理/README.md):基于当前入库计费、财务原型和现有代码盘点财务闭环、缺口及建议的首期应收边界。 diff --git a/阿里云生产环境选型压测与上线手册.md b/阿里云生产环境选型压测与上线手册.md new file mode 100644 index 0000000..d7720cd --- /dev/null +++ b/阿里云生产环境选型压测与上线手册.md @@ -0,0 +1,658 @@ +# 阿里云生产环境选型、压测与上线手册 + +> 适用范围:虫虫出海国内头程与海外仓系统首次生产部署。 +> +> 读者:初次负责生产运维的开发、测试和运维人员。 +> +> 本文只提供选型、建设、压测和验收步骤,不授权创建、变更或删除任何阿里云生产资源,也不替代阿里云账单确认、安全评审和业务上线审批。 + +## 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 怎么开、怎么接 + +### 8.1 必须创建两个 Bucket + +建议命名,实际名称需增加公司/账号随机后缀以满足全局唯一: + +```text +baiyue-prod-cn-files- +baiyue-prod-overseas-files- +``` + +国内文件进入国内 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 服务中转,或由 File 服务签发短时上传凭证/预签名 URL; +- 下载由业务服务先校验账号、客户、文件用途和权限,再返回短时预签名 URL; +- URL 有效期尽量短,日志不得记录完整签名 URL; +- Bucket 不设公共读,不能把“知道 URL”当作权限控制; +- CORS 只允许正式 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 最大堆积及清空时间: +发现的瓶颈: +故障切换结果: +本版本安全容量: +建议生产规格: +未覆盖风险: +审批人和日期: +``` + +只有完成容量压测、故障演练和备份恢复,才能把“能启动”升级为“具备生产上线条件”。