MySQL 企业实操:私网 Multi-AZ、故障切换与独立恢复

验证:未记录
适用版本
未记录
验证范围
尚未登记验证记录。

选定一条完整路径:AWS RDS MySQL 8.4、Multi-AZ(多可用区)DB instance。RDS 负责同步备用与切换,应用仍负责重试、事务幂等、容量和恢复验收。不是在单机启动 MySQL 后加一份高可用清单。

1. 创建受控数据库#

前置:隔离 AWS 账号/环境、两个不同 AZ 的私有子网、同 VPC(虚拟私有云)内受控运维机、其安全组、AWS CLI/Terraform/MySQL 8.4 客户端。运维机通过 SSM(Systems Manager)会话访问,不开放公网 3306。数据库子网不得带公网直连路径。

复制 static/examples/mysql-rds/ 到工作目录;准备 terraform.tfvars,不含密码:

region                = "REPLACE_REGION"
name                  = "orders-mysql-preprod"
vpc_id                = "REPLACE_VPC_ID"
private_subnets       = ["REPLACE_SUBNET_A", "REPLACE_SUBNET_B"]
client_security_group = "REPLACE_OPERATIONS_SG"
engine_version        = "REPLACE_SUPPORTED_8_4_PATCH"
final_snapshot_id     = "orders-mysql-final-REPLACE_CHANGE_ID"
aws sts get-caller-identity
aws rds describe-db-engine-versions --engine mysql --query 'DBEngineVersions[?starts_with(EngineVersion, `8.4`)].EngineVersion'
terraform init
terraform plan -out=approved.tfplan
terraform apply approved.tfplan

Terraform 创建 KMS(密钥管理服务)加密、私网限制、TLS(传输层安全)强制、14 天备份、日志导出、删除保护与最终快照。主密码由 RDS/Secrets Manager 管理,不进入 Terraform state。正式使用配置加密远端 backend、状态锁与受限写权限;auto minor 默认关闭,必须把每月补丁审核与维护窗口纳入值班责任。

2. 认证及持久化业务#

在私有运维机下载官方 RDS CA bundle。从批准的秘密通道取得 master 密码,mysql --login-path 或权限 600 的 option file 保存连接;不要用 -pPASSWORD 放进进程参数。

mysql --host=REPLACE_RDS_ENDPOINT --user=dbowner --password --ssl-mode=VERIFY_IDENTITY --ssl-ca=global-bundle.pem orders

执行可对账的账本事务:

CREATE TABLE accounts(id BIGINT PRIMARY KEY, balance_cents BIGINT NOT NULL);
CREATE TABLE transfers(request_id VARCHAR(64) PRIMARY KEY, amount_cents BIGINT NOT NULL);
INSERT INTO accounts VALUES (1,10000),(2,0);
START TRANSACTION;
INSERT INTO transfers VALUES ('dr-001',1200);
UPDATE accounts SET balance_cents=balance_cents-1200 WHERE id=1 AND balance_cents>=1200;
UPDATE accounts SET balance_cents=balance_cents+1200 WHERE id=2;
COMMIT;
SELECT * FROM accounts ORDER BY id;
SELECT COUNT(*),SUM(amount_cents) FROM transfers;
SELECT SUM(balance_cents) FROM accounts;

验收余额 8800/1200、转账一笔、总额 10000。这里金额固定且已知充足;真实转账必须检查条件更新影响行数,否则回滚,不能泛化为任意账户支付实现。重复请求应因唯一键失败并回滚整个事务,禁止忽略 INSERT 错误后继续 UPDATE。

创建运行角色,仅授权业务表 SELECT/INSERT/UPDATE;审计角色只读;backup/owner 不给应用。通过交互 SQL 使用 CREATE USER ... IDENTIFIED BY ... REQUIRE SSL,密码来自秘密系统;不要把字面密码写入版本库。无 TLS 连接必须被拒绝。

3. 备份与隔离恢复#

