1.
概述:为什么把新加坡 VPS 用作海外容灾节点
新加坡位于东南亚,网络延迟低且对中国大陆、东南亚、欧美均有较好出口。
作为容灾节点,新加坡 VPS 可承担读请求、静态资源外放或在主站不可用时快速接管流量。
本文目标:给出可复制的部署步骤、数据同步方案和自动切换脚本,便于运维实现多区域容灾。
2.
整体架构设计思路
主站(主数据中心)+ 多个海外 VPS(包括新加坡)作为冷/热备。
使用数据库主从复制 + 文件同步 + DNS/负载均衡自动切换。
健康检查由独立监控脚本或第三方 DNS/负载均衡服务执行,发现主站故障则把流量导向新加坡节点。
3.
准备工作与前置条件
在新加坡 VPS 上准备相同的 OS、应用环境(例如 Ubuntu 22.04、Nginx/Apache、相同 PHP/Java 版本)。
确保两端能通过 SSH 互通,配置非交互 SSH 密钥;开放必要端口(80/443/3306 等)。
建议提前准备域名管理者(支持 API 的 DNS 服务,如 Cloudflare、DNSPod 企业版、AWS Route53 等)。
4.
步骤1:部署新加坡 VPS 基础环境
创建 VPS,更新系统并安装常用工具:
apt update && apt -y upgrade
apt install -y nginx mysql-client rsync git curl unzip fail2ban
配置防火墙(以 ufw 为例):
ufw allow 22/tcp; ufw allow 80/tcp; ufw allow 443/tcp; ufw enable
5.
步骤2:数据库同步(以 MySQL 为例)
在主库上开启二进制日志并配置唯一 server-id:在 /etc/mysql/my.cnf 中加入:
[mysqld]
server-id=1
log_bin=mysql-bin
gtid_mode=ON
enforce_gtid_consistency=ON
重启 MySQL:systemctl restart mysql
创建复制用户并记录 GTID/position:
CREATE USER 'repl'@'新加坡IP' IDENTIFIED BY 'strongpwd'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'新加坡IP'; FLUSH PRIVILEGES; SHOW MASTER STATUS\G
在新加坡 VPS 上配置从库 /etc/mysql/my.cnf:server-id=2,执行 CHANGE MASTER TO MASTER_HOST='主IP', MASTER_USER='repl', MASTER_PASSWORD='strongpwd', MASTER_AUTO_POSITION=1; START SLAVE; 并通过 SHOW SLAVE STATUS\G 确认 Seconds_Behind_Master。
6.
步骤3:静态文件与对象同步
使用 rsync + ssh 增量同步:在主站上生成密钥并把公钥放到新加坡 VPS 的 ~/.ssh/authorized_keys。
示例 rsync 命令:rsync -azP --delete -e "ssh -i /root/.ssh/id_rsa" /var/www/uploads/ root@新加坡IP:/var/www/uploads/。
把该命令写入 systemd timer 或 cron(如每分钟或每 5 分钟):*/5 * * * * /usr/local/bin/sync_uploads.sh,脚本中加入日志和锁文件以防并发。
7.
步骤4:会话与缓存处理
会话存储建议外置(Redis/ElastiCache 或数据库),避免切换时用户登录丢失。
部署集中 Redis 主从或使用第三方托管 Redis,新加坡节点配置读取同一 Redis 可实现无缝切换。
若无法共享会话,考虑短TTL或在切换时强制用户重新登录的方案并在页面提示。
8.
步骤5:DNS 自动切换方案(Cloudflare 示例)
在 Cloudflare 上添加两条 A 记录:one 主站、一条指向新加坡 VPS,或使用负载均衡功能配置两组 origin pool 并启用健康检查。
若使用普通 DNS 切换,降低主机记录的 TTL 至 60 秒。编写健康检查脚本,当主站不可达时调用 Cloudflare API 更新 DNS:
示例 API 调用:curl -X PUT "https://api.cloudflare.com/client/v4/zones/{zone_id}/dns_records/{record_id}" -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" --data '{"type":"A","name":"www","content":"新加坡IP","ttl":60,"proxied":false}'.
9.
步骤6:自动化健康检测脚本示例
简单的 Bash 健康检测脚本思路:
1) curl -fsS --max-time 5 https://主站/health || fail
2) 若连续 N 次失败,调用 DNS API 切换到新加坡 IP,并记录切换时间到日志,通知运维邮箱/钉钉/Slack。
示例定时执行:通过 systemd timer 或 cron 每 30 秒检测一次,避免 DNS 频繁切换。
10.
步骤7:切换回主站的自动化(恢复策略)
当主站恢复后,先确认数据库落后已被补齐(SHOW SLAVE STATUS/Seconds_Behind_Master=0),再把 DNS 切回主站。
推荐设置“回切延迟”(例如至少 10 分钟主站稳定后再回切)并由脚本自动或人工确认后执行。
记录每次切换事件并生成审计日志,便于排查。
11.
步骤8:测试与演练(必须)
编写演练计划:一次完整的故障演练包括关闭主站服务、验证新加坡接管、访问校验、回切到主站。
演练频次建议每季度一次,演练后归档问题并修正自动化脚本。
测试时使用灰度方式先切换小比例流量,再全量切换以降低风险。
12.
运维注意事项与安全性调整
安全:SSH 使用密钥、关闭密码登录;数据库用户权限最小化;备份加密存储。
监控:监控指标包括响应时间、错误率、数据库延迟与同步状态,结合 Prometheus + Alertmanager 报警。
成本与带宽:同步频度、数据量会影响带宽费用,必要时使用增量同步或对象存储 CDN 缓存静态资源。
13.
问:为什么选择 DNS 切换而不是 BGP/Anycast?
答:DNS 切换实现门槛低、兼容性强,适合使用第三方 DNS 或 CDN 的场景。BGP/Anycast 成本和运维复杂度高,需要自治系统和路由公告权限,通常适用于大型服务提供商。
14.
问:如何保证数据库切换期间的数据一致性?
答:通过 GTID 或半同步复制可以降低数据丢失风险。务必在切换前确认从库已跟上(Seconds_Behind_Master=0),并在回切时做双向验证与补数据操作。
15.
问:新加坡 VPS 作为容灾节点的常见自动切换失败原因及排查要点?
答:常见失败原因包括 DNS TTL 未生效、健康脚本误判、数据库延迟导致服务异常或同步权限问题。排查要点:查看健康脚本日志、DNS 修改记录、MySQL slave status、rsync 日志与防火墙规则。
来源:新加坡海外vps 在多区域容灾中的角色与自动切换方案解析