1. 先确认两家香港云服务商(A、B),每边至少2台主机:Web(nginx/haproxy)、App;另外1台数据库主/从和1台缓存节点。准备域名、DNS可做健康检查的服务(如DNSPod、Cloudflare或云厂商DNS)。确定流量切换策略:DNS级别+应用层健康检测。
2. 在每台主机上统一操作系统(推荐Ubuntu 22.04),同步时区和时间:apt update && apt install -y ntp; 设置SSH免密登录:ssh-keygen -t rsa && ssh-copy-id user@other_ip。开启防火墙,仅放通必要端口:22/80/443/3306/6379/监控端口。
3. 安装Nginx:apt install -y nginx。示例nginx配置放在 /etc/nginx/sites-available/site.conf,负载到本地应用组并启用健康探测: upstream app { server 127.0.0.1:8000 max_fails=3 fail_timeout=10s; } server {... proxy_pass http://app; }。启用keepalive与gzip。
4. 使用Certbot自动签发证书:apt install -y certbot python3-certbot-nginx; certbot --nginx -d example.com。若DNS验证需跨云,使用DNS-API(Cloudflare/DNSPod)自动更新。设置crontab自动续期:0 3 * * * certbot renew --quiet。
5. 推荐使用rsync或lsyncd做双向/单向同步。示例rsync定时任务(主->备):*/5 * * * * rsync -az --delete -e "ssh -i /root/.ssh/id_rsa" /var/www/html/ root@B_IP:/var/www/html/。对于大文件或对象存储,建议使用对象存储(S3兼容)并在应用中使用同一存储端点。
6. 在主库(A)配置 /etc/mysql/mysql.conf.d/mysqld.cnf:server-id=1; log_bin=mysql-bin; binlog_format=row; gtid_mode=ON; enforce_gtid_consistency=ON。创建复制用户:CREATE USER 'repl'@'%' IDENTIFIED BY 'pwd'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; LOCK TABLES WITH READ LOCK; SHOW MASTER STATUS; 记录File与Position。备库(B)设置server-id=2,导入主库备份并执行:CHANGE MASTER TO MASTER_HOST='A_IP', MASTER_USER='repl', MASTER_PASSWORD='pwd', MASTER_AUTO_POSITION=1; START SLAVE;。使用Orchestrator或MHA实现自动主库故障切换。
7. 在每云部署Redis主从,且部署至少3个Sentinel实例(跨两云分布)。示例sentinel.conf:sentinel monitor mymaster 127.0.0.1 6379 2;sentinel auth-pass mymaster yourpwd;启动sentinel:redis-sentinel /etc/redis/sentinel.conf。应用使用sentinel发现主节点。
8. 在DNS提供商配置多A记录指向两云的公网EIP,并开启健康检查与权重策略(或使用Cloudflare Load Balancer)。设置低TTL(60-120秒)以加速切换。健康检查建议指向/nginx_status或应用健康接口,失败后自动把流量导向健康节点。
9. 部署Prometheus+Grafana采集主机、nginx、MySQL、Redis指标;Filebeat统一采集日志到Elasticsearch或Logstash。设置报警(CPU/响应时间/主从同步状态/redis主备切换)并通过钉钉/邮件通知。
10. 定期备份:mysqldump或XtraBackup(全量+增量),对象存储上保存30天;备份脚本示例:mysqldump -u root -p'pwd' --single-transaction --databases appdb | gzip > /backup/appdb_$(date +%F).sql.gz && rclone copy /backup remote:bucket。每季度进行切换演练,验证DNS、数据库和缓存切换流程。
11. 演练建议:先将A云Web下线(停nginx),观察DNS健康检测是否将流量切到B;再故意断开A云数据库,观察Orchestrator是否提升B为主并应用是否重新连接;记录恢复流程并优化文档。
12. 建议:使用统一的配置管理(Ansible)实现一键部署;避免跨云同步实时共享文件,优选对象存储或数据库同步;关注跨境网络延迟与带宽计费。安全上启用WAF、限流与IP白名单。
13. 问:双云部署最大的单点风险是什么?
14. 答:如果数据库主从未正确配置或没有自动故障切换,数据写入端会成为单点;同时若DNS提供商不支持健康检查/快速切换或你使用单一证书管理,也会造成故障传播。需做好复制、备份和多DNS策略。
15. 问:如何保证会话一致性(Session)跨云切换?
16. 答:使用Redis集群(主从+Sentinel)或Memcached并跨云复制,或将会话token化(JWT)避免服务器粘性。若使用Redis,确保故障时应用能自动重连并处理偶发的短暂不可用。
17. 问:部署完如何验证高可用是否生效?
18. 答:有计划地模拟单点宕机(关闭A云Web/DB或断网),观察DNS/负载均衡是否切流、数据库是否完成主备切换、应用是否无缝重连,并监控错误率与延迟。记录结果并修正发现的问题。