
1.
目标:在香港机房托管多台服务器,构建应用高可用集群(前端负载均衡、后端应用多实例、数据库高可用、共享文件与备份),保证单点故障自动切换,最大限度缩短恢复时间。
场景假设:你有2台应用服务器(app1, app2)、2台负载均衡节点(lb1, lb2)用于VRRP切换、3台数据库节点(db1, db2, db3)组成Galera集群,外加一台监控与备份节点。
2.
步骤:选择香港机房(如HKT、香港电讯、阿里云香港、腾讯云香港或国际托管提供商)。建议购买:至少2个公网IP/VRRP支持、裸金属或高性能云主机、独立带宽。注意询问提供商是否支持BGP or multiple upstream以降低链路故障风险。
准备:登记域名,配置可编辑的DNS(支持API或低TTL),预留一个CDN/Anycast作为缓解手段。
3.
在每台主机上执行(以Ubuntu为例):更新系统、创建用户、安装常用工具。
示例命令:sudo apt update && sudo apt -y upgrade;sudo adduser deploy;设置SSH密钥:ssh-keygen -t rsa -b 4096;将公钥放到~/.ssh/authorized_keys。
关闭密码登录并限制root:编辑/etc/ssh/sshd_config,设置PermitRootLogin no, PasswordAuthentication no,然后sudo systemctl restart sshd。
4.
使用ufw或iptables管理防火墙:开放必要端口(80/443、3306仅限内网、2377/7946用于Docker Swarm或K8s、UDP 112用于Keepalived)。示例:sudo ufw allow 22/tcp;sudo ufw allow 80,443/tcp。
如果机房提供私有网络,请优先使用内网IP做数据库和文件同步,减少公网暴露。
5.
推荐用Docker或Kubernetes简化扩容。若使用Docker Compose:在app1/app2上安装Docker并运行同样镜像:docker run -d --name web -p 8080:80 myapp:latest。
确保应用支持会话无状态或使用Redis做Session共享。Redis可以部署成主从或Cluster,监听私有网络端口。
6.
在lb1/lb2上安装HAProxy与Keepalived:sudo apt install haproxy keepalived。
示例haproxy.cfg(简化):
frontend http-in bind *:80 default_backend app_pool backend app_pool balance roundrobin server app1 10.0.0.11:8080 check server app2 10.0.0.12:8080 check
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 1111; } virtual_ipaddress { 1.2.3.100/32 } }
启动并测试:sudo systemctl enable --now haproxy keepalived。关闭lb1观察虚拟IP漂移到lb2确认HA生效。
7.
Galera支持多主复制,适用于写量不极高的场景。主要步骤:在db1/db2/db3上安装MariaDB + Galera插件,统一配置wsrep参数并启动bootstrap第一个节点。
关键配置示例(/etc/mysql/my.cnf):
[mysqld] bind-address = 0.0.0.0 wsrep_on=ON wsrep_cluster_address="gcomm://10.0.0.21,10.0.0.22,10.0.0.23" wsrep_node_address="10.0.0.21" wsrep_node_name="db1" wsrep_provider=/usr/lib/galera/libgalera_smm.so binlog_format=row default_storage_engine=InnoDB innodb_autoinc_lock_mode=2
启动流程:在第一个节点使用galera_new_cluster,然后在其他节点启动mysql服务以加入集群。测试写入并确认在其他节点可见。
8.
若应用需要共享文件(上传图片等),可选方案:使用对象存储(优先)、或GlusterFS做分布式文件系统、或rsync+inotify实现近实时同步。
rsync示例(crontab或inotify):rsync -az --delete /var/www/uploads/ db2:/var/www/uploads/,并设置cron每分钟执行或使用lsyncd实现事件驱动同步。
9.
使用CDN(Cloudflare、Akamai、腾讯云CDN)缓存静态资源并隐藏源站IP,降低DDoS风险。DNS设置低TTL(如60秒)便于故障切换。
若要跨机房冗余,可准备第二地(新加坡或内地)备用集群并使用DNS基于健康检查的故障转移(Route53风格)或第三方DNS服务实现自动切换。
10.
部署Prometheus + Grafana监控主机/服务,node_exporter采集主机指标,黑盒探测LB与应用健康;使用Alertmanager或钉钉/企业微信Webhook推送告警。
结合自动化脚本(使用Ansible或自定义脚本)实现故障时自动重建或触发容器重启。示例:当haproxy后端健康检查失败触发脚本替换实例。
11.
数据库:配置物理备份(xtrabackup)和逻辑备份(mysqldump),并将备份上传到异地对象存储。保留周期与增量策略按RPO/RTO制定。
定期进行故障演练:模拟单点断电、网络中断、数据库故障,验证自动切换与备份恢复流程,形成SOP文档。
12.
测试:1) 关闭lb1,检查虚拟IP漂移与流量继续;2) 强制停止db1,确认集群自动切换并能写入;3) 模拟文件同步冲突,验证回滚与一致性。
排查要点:检查Keepalived日志(/var/log/syslog)、HAProxy状态(echo "show stat" | socat stdio /var/run/haproxy.sock)、Galera状态(SHOW STATUS LIKE 'wsrep_%';)。
13.
答:通常香港托管的服务器不需要中国大陆的ICP备案。只有当你的域名解析到大陆机房或你向大陆用户提供网站服务并使用大陆服务器时才需备案。但建议确认目标用户的网络访问体验并遵循当地法律与提供商政策。
14.
答:使用Galera等同步复制能在多数场景保持一致性,但网络分区可能导致分裂脑。解决办法:配置quorum策略、使用arbitrator节点或外部仲裁、并在网络恢复后通过状态校验(wsrep_local_state_comment)确认一致性。对关键写操作可加业务侧幂等设计。
15.
答:成本控制建议分层:对外服务使用2个LB + 2个应用节点 + 3节点数据库为基础HA配置;静态内容尽量交给CDN与对象存储;在非高峰期使用按需扩容;使用监控+自动化脚本减少运维人工成本。同时评估托管与云服务的性价比,必要时混合云:关键节点托管、备份/灾备放云端。