双机房双活高可用解决方案
1. 概述
1.1 目标
本方案旨在构建一个高可用、高性能的双机房双活(Active-Active)系统,确保在任何单点故障(如单台服务器宕机、单个机房网络中断)发生时,业务服务不中断,实现无缝故障转移,保障业务连续性。
1.2 设计原则
- 双活负载:正常情况下,两个机房同时对外提供服务,共同分担业务流量。
- 高可用性:通过 Keepalived 实现虚拟 IP(VIP)的自动故障转移,消除单点故障。
- 快速切换:基于 VRRP 协议,故障检测和切换时间控制在秒级。
- 简单可靠:采用成熟稳定的开源组件(Keepalived + Nginx),架构清晰,易于维护。
2. 架构设计
2.1 网络拓扑
+------------------+
| 外部客户端 |
| (通过 DNS 解析) |
+--------+---------+
|
| (流量分发)
|
+--------------------+---------------------+
| |
+-------------v-------------+ +-------------v-------------+
| A 机房 (主) | | B 机房 (备) |
| | | |
| VIP1: 192.168.1.100 | | VIP2: 192.168.1.101 |
| VIP2: 192.168.1.101 | | VIP1: 192.168.1.100 |
| | | |
| +---------------------+ | | +---------------------+ |
| | Nginx Server | | | | Nginx Server | |
| | (192.168.1.10) | | | | (192.168.1.11) | |
| | | | | | | |
| | +---------------+ | | | | +---------------+ | |
| | | Keepalived | | | | | | Keepalived | | |
| | +---------------+ | | | | +---------------+ | |
| +----------+----------+ | | +----------+----------+ |
| | | | | |
+-------------+-------------+ +-------------+-------------+
| |
+------------------+-----------------------+
|
+------v-------+
| 内网核心 |
| 交换网络 |
+--------------+
2.2 组件说明
组件 | 版本/类型 | 说明 |
---|---|---|
Keepalived | 最新稳定版 | 实现 VRRP 协议,管理虚拟 IP(VIP)的漂移,提供高可用。 |
Nginx | 最新稳定版 | 作为反向代理和负载均衡器,将请求转发至后端应用服务器。 |
Virtual IP (VIP) | 192.168.1.100, 192.168.1.101 | 对外提供服务的浮动 IP,由 Keepalived 动态管理。 |
健康检查脚本 | 自定义 Shell 脚本 | 监控 Nginx 进程状态,触发 Keepalived 优先级调整。 |
3. 详细配置
3.1 Keepalived 配置
A 机房 (192.168.1.10)
# /etc/keepalived/keepalived.conf
global_defs {
router_id LVS_DEVEL_A
}
# 管理 VIP1 (本机为主)
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.1.100/24
}
track_script {
check_nginx
}
}
# 管理 VIP2 (本机为备)
vrrp_instance VI_2 {
state BACKUP
interface eth0
virtual_router_id 52
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.1.101/24
}
track_script {
check_nginx
}
}
# 健康检查脚本
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
weight -25
fall 2
rise 1
}
B 机房 (192.168.1.11)
# /etc/keepalived/keepalived.conf
global_defs {
router_id LVS_DEVEL_B
}
# 管理 VIP1 (本机为备)
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.1.100/24
}
track_script {
check_nginx
}
}
# 管理 VIP2 (本机为主)
vrrp_instance VI_2 {
state MASTER
interface eth0
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.1.101/24
}
track_script {
check_nginx
}
}
# 健康检查脚本
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
weight -25
fall 2
rise 1
}
3.2 健康检查脚本
# /etc/keepalived/check_nginx.sh
#!/bin/bash
# 检查 Nginx 进程
if ! pidof nginx > /dev/null; then
# 尝试重启
systemctl restart nginx
sleep 2
# 重启失败,返回非0,触发 Keepalived 降低优先级
if ! pidof nginx > /dev/null; then
exit 1
fi
fi
exit 0
权限设置:
chmod +x /etc/keepalived/check_nginx.sh
3.3 Nginx 配置(两机房一致)
# /etc/nginx/nginx.conf
user nginx;
worker_processes auto;
events {
worker_connections 1024;
}
http {
upstream backend {
ip_hash;
server 10.0.1.10:8080; # 后端应用服务器1
server 10.0.1.11:8080; # 后端应用服务器2
# ... 其他后端服务器
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
4. 启动与验证
4.1 启动服务
# 启动 Nginx
systemctl start nginx
systemctl enable nginx
# 启动 Keepalived
systemctl start keepalived
systemctl enable keepalived
4.2 验证步骤
- 检查 VIP:在两台服务器上执行
ip addr show eth0
,确认 VIP1 在 A 机房,VIP2 在 B 机房。 - 测试访问:分别通过
http://192.168.1.100
和http://192.168.1.101
访问服务,确认均可正常响应。 - 模拟故障:在 A 机房执行
systemctl stop nginx
,观察日志,确认 VIP1 漂移到 B 机房,并可通过 VIP1 访问服务。
5. 注意事项
- 防火墙:确保两机房服务器之间开放 VRRP 协议(IP 协议号 112)和 Keepalived 通信端口。
- 网络延迟:跨机房部署需考虑网络延迟对 VRRP 通信的影响,
advert_int
可适当调整。 - DNS 配置:建议将业务域名解析到两个 VIP,实现客户端侧的负载分担。
- 监控告警:对接 Zabbix、Prometheus 等监控系统,实时监控 Keepalived 状态和 VIP 漂移事件。