1. 概览与前提准备
- 目标:在香港多台VPS上构建高可用服务,提供无感知的负载均衡与故障切换。
- 前提:至少3台
香港VPS(推荐跨机房或不同网络运营商)、SSH访问、root权限、域名解析可配置、监控告警工具(Prometheus/Alertmanager或Zabbix)。
2. 网络与节点规划
- 步骤:选3~5台VPS,分配角色:2台负载均衡/反向代理(A/B),2台应用服务器,1台数据库主/备或更多。
- 注意:不同运营商能降低同网段宕机风险;设计私有网络或使用公网内网IP并配置防火墙仅开放必要端口(22/80/443/3306等)。
3. 基础环境搭建(操作示例)
- 更新系统并安装必要软件(以Ubuntu为例):sudo apt update && sudo apt install -y nginx haproxy keepalived mysql-server redis-server lsyncd rsync。
- 配置防火墙(ufw示例):sudo ufw allow 22/tcp; sudo ufw allow 80,443/tcp; sudo ufw enable。
4. 负载均衡层:Nginx 反向代理配置
- Nginx upstream示例(/etc/nginx/sites-available/default):upstream backend { server 10.0.0.11 weight=5; server 10.0.0.12 weight=5; } server { listen 80; location / { proxy_pass http://backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
- 健康检查:推荐使用nginx-plus或结合第三方脚本定期检测后端并修改upstream,或用HAProxy做原生健康检查。
5. 高可用VIP:keepalived + VRRP 实现主备切换
- 在两台负载均衡节点配置keepalived:/etc/keepalived/keepalived.conf(简化示例)vrrp_instance VI_1 { state MASTER; interface eth0; virtual_router_id 51; priority 101; advert_int 1; authentication { auth_type PASS; auth_pass 1234; } virtual_ipaddress { 1.2.3.4 } }
6. 更强的L4方案:HAProxy 与 LVS 说明
- HAProxy示例(/etc/haproxy/haproxy.cfg):frontend http_front bind *:80 default_backend servers backend servers { server srv1 10.0.0.11:80 check; server srv2 10.0.0.12:80 check }
- LVS(ipvsadm)适合大并发,可结合keepalived管理虚拟IP,注意内核参数和iptables转发设置。
7. 会话保持与粘性配置
- HTTP可通过cookie(Nginx sticky模块或HAProxy cookie)实现粘性;如果应用支持,建议用无状态化(JWT、共享缓存)避免粘性依赖。
- 示例HAProxy粘性:balance roundrobin cookie SRV insert indirect nocache。
8. 数据层高可用:MySQL 复制与故障切换
- 部署主从或主主复制:在master配置my.cnf启用binlog,创建复制用户;在slave执行CHANGE MASTER TO MASTER_HOST='ip',MASTER_USER='repl',MASTER_PASSWORD='pwd',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=4; START SLAVE;。
- 自动故障切换建议使用MHA/Orchestrator或ProxySQL + keepalived控制VIP到新主。
9. 缓存层高可用:Redis Sentinel / Cluster
- Sentinel配置示例(sentinel.conf):sentinel monitor mymaster 10.0.0.21 6379 2 sentinel auth-pass mymaster yourpass;启动sentinel三节点可实现自动主备切换。
- 对高写流量使用Redis Cluster,注意slot迁移和持久化RDB/AOF配置。
10. 文件同步与共享存储
- 轻量方案:lsyncd+rsync定时将/var/www/同步到其他应用节点;配置示例在/etc/lsyncd/lsyncd.conf.lua中指明源/目标与ssh key。
- 若需要共享存储,使用NFS/SMB或对象存储(MinIO/S3),并设置HA方案或多副本。
11. 监控、告警与自动化恢复
- 部署Prometheus+Node Exporter+Alertmanager或Zabbix,监控tcp/http健康、负载、磁盘、延迟。
- 编写故障自动处理脚本(eg. 当后端不可达时自动移除upstream并通知),并用Ansible/CICD自动化重建节点。
12. 故障演练与验证步骤(必须)
- 演练事项:1) 关闭主LB的nginx进程,验证VIP漂移到备;2) 断开数据库主节点网络,验证slave能否提升及应用是否能写入;3) 模拟Redis主故障,验证Sentinel切换。记录RTO/RPO并调整参数。
13. 恢复与数据一致性处理
- 恢复步骤:从最新备份恢复数据库(mysqldump或xtrabackup),重建复制链;若发生split-brain,先停止写入,选择最新有效节点为准并以其他节点重建复制。
- 定期做全量备份并验证备份可恢复性。
14. 性能优化与安全防护
- 使用CDN降低静态资源压力,开启gzip、缓存头;在边缘做WAF和DDoS防护(Cloudflare或流量清洗服务)。
- 加强SSH密钥、关闭密码登录,使用Fail2ban限制暴力破解,SSL证书自动更新(certbot)。
15. 常见问题答疑 — 问:如何验证keepalived的VIP切换是否可靠?
- 答:在线下或非高峰时进行模拟:在主节点执行systemctl stop keepalived并观察备节点日志(/var/log/syslog)是否接管VIP;使用arping -I eth0 1.2.3.4检查响应;再恢复主节点,确认优先级设置会否回切(如不需自动回切则设置nopreempt)。
16. 常见问题答疑 — 问:会话状态如何在多台应用间保持一致?
- 答:推荐三种策略:1) 设计无状态应用(首选),2) 使用共享会话存储(Redis/数据库),3) 使用粘性会话(HAProxy/Nginx cookie);生产优先选1或2以利于扩容和容错。
17. 常见问题答疑 — 问:遇到数据库主从延迟或split-brain应怎样快速恢复?
- 答:第一步停止所有写入,检查各节点的binlog位置并选择最新且完整的数据节点作为主(以时间戳与GTID/pos对比),用备份或xtrabackup恢复其他节点并重建复制链;若使用GTID可用SET GTID_PURGED等更安全操作,整个过程建议在维护窗口执行并通知应用降级读写策略。
来源:高可用架构下服务器香港vps 的负载均衡与故障处理方法