287 lines
6.6 KiB
Markdown
287 lines
6.6 KiB
Markdown
# Hifast 新 RDS 生产切换清单(已完成归档)
|
||
|
||
本文档记录已完成的 `hifast-mysql-prod -> hifast-mysql-prod-v2` 生产切换过程,作为归档和回溯参考。
|
||
|
||
本次切换已经完成,当时的目标是避免继续在线硬改现有生产 RDS,而是:
|
||
|
||
1. 新建一台规范公网子网组的新 RDS
|
||
2. 导入现有 `hifast` 数据
|
||
3. 将 AWS 应用切到新 RDS
|
||
4. 将 `104.238.220.230` 的外部从库改挂新 RDS
|
||
5. 验收通过后再下线旧 RDS
|
||
|
||
## 1. 适用背景
|
||
|
||
当前现网已经可用,但还存在 1 个结构性问题:
|
||
|
||
- 为了让 `104` 通过公网白名单做 MySQL 复制,当时的 `hifast-mysql-prod` 仍依赖 `hifast-hk-private-1b` 临时挂公网路由
|
||
|
||
当前已准备好的收敛资源:
|
||
|
||
- 纯公网 DB subnet group:
|
||
- `hifast-hk-rds-public-only-sgprep`
|
||
- 安全组:
|
||
- `hifast-hk-rds-core-sg`
|
||
|
||
## 2. 目标实例参数
|
||
|
||
建议新实例名称:
|
||
|
||
- `hifast-mysql-prod-v2`
|
||
|
||
建议参数如下:
|
||
|
||
- Region: `ap-east-1`
|
||
- Engine: `MySQL`
|
||
- Engine version: `8.4.8`
|
||
- Templates: `Production`
|
||
- DB instance class: `db.r7g.xlarge`
|
||
- Storage type: `gp3`
|
||
- Allocated storage: `200 GiB`
|
||
- Provisioned IOPS: `3000`
|
||
- Storage throughput: `125`
|
||
- Multi-AZ: `No`
|
||
- Publicly accessible: `Yes`
|
||
- VPC: `vpc-09fc384522517debc`
|
||
- DB subnet group: `hifast-hk-rds-public-only-sgprep`
|
||
- VPC security group: `hifast-hk-rds-core-sg`
|
||
- DB name: `hifast`
|
||
- Master username: `admin`
|
||
- Master password: 与现网保持一致
|
||
- Backup retention: `7 days`
|
||
- Performance Insights: `On`
|
||
- Storage encryption: `On`
|
||
- Deletion protection: `On`
|
||
- Auto minor version upgrade: 建议保持与现网一致
|
||
- Maintenance window: 可与现网同策略,建议维护窗口内切换
|
||
|
||
## 3. 切换前确认
|
||
|
||
切换前必须满足:
|
||
|
||
1. `104` 当前主从正常:
|
||
- `Replica_IO_Running: Yes`
|
||
- `Replica_SQL_Running: Yes`
|
||
- `Seconds_Behind_Source: 0`
|
||
2. AWS 应用机心跳正常:
|
||
- `curl http://127.0.0.1:8080/v1/common/heartbeat`
|
||
3. AWS Redis 主从正常:
|
||
- AWS 主 `connected_slaves:1`
|
||
- `104` 从 `master_link_status:up`
|
||
4. 已确认当前应用真实配置文件:
|
||
- `/opt/ppanel/configs/ppanel.yaml`
|
||
5. 已确认当前应用重启方式:
|
||
- `cd /opt/ppanel && docker compose -f docker-compose.cloud.yml up -d ppanel-server`
|
||
|
||
## 4. 创建新 RDS
|
||
|
||
已在 AWS 控制台创建 `hifast-mysql-prod-v2`,未对原 `hifast-mysql-prod` 做高风险在线子网调整。
|
||
|
||
创建完成后先确认:
|
||
|
||
1. 新 endpoint 已分配
|
||
2. `Publicly accessible = Yes`
|
||
3. SG 为 `hifast-hk-rds-core-sg`
|
||
4. DB subnet group 为 `hifast-hk-rds-public-only-sgprep`
|
||
5. 从 `104` 可以 TCP 连通 `3306`
|
||
|
||
连通性验证:
|
||
|
||
```bash
|
||
nc -zv <NEW_RDS_ENDPOINT> 3306
|
||
```
|
||
|
||
## 5. 导出旧主库
|
||
|
||
在一台可连旧 RDS 的机器执行:
|
||
|
||
```bash
|
||
mysqldump \
|
||
-h hifast-mysql-prod.cd6aey40m6ag.ap-east-1.rds.amazonaws.com \
|
||
-u admin \
|
||
-p \
|
||
--single-transaction \
|
||
--routines \
|
||
--triggers \
|
||
--events \
|
||
--set-gtid-purged=OFF \
|
||
hifast > hifast-full.sql
|
||
```
|
||
|
||
说明:
|
||
|
||
- 当前业务库体量约 `187 MB`
|
||
- 这条路线的成本低,且比现网主库在线改子网更稳
|
||
|
||
## 6. 初始化新 RDS
|
||
|
||
先连接新 RDS:
|
||
|
||
```bash
|
||
mysql -h <NEW_RDS_ENDPOINT> -u admin -p
|
||
```
|
||
|
||
建议先执行:
|
||
|
||
```sql
|
||
CALL mysql.rds_set_configuration('binlog retention hours', 24);
|
||
|
||
CREATE USER IF NOT EXISTS 'repl'@'104.238.220.230' IDENTIFIED BY '<REPL_PASSWORD>';
|
||
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl'@'104.238.220.230';
|
||
FLUSH PRIVILEGES;
|
||
```
|
||
|
||
如果库是空的,再导入:
|
||
|
||
```bash
|
||
mysql -h <NEW_RDS_ENDPOINT> -u admin -p hifast < hifast-full.sql
|
||
```
|
||
|
||
导入完成后确认:
|
||
|
||
```bash
|
||
mysql -h <NEW_RDS_ENDPOINT> -u admin -p -e "USE hifast; SHOW TABLES;"
|
||
```
|
||
|
||
## 7. 切换 AWS 应用到新 RDS
|
||
|
||
### 7.1 备份当前配置
|
||
|
||
在 AWS app EC2:
|
||
|
||
```bash
|
||
cp /opt/ppanel/configs/ppanel.yaml /opt/ppanel/configs/ppanel.yaml.bak.$(date +%Y%m%d%H%M%S)
|
||
```
|
||
|
||
### 7.2 修改数据库地址
|
||
|
||
编辑:
|
||
|
||
- `/opt/ppanel/configs/ppanel.yaml`
|
||
|
||
把:
|
||
|
||
```yaml
|
||
MySQL:
|
||
Addr: hifast-mysql-prod.cd6aey40m6ag.ap-east-1.rds.amazonaws.com:3306
|
||
```
|
||
|
||
改成:
|
||
|
||
```yaml
|
||
MySQL:
|
||
Addr: hifast-mysql-prod-v2.cd6aey40m6ag.ap-east-1.rds.amazonaws.com:3306
|
||
```
|
||
|
||
### 7.3 重启业务容器
|
||
|
||
```bash
|
||
cd /opt/ppanel
|
||
docker compose -f docker-compose.cloud.yml up -d ppanel-server
|
||
```
|
||
|
||
### 7.4 应用验收
|
||
|
||
```bash
|
||
curl -sf http://127.0.0.1:8080/v1/common/heartbeat
|
||
docker compose -f /opt/ppanel/docker-compose.cloud.yml logs --tail=100 ppanel-server
|
||
```
|
||
|
||
重点确认:
|
||
|
||
- 心跳返回 `200`
|
||
- 日志中无 MySQL 连接异常
|
||
|
||
## 8. 改挂 `104` 从库到新 RDS
|
||
|
||
先在新 RDS 获取位点:
|
||
|
||
```sql
|
||
SHOW MASTER STATUS;
|
||
```
|
||
|
||
然后在 `104` 执行:
|
||
|
||
```sql
|
||
STOP REPLICA;
|
||
RESET REPLICA ALL;
|
||
CHANGE REPLICATION SOURCE TO
|
||
SOURCE_HOST='hifast-mysql-prod-v2.cd6aey40m6ag.ap-east-1.rds.amazonaws.com',
|
||
SOURCE_PORT=3306,
|
||
SOURCE_USER='repl',
|
||
SOURCE_PASSWORD='<REPL_PASSWORD>',
|
||
SOURCE_LOG_FILE='<MASTER_LOG_FILE>',
|
||
SOURCE_LOG_POS=<MASTER_LOG_POS>,
|
||
SOURCE_SSL=1;
|
||
START REPLICA;
|
||
SHOW REPLICA STATUS\G
|
||
```
|
||
|
||
验收标准:
|
||
|
||
- `Replica_IO_Running: Yes`
|
||
- `Replica_SQL_Running: Yes`
|
||
- `Seconds_Behind_Source: 0`
|
||
|
||
## 9. 切换后验收
|
||
|
||
至少做下面这些检查:
|
||
|
||
1. AWS 应用心跳正常
|
||
2. 管理后台可登录
|
||
3. 新建一条测试数据后,主库可见
|
||
4. `104` 从库能同步到该测试数据
|
||
5. Navicat 可从白名单来源连接新 RDS
|
||
6. Redis 主从仍正常,不受本次 MySQL 切换影响
|
||
|
||
推荐额外核对:
|
||
|
||
```bash
|
||
docker compose -f /opt/ppanel/docker-compose.cloud.yml ps
|
||
docker exec hifast-redis redis-cli -a '<REDIS_PASSWORD>' INFO replication
|
||
```
|
||
|
||
## 10. 回滚方案
|
||
|
||
如果切换后 AWS 应用异常:
|
||
|
||
1. 立刻把 `/opt/ppanel/configs/ppanel.yaml` 中 `MySQL.Addr` 改回旧 endpoint
|
||
2. 重启 `ppanel-server`:
|
||
|
||
```bash
|
||
cd /opt/ppanel
|
||
docker compose -f docker-compose.cloud.yml up -d ppanel-server
|
||
```
|
||
|
||
3. 优先恢复主生产可用
|
||
4. `104` 是否回切旧 RDS 复制,视恢复窗口决定
|
||
|
||
如果只是 `104` 复制改挂失败,但 AWS 应用已正常使用新 RDS:
|
||
|
||
- 不必立刻回滚应用
|
||
- 先修好 `104 -> 新 RDS` 的白名单、位点、用户或网络
|
||
|
||
## 11. 切换完成后的收尾
|
||
|
||
全部验收通过后再做:
|
||
|
||
1. 已将新 endpoint 记录到正式运维文档
|
||
2. 仍需根据回收窗口安排旧 RDS 下线
|
||
3. 仍需按网络收敛计划处理 `private-1b` 路由语义
|
||
4. 已更新外部复制 runbook 中的主库 endpoint
|
||
|
||
## 12. 当前建议的执行顺序
|
||
|
||
本次切换当时按以下顺序执行:
|
||
|
||
1. 创建 `hifast-mysql-prod-v2`
|
||
2. 验证新 RDS 网络与参数
|
||
3. 导出旧库
|
||
4. 导入新库
|
||
5. 创建 / 确认 `repl` 用户
|
||
6. 切 AWS 应用到新 RDS
|
||
7. 验证应用
|
||
8. 改挂 `104` 到新 RDS
|
||
9. 验证从库
|
||
10. 收尾,并保留旧 RDS 待后续下线
|