1.
架构总览与设计目标
- 明确目标:99.99%可用、跨机房容灾、链路快速切换、会话与数据一致。
- 拟定组件:双机房(或同城双机)、负载均衡(HAProxy/Keepalived)、BGP多线或双上游、数据库主从/组复制、分布式存储或DRBD、Redis主从。
2.
网络与CN2链路策略
- 与带有CN2出口的机房/上游签约,确保两条独立CN2路径(主/备)。
- 使用BGP多宿主:在两台边缘路由器上配置BGP会话,广告你的公网前缀;设置不同localpref/AS-path以控制优先。
- 启用BFD或BGP短邻居检测,加速故障发现(建议检测间隔<1s)。
3.
虚拟IP与VRRP/Keepalived配置
- 在两台前端负载均衡器上安装keepalived:配置vrrp_instance,分配虚拟IP(VIP)。
- keepalived healthcheck:结合脚本检测HAProxy/后端健康,health check失败时触发VRRP主权切换。示例:/etc/keepalived/keepalived.conf中配置notify脚本来自动调度。
- 测试:在主节点停服务或断网,观察VIP是否在5秒内漂移到备节点。
4.
HAProxy 负载均衡与会话保持
- 安装HAProxy并编写前端/后端配置,启用健康检查(option httpchk)。
- 会话粘滞:若需粘性会话,使用stick-table或将session存储到共享Redis。示例:backend myapp balance roundrobin stick-table type ip size 200k expire 30m。
- 配置并发连接限制与超时,避免单点压力突增。
5.
数据层:MySQL 同步与主主/主从方案
- 小型部署:主从+自动故障转移(MHA或Orchestrator)。步骤:开启GTID,建立主从复制,配置监控脚本,测试故障切换。
- 对强一致性要求:MySQL Group Replication或Galera 集群,按官方步骤配齐certs、捆绑复制并保证读写分离。
- 演练:切主练习(promote/demote)并验证应用可用性。
6.
存储同步:DRBD或分布式文件系统
- 小规模块级同步:使用DRBD做同步或异步镜像(primary/secondary)。步骤:yum/apt install drbd-utils,配置资源,mkfs并在两个节点挂载、promote。
- 文件级分布式:使用Ceph或GlusterFS来避免主从锁定,保证多活访问。
- 注意:IO性能评估,DRBD同步延迟会影响写性能,建议在同城机房使用同步模式。
7.
会话与缓存一致性(Redis)
- 部署Redis主从或Redis Sentinel进行自动故障切换;或者使用Redis Cluster实现分片。
- 应用改造:把session存在Redis,前端HAProxy或应用层使用一致性哈希或UUID来定位。
- 测试主服故障,观察Sentinel是否在预定时间内完成主备切换并通知应用。
8.
监控、告警与自动化恢复
- 建立Prometheus+Alertmanager或Zabbix监控链路、负载、复制延迟、VIP状态。
- 自动化脚本:当检测到链路/节点故障时自动执行切换步骤(例如触发keepalived脚本、重路由或移除节点)。
- 定期演练并记录RTO/RPO,更新Runbook。
9.
测试计划与上线演练步骤
- 制定测试清单:单节点下线、链路中断、数据库主故障、全量恢复。
- 测试流程:先在预生产跑流程:1)断开主LB网口;2)验证VIP漂移;3)验证应用请求是否正常;4)恢复并回归主节点。记录时间与异常。
- 上线前把DNS TTL降至60s,必要时使用全球DNS提供商的健康检查与流量切换。
10.
问:在马来西亚CN2线路上最关键的可用性风险是什么?
- 答:最关键是链路与上游单点故障(例如只有一条CN2出口)和BGP收敛慢,建议双上游、多机房并启用BFD/BGP以实现秒级切换。
11.
问:如何在故障切换时避免数据不一致?
- 答:采用同步复制(DRBD同步或数据库强同步复制)和应用层幂等设计,故障切换前验证复制延迟为0并触发有序promote;对于允许延迟的场景使用异步并在恢复时做双向合并。
12.
问:我如何快速验证整个HA方案可用性?
- 答:建立一套演练脚本自动化实施:断链路、断服务、断库三类测试;使用监控记录RTO/RPO;高风险操作先在预生产演练并逐步应用到生产。
来源:如何为马来西亚cn2 服务器设计高可用集群与故障切换策略