AWS:如何为双VPC中的EC2实例配置灾难恢复及流量切换?
多VPC架构下的灾备与数据库同步配置方案
一、VPC级自动故障转移(灾备重定向)
VPC端点无法实现这个需求,它仅用于访问AWS原生服务。跨VPC故障转移得靠Route 53的故障转移路由策略搭配健康检查来完成:
- 给每个VPC的Web应用部署一个Application Load Balancer(ALB),将Web EC2实例挂载到对应ALB上——用ALB比直接绑定实例弹性IP更可靠,能自动处理单实例故障
- 在Route 53中注册域名,设置故障转移路由:主路由指向第一个VPC的ALB域名,备用路由指向第二个VPC的ALB域名
- 为主路由添加健康检查:选择HTTP/HTTPS类型,指定Web应用的健康检查路径(比如
/health),当连续多次检查失败后,Route 53会自动将流量切换到备用VPC - 若VPC完全隔离无法做公网健康检查,可改用CloudWatch指标作为健康依据——比如监控VPC内EC2的运行状态、网络入流量是否正常
二、MySQL双向数据同步(双主复制)
要让两个独立MySQL实例实现数据同步,直接配置双主复制即可,步骤如下:
- 修改两个MySQL实例的配置文件
/etc/mysql/mysql.conf.d/mysqld.cnf:- 开启二进制日志:
log_bin = /var/log/mysql/mysql-bin.log - 设置不同的
server-id(比如第一个实例设1,第二个设2) - 添加
log_slave_updates = 1(双主复制必须开启,确保从库的更新也会写入自身二进制日志) - 重启MySQL服务:
sudo systemctl restart mysql
- 开启二进制日志:
- 在第一个MySQL实例上创建复制用户:
CREATE USER 'repl'@'%' IDENTIFIED BY '你的强密码'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; FLUSH PRIVILEGES; - 锁表并导出数据(避免同步时数据不一致):
执行FLUSH TABLES WITH READ LOCK; mysqldump -u root -p --all-databases > db_backup.sqlSHOW MASTER STATUS;,记录下File和Position的值,再解锁表:UNLOCK TABLES; - 将
db_backup.sql传到第二个MySQL实例,导入数据:mysql -u root -p < db_backup.sql - 在第二个MySQL实例上配置指向第一个实例的复制:
CHANGE MASTER TO MASTER_HOST='第一个MySQL的私有IP', MASTER_USER='repl', MASTER_PASSWORD='你的强密码', MASTER_LOG_FILE='刚才记录的File值', MASTER_LOG_POS=刚才记录的Position值; START SLAVE; - 反向操作,在第一个MySQL实例上重复步骤3-5,配置指向第二个实例的复制(记得获取第二个实例的
MASTER STATUS值) - 验证同步效果:在任意一个实例创建表或插入数据,检查另一个实例是否同步更新
三、Web应用数据库自动切换
有两种实用方案,可根据代码修改成本选择:
方案1:应用层内置故障切换逻辑
无需额外工具,直接在Web应用的数据库配置中添加两个连接地址,优先连接主库,失败则切换到备库。以PHP为例:
$db_hosts = ['主MySQL私有IP', '备MySQL私有IP']; $db_user = 'web_app_user'; $db_pass = '应用数据库密码'; $db_name = '你的业务库名'; $conn = null; foreach ($db_hosts as $host) { try { $conn = new PDO("mysql:host=$host;dbname=$db_name", $db_user, $db_pass); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); break; // 连接成功则停止循环 } catch(PDOException $e) { // 连接失败,尝试下一个地址 continue; } } if (!$conn) { die("所有数据库连接失败,请立即排查!"); }
方案2:用ProxySQL做数据库代理
不想修改应用代码的话,可在Web EC2实例上部署ProxySQL,由它负责数据库的健康监控和故障转移:
- 安装ProxySQL:
sudo apt install proxysql - 登录ProxySQL管理界面:
mysql -u admin -padmin -h 127.0.0.1 -P 6032 - 添加主备数据库节点:
INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (1, '主MySQL私有IP', 3306); INSERT INTO mysql_servers(hostgroup_id, 2, '备MySQL私有IP', 3306); - 配置自动故障转移规则,将主机组1设为主节点组,组2设为备用节点组——ProxySQL会自动监控数据库状态,主库不可用时自动切换到备库
- 修改Web应用的数据库连接地址为ProxySQL的本地地址
127.0.0.1:6033,无需改动原有业务代码
内容的提问来源于stack exchange,提问作者Nick Katunov
相关产品推荐
相关产品推荐

