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