AWS RDS MySQL 蓝绿部署升级完整指南
概述
本文档基于实际测试记录,详细介绍AWS RDS MySQL从5.7升级到8.0的蓝绿部署全过程。
测试环境:
- 源版本: MySQL 5.7.44-rds.20251212
- 目标版本: MySQL 8.0.40
- 实例类型: db.m5.large (2vCPU, 8GB)
- Multi-AZ: 启用
- 区域: ap-southeast-1
蓝绿部署流程图
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| ┌─────────────────────────────────────────────────────────────────────────────┐ │ 蓝绿部署升级完整流程 │ ├─────────────────────────────────────────────────────────────────────────────┤ │ │ │ 阶段1 阶段2 阶段3 阶段4 │ │ 创建读副本 版本升级 配置备份 执行切换 │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │蓝环境 │ │绿环境 │ │绿环境 │ │绿环境 │ │ │ │MySQL5.7 │──复制─▶│MySQL5.7 │──升级─▶│MySQL8.0 │──切换─▶│MySQL8.0│ │ │ │(生产) │ │(副本) │ │(就绪) │ │(新生产) │ │ │ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │ │ │ │ │ ▲ │ │ │ │ │ │ │ │ └─────────────────┴─────────────────┴─────────────────┘ │ │ 持续数据同步 │ │ │ │ 耗时: 10-20分钟 耗时: 10-20分钟 耗时: 几分钟 耗时: 1-5分钟 │ │ 业务影响: 零 业务影响: 零 业务影响: 零 业务影响: 短暂 │ └─────────────────────────────────────────────────────────────────────────────┘
|
前置条件
1. 检查当前实例状态
1 2 3 4
| aws rds describe-db-instances \ --db-instance-identifier mysql-test-57 \ --query 'DBInstances[0].{Status:DBInstanceStatus,Version:EngineVersion,MultiAZ:MultiAZ}' \ --profile default --region ap-southeast-1
|
2. 确认可升级的目标版本
1 2 3 4 5
| aws rds describe-db-engine-versions \ --engine mysql \ --engine-version 5.7 \ --query 'DBEngineVersions[0].ValidUpgradeTarget[?IsMajorVersionUpgrade==`true`].EngineVersion' \ --profile default --region ap-southeast-1
|
3. 确保备份已启用
蓝绿部署要求源实例启用自动备份 (BackupRetentionPeriod > 0)
阶段1: 创建蓝绿部署
命令
1 2 3 4 5
| aws rds create-blue-green-deployment \ --blue-green-deployment-name mysql-57-to-80-upgrade \ --source arn:aws:rds:XXXX:db:mysql-test-57 \ --target-engine-version 8.0.40 \ --profile default --region ap-southeast-1
|
参数说明
| 参数 |
说明 |
--blue-green-deployment-name |
部署名称,用于标识 |
--source |
源实例的ARN |
--target-engine-version |
目标MySQL版本 |
返回示例
1 2 3 4 5 6 7 8 9 10 11
| { "BlueGreenDeployment": { "BlueGreenDeploymentIdentifier": "bgd-xen1mlsjdt6hlt8r", "Status": "PROVISIONING", "Tasks": [ {"Name": "CREATING_READ_REPLICA_OF_SOURCE", "Status": "PENDING"}, {"Name": "DB_ENGINE_VERSION_UPGRADE", "Status": "PENDING"}, {"Name": "CONFIGURE_BACKUPS", "Status": "PENDING"} ] } }
|
阶段2: 监控部署进度
查看部署状态
1 2 3
| aws rds describe-blue-green-deployments \ --blue-green-deployment-identifier bgd-xen1mlsjdt6hlt8r \ --profile default --region ap-southeast-1
|
任务状态说明
| 任务 |
说明 |
预计耗时 |
| CREATING_READ_REPLICA_OF_SOURCE |
创建源实例的读副本 |
10-20分钟 |
| DB_ENGINE_VERSION_UPGRADE |
升级绿环境到目标版本 |
10-20分钟 |
| CONFIGURE_BACKUPS |
配置备份策略 |
几分钟 |
状态流转
1
| PROVISIONING → AVAILABLE → SWITCHOVER_IN_PROGRESS → SWITCHOVER_COMPLETED
|
查看绿环境实例详情
1 2 3 4 5
| aws rds describe-db-instances \ --db-instance-identifier mysql-test-57-green-b66gdf \ --query 'DBInstances[0].{Status:DBInstanceStatus,Version:EngineVersion}' \ --profile default --region ap-southeast-1
|
阶段3: 执行切换 (Switchover)
前置检查
确保部署状态为 AVAILABLE:
1 2 3 4
| aws rds describe-blue-green-deployments \ --blue-green-deployment-identifier bgd-xen1mlsjdt6hlt8r \ --query 'BlueGreenDeployments[0].Status' \ --profile default --region ap-southeast-1
|
执行切换命令
1 2 3 4
| aws rds switchover-blue-green-deployment \ --blue-green-deployment-identifier bgd-xen1mlsjdt6hlt8r \ --switchover-timeout 300 \ --profile default --region ap-southeast-1
|
参数说明
| 参数 |
说明 |
--blue-green-deployment-identifier |
蓝绿部署ID |
--switchover-timeout |
切换超时时间(秒),默认300 |
切换过程详解
1 2 3 4 5 6 7 8 9 10 11
| 切换时间线 (实测数据): ──────────────────────────────────────────────────────────────── 08:33:35 切换开始,TPS正常 (~263) 08:33:51 TPS开始下降,出现错误 (err/s: 142) 08:33:52 TPS=0,写入完全阻塞 08:36:47 连接完全中断 (QPS=0) 08:37:00 DNS切换完成 08:37:30 切换完成,连接恢复 ──────────────────────────────────────────────────────────────── 总切换时间: ~4分钟 完全断连时间: ~28秒
|
切换期间的实例名称变化
1 2 3 4 5 6 7
| 切换前: mysql-test-57 → MySQL 5.7 (生产) mysql-test-57-green-xxx → MySQL 8.0 (绿环境)
切换后: mysql-test-57 → MySQL 8.0 (新生产,原绿环境) mysql-test-57-old1 → MySQL 5.7 (原生产,可用于回滚)
|
阶段4: 验证升级结果
检查切换状态
1 2 3 4
| aws rds describe-blue-green-deployments \ --blue-green-deployment-identifier bgd-xen1mlsjdt6hlt8r \ --query 'BlueGreenDeployments[0].{Status:Status,StatusDetails:StatusDetails}' \ --profile default --region ap-southeast-1
|
验证新版本
1 2 3 4
| aws rds describe-db-instances \ --db-instance-identifier mysql-test-57 \ --query 'DBInstances[0].EngineVersion' \ --profile default --region ap-southeast-1
|
连接验证
1 2
| mysql -h mysql-test-57.XXX.rds.amazonaws.com \ -P 3306 -u admin -p -e "SELECT VERSION();"
|
阶段5: 清理资源
删除蓝绿部署 (保留旧实例)
1 2 3
| aws rds delete-blue-green-deployment \ --blue-green-deployment-identifier bgd-xen1mlsjdt6hlt8r \ --profile default --region ap-southeast-1
|
删除蓝绿部署 (同时删除旧实例)
1 2 3 4
| aws rds delete-blue-green-deployment \ --blue-green-deployment-identifier bgd-xen1mlsjdt6hlt8r \ --delete-target \ --profile default --region ap-southeast-1
|
手动删除旧实例 (如需要)
1 2 3 4
| aws rds delete-db-instance \ --db-instance-identifier mysql-test-57-old1 \ --skip-final-snapshot \ --profile default --region ap-southeast-1
|
回滚方案
如果升级后发现问题,可以快速回滚:
方法1: 切换回旧实例 (推荐)
在删除蓝绿部署前,旧实例 (mysql-test-57-old1) 仍然可用:
方法2: 从快照恢复
1 2 3 4
| aws rds restore-db-instance-from-db-snapshot \ --db-instance-identifier mysql-test-57-restored \ --db-snapshot-identifier <snapshot-id> \ --profile default --region ap-southeast-1
|
实测性能数据
测试配置
- sysbench oltp_read_write
- 16表 × 100,000行
- 8并发线程
性能对比
| 指标 |
MySQL 5.7 |
MySQL 8.0 |
变化 |
| TPS |
263 |
288 |
+9.5% |
| QPS |
5,284 |
5,760 |
+9.0% |
| 95%延迟 |
35ms |
35ms |
持平 |
切换影响
| 指标 |
数值 |
| 蓝绿部署总耗时 |
42分钟 |
| 切换总耗时 |
4分钟 |
| 完全断连时间 |
28秒 |
| 数据丢失 |
0 |
最佳实践
1. 时间选择
2. 监控准备
- 提前配置CloudWatch告警
- 准备实时监控脚本
3. 应用适配
- 确保应用支持MySQL 8.0语法
- 测试连接池的重连机制
- 配置合理的连接超时
4. 回滚准备
5. 通知机制
常见问题
Q1: 蓝绿部署创建失败
原因: 源实例未启用自动备份
解决:
1 2 3 4
| aws rds modify-db-instance \ --db-instance-identifier mysql-test-57 \ --backup-retention-period 7 \ --apply-immediately
|
Q2: 切换超时
原因: 数据同步延迟过大
解决: 增加 --switchover-timeout 值,或等待复制追平
Q3: 切换后应用连接失败
原因: DNS缓存或连接池未刷新
解决: 重启应用或刷新连接池
参考命令汇总
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| aws rds create-blue-green-deployment \ --blue-green-deployment-name <name> \ --source <source-arn> \ --target-engine-version <version>
aws rds describe-blue-green-deployments \ --blue-green-deployment-identifier <bgd-id>
aws rds switchover-blue-green-deployment \ --blue-green-deployment-identifier <bgd-id> \ --switchover-timeout 300
aws rds delete-blue-green-deployment \ --blue-green-deployment-identifier <bgd-id>
|
基于实际测试环境: AWS ap-southeast-1, Account XXXX