1.
需求与架构总览
目标:在新加坡区域建立一套高可用站群,支持流量分发、状态检测和自动故障切换。
架构建议:2个或更多Web节点 + 2个负载均衡节点(HA)+ 3个数据库节点(Galera)+ 可选共享存储(NFS/Ceph)+ 监控备份。
说明:选用新加坡节点可用区(SG)供应商:AWS(ap-southeast-1)、GCP(asia-southeast1)、或Vultr/DO新加坡节点,根据预算选Zonal或Regional部署。
2.
规划IP与DNS策略
步骤1:为LB节点预留弹性IP或浮动IP。
步骤2:DNS采用低TTL(60-120秒)并在DNS上设置主域名指向VIP或Cloud LB,备用A记录指向备用LB。
步骤3:考虑GeoDNS或CDN作为外层,减少直接切换影响。
3.
准备服务器与网络
步骤1:选择Ubuntu 22.04或CentOS 8(本文以Ubuntu举例)。创建实例并开启SSH。
步骤2:配置安全组/防火墙,允许80/443、数据库端口(3306)、心跳/监控端口(1024-65535按需)。
步骤3:同步时钟:sudo apt update && sudo apt install -y chrony && sudo systemctl enable --now chrony。
4.
基础软件安装与用户
步骤1:创建部署用户:sudo adduser deploy && sudo usermod -aG sudo deploy。
步骤2:安装常用工具:sudo apt install -y git unzip curl vim python3-pip ufw。
步骤3:安装Ansible控制机(用于批量配置):pip3 install ansible。
5.
负载均衡(HAProxy)部署
步骤1:在LB节点安装HAProxy:sudo apt install -y haproxy。
步骤2:示例haproxy.cfg核心片段:
global
maxconn 2048
defaults
mode http
timeout connect 5s
timeout client 30s
timeout server 30s
frontend http-in
bind *:80
default_backend webservers
backend webservers
balance roundrobin
option httpchk GET /health
server web1 10.0.0.11:80 check
server web2 10.0.0.12:80 check
步骤3:重启并验证:sudo systemctl restart haproxy && ss -ltnp | grep 80。
6.
VIP漂移:Keepalived配置与测试
步骤1:安装Keepalived:sudo apt install -y keepalived。
步骤2:示例/etc/keepalived/keepalived.conf(主节点):
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
virtual_ipaddress { 203.0.113.10 }
}
步骤3:在备节点将state改为 BACKUP,priority低于主。启动:sudo systemctl enable --now keepalived。测试:在主上sudo systemctl stop haproxy/keepalived,观察VIP漂移。
7.
Web应用无状态化与同步部署
步骤1:尽量使应用无状态,使用外部存储或对象存储(S3兼容)保存上传文件。
步骤2:若必须同步文件,可用rsync+cron或部署NFS/GlusterFS/Ceph。示例rsync脚本:rsync -az --delete /var/www/ web2:/var/www/。
步骤3:使用Ansible推送代码与配置,示例playbook task:- name: deploy code copy: src=./dist dest=/var/www/ owner=www-data。
8.
数据库高可用:Galera 三节点部署
步骤1:在三台数据库服务器安装MariaDB与Galera插件:sudo apt install -y mariadb-server galera-3.
步骤2:配置my.cnf关键项:
[mysqld]
wsrep_on=ON
wsrep_cluster_name="sg_cluster"
wsrep_cluster_address="gcomm://10.0.0.21,10.0.0.22,10.0.0.23"
wsrep_node_address="10.0.0.21"
wsrep_sst_method=rsync
步骤3:启动并引导集群(从一个节点bootstrap):sudo galera_new_cluster,其他节点启动mysql。验证:SHOW STATUS LIKE 'wsrep_cluster_size'; 应返回3。
9.
备份与恢复流程
步骤1:逻辑备份:mysqldump --single-transaction --quick -u root -p dbname > backup.sql。
步骤2:冷备份/物理备份建议:使用xtrabackup或mariabackup,命令示例:mariabackup --backup --target-dir=/data/backup。
步骤3:定期恢复演练,每月一次在独立环境恢复并验证数据一致性。
10.
监控告警与日志
步骤1:部署Prometheus + node_exporter + mysqld_exporter + Grafana进行可视化。
步骤2:配置Prometheus抓取目标,示例prometheus.yml添加job与metrics_path。
步骤3:设置告警规则并接入PagerDuty/邮件/Slack,确保关键服务(VIP丢失、节点down、Galera split-brain)有告警。
11.
自动化与CI/CD
步骤1:用Ansible编写角色(haproxy, keepalived, web, db)并用inventory分组。
步骤2:CI触发流水线(GitLab CI/Jenkins),在非高峰期滚动发布:先从一个web节点开始,验证后逐台替换。
步骤3:在发布前执行健康检查脚本(curl /health,检查返回200)。
12.
容灾与故障演练
步骤1:定义RTO/RPO并写成SOP。
步骤2:定期演练:断开主LB,验证VIP切换并保证流量不中断;断一台DB,验证Galera自动重整。
步骤3:准备冷备数据中心或跨区域备份,必要时在APAC其他区启动灾备。
13.
问:为什么要在新加坡部署站群而不是使用单一机房?
答:新加坡作为亚太枢纽,靠近东南亚用户,减少延迟;多机房/多可用区避免单点故障,提高可用性和抗灾能力,同时便于合规与本地化业务扩展。
14.
问:如何测试VIP与HA系统的切换是否可靠?
答:在低流量时做切换演练:先观察主LB心跳与VIP,执行sudo systemctl stop keepalived并查看备用LB是否在1-3秒内接管VIP;同时用ab或wrk做压力测试,确认切换期间请求丢失在可接受范围内。
15.
问:成本与性能如何平衡,建议如何选实例规格?
答:按需将负载分为CPU密集与I/O密集,Web层可选中等CPU/高网络带宽实例,DB层选高IOPS磁盘与更多内存。采用自动扩缩容以节省成本,且将重要组件跨可用区冗余部署以保证性能与可用性。
来源:高可用性为先的新加坡站群服务器推荐与部署实例