停止合成写入并保存上面的账本查询结果。恢复验证机使用独立安全组,不能与应用共用;以下新建恢复数据库安全组,仅允许验证机访问。先核对账号、区域,所有命令在启用 set -euo pipefail 的 Bash 脚本中执行,失败即停止。创建快照:

export SOURCE_DB=orders-mysql-preprod
export SNAPSHOT=orders-mysql-dr-REPLACE_CHANGE_ID
export RESTORE_DB=orders-mysql-restore-REPLACE_CHANGE_ID
export VPC_ID=REPLACE_VPC_ID
export VERIFY_CLIENT_SG=REPLACE_ISOLATED_VALIDATOR_SG
export RESTORE_SG=$(aws ec2 create-security-group --group-name "$RESTORE_DB" --description "Isolated restore validation" --vpc-id "$VPC_ID" --query GroupId --output text)
aws ec2 authorize-security-group-ingress --group-id "$RESTORE_SG" --protocol tcp --port 3306 --source-group "$VERIFY_CLIENT_SG"
aws rds create-db-snapshot --db-instance-identifier "$SOURCE_DB" --db-snapshot-identifier "$SNAPSHOT"
aws rds wait db-snapshot-available --db-snapshot-identifier "$SNAPSHOT"
aws rds restore-db-instance-from-db-snapshot --db-instance-identifier "$RESTORE_DB" --db-snapshot-identifier "$SNAPSHOT" --db-instance-class db.m6g.large --db-subnet-group-name "$SOURCE_DB" --vpc-security-group-ids "$RESTORE_SG" --db-parameter-group-name "$SOURCE_DB" --multi-az --no-publicly-accessible --deletion-protection
aws rds wait db-instance-available --db-instance-identifier "$RESTORE_DB"
aws rds describe-db-instances --db-instance-identifier "$RESTORE_DB" --query 'DBInstances[0].{Endpoint:Endpoint.Address,Secret:MasterUserSecret.SecretArn,Public:PubliclyAccessible}'

恢复实例可能有不同的 master secret 管理状态,先核对输出;通过 RDS 设置该恢复实例的密码管理并取得独立授权,不假定旧 Secret ARN 自动适用于新实例。恢复后用新 endpoint 和证书校验执行同样账本查询,三项结果一致才通过;记录恢复到可查询的真实耗时。另从业务 Pod 验证恢复 endpoint 的 3306 连接超时、验证机 TLS 查询成功,不能只看安全组配置。RDS 快照恢复的网络参数

快照仅覆盖其恢复点;有快照后写入时,改用经演练的时间点恢复并对账,不能直接切回旧库。切换前冻结写入、核对最后业务水位;新库接写后按 变更与回退边界 处理。

4. 故障切换与升级#

aws rds reboot-db-instance --db-instance-identifier "$SOURCE_DB" --force-failover
aws rds wait db-instance-available --db-instance-identifier "$SOURCE_DB"

同时从应用连接循环读写合成事务,记录断连窗口、DNS 重解析和恢复;提交结果未知时按 request_id 查账,不重复扣款。重连后总额与唯一转账数一致。Multi-AZ 不能恢复误删,快照/时间点恢复演练必须另做。

小版本先查 RDS 可升级目标,在恢复实例试升并重做业务/证书/驱动测试,再安排维护;跨主要版本检查 SQL 模式、字符集、执行计划和驱动,采用独立蓝绿或恢复环境验证。不能承诺降级 engine_version;失败恢复依靠经验证的旧环境与数据同步方案。RDS 升级

5. 告警与清理#

创建并测试 CPU、FreeStorageSpace、DatabaseConnections、故障事件通知及备份失败告警,阈值根据容量压测确定;模拟切换必须实际收到事件。保存恢复证据后删除本次恢复实例前先解除其删除保护并创建必要最终快照。确认恢复实例删除完毕后,删除本次 $RESTORE_SG;保留验证机原安全组。源库由 Terraform 管理,先审核删除保护与最终快照计划;不得删除仍被备份使用的 KMS key。

搜索文档

输入关键词,搜索所有文档。

↑ ↓ 选择 · Enter 打开 · Esc 关闭