AWS RDS MySQL 蓝绿部署升级完整指南

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
# 绿环境实例名称格式: {源实例名}-green-{随机字符}
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) 仍然可用:

1
2
# 修改应用连接字符串指向旧实例
# mysql-test-57-old1.XXXX.amazonaws.com

方法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. 回滚准备

  • 保留旧实例至少24小时
  • 准备回滚脚本和流程

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
# 1. 创建蓝绿部署
aws rds create-blue-green-deployment \
--blue-green-deployment-name <name> \
--source <source-arn> \
--target-engine-version <version>

# 2. 查看部署状态
aws rds describe-blue-green-deployments \
--blue-green-deployment-identifier <bgd-id>

# 3. 执行切换
aws rds switchover-blue-green-deployment \
--blue-green-deployment-identifier <bgd-id> \
--switchover-timeout 300

# 4. 删除部署
aws rds delete-blue-green-deployment \
--blue-green-deployment-identifier <bgd-id>

基于实际测试环境: AWS ap-southeast-1, Account XXXX