目标:在两台美国VPS上构建对等的站群,支持Web请求无感知切换、数据库容错、静态文件同步与监控。
要点:1) 使用HAProxy/Nginx+keepalived实现VIP故障转移;2) MySQL主主复制(注意自增冲突);3) rsync/lsyncd同步文件;4) 健康检查脚本自动切换。
步骤:1) 两台Ubuntu 22.04实例(推荐不同可用区);2) 创建deploy用户并配置SSH免密登录:ssh-keygen && ssh-copy-id deploy@serverB;3) 更新系统:sudo apt update && sudo apt -y upgrade;4) 安装常用工具:sudo apt install -y vim curl git.
操作:1) 开放端口:SSH(22)、HTTP(80)、HTTPS(443)、MySQL(3306,仅内网/防火墙允许);2) 使用ufw:sudo ufw allow 22/tcp && sudo ufw allow 80/tcp && sudo ufw allow 443/tcp && sudo ufw enable;3) 若云平台支持安全组,限制3306仅允许对方IP访问。
安装:sudo apt install -y haproxy keepalived。
HAProxy示例:/etc/haproxy/haproxy.cfg 设置frontend监听80,backend指向本机Nginx(127.0.0.1:8080)。
keepalived示例:/etc/keepalived/keepalived.conf 配置vrrp_instance,state MASTER/BACKUP,virtual_router_id 51,virtual_ipaddress { 10.0.0.100 }。启动并测试:sudo systemctl restart keepalived haproxy。
安装:sudo apt install -y nginx。
在本机运行应用于端口8080,Nginx反代到本地:server listen 80 { location / { proxy_pass http://127.0.0.1:8080; } }。
健康检查:配置一个/health返回200的轻量端点,HAProxy可配置http-check expect status 200。
配置:编辑/etc/mysql/mysql.conf.d/mysqld.cnf,设置server-id=1/2,binlog_format=row,log_slave_updates=ON,gtid_mode=ON, enforce_gtid_consistency=ON(谨慎测试)。
初始化并相互配置:在A上执行 CHANGE MASTER TO MASTER_HOST='B_IP', MASTER_USER='repl', MASTER_PASSWORD='pwd', MASTER_AUTO_POSITION=1; START SLAVE; 在B上做相反配置。
注意:设置auto-increment-increment & auto-increment-offset避免自增冲突;生产建议使用Galera或外部仲裁避免分裂脑。
推荐实时同步用lsyncd:sudo apt install -y lsyncd。示例/etc/lsyncd/lsyncd.conf.lua:设置source /var/www/html,target rsync://user@other:/var/www/html,使用ssh key认证。
替代:crontab + rsync增量同步:rsync -az --delete /var/www/html/ user@B:/var/www/html/。
keepalived可用自定义脚本检查Nginx/MySQL,示例脚本检查/health与mysqladmin ping,返回非0触发切换。
监控:部署Prometheus node_exporter或使用简单的监控脚本上报到Zabbix/Prometheus,并配置报警策略(若VIP切换或replication停止即报警)。
推荐顺序:1) 在两台上准备基础环境;2) 部署Web与健康端点;3) 配置并测试MySQL复制(先在维护窗口);4) 启用rsync/lsyncd测试文件同步;5) 部署HAProxy+keepalived并切换VIP;6) 模拟故障验证。
回滚:保持配置备份(/etc/keepalived、/etc/haproxy、MySQL备份);需要回退时先停止keepalived、恢复配置并验证数据一致性。
常见问题与处置:1) VIP不切换:检查keepalived日志/iptables;2) MySQL复制停止:查看SHOW SLAVE STATUS\G,修正网络或重设GTID;3) 文件不同步:检查ssh key与权限,手动rsync修复。定期演练切换流程避免上线时手忙脚乱。
问:如何确认VIP与流量切换在两台服务器间正常工作?
答:在主节点模拟Nginx宕机(sudo systemctl stop nginx或network down),观察另一节点是否获得VIP(ip addr show),并用curl多次请求VIP确认响应来自备节点;同时查看keepalived日志/var/log/syslog验证vrrp切换事件。
问:主主复制是否安全,会不会造成自增ID冲突或写冲突?
答:存在冲突风险。建议设置auto-increment-increment和offset避免自增ID冲突,并限制对同一记录的并发写。生产更稳妥方案是Galera集群或单主多从+读写分离+自动故障转移机制。
问:rsync/lsyncd不同步时如何快速恢复网站静态资源?
答:优先手动使用rsync进行全量覆盖:rsync -az --delete user@peer:/var/www/html/ /var/www/html/;确认权限与SELinux(如有)设置;建立告警在同步失败时及时通知运维并自动触发补同步任务。