Administrator
发布于 2025-10-15 / 3 阅读
0
0

双机房双活方案nginx+keepalived方式

双机房双活高可用解决方案

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 验证步骤

  1. 检查 VIP:在两台服务器上执行 ip addr show eth0,确认 VIP1 在 A 机房,VIP2 在 B 机房。
  2. 测试访问:分别通过 http://192.168.1.100http://192.168.1.101 访问服务,确认均可正常响应。
  3. 模拟故障:在 A 机房执行 systemctl stop nginx,观察日志,确认 VIP1 漂移到 B 机房,并可通过 VIP1 访问服务。

5. 注意事项

  • 防火墙:确保两机房服务器之间开放 VRRP 协议(IP 协议号 112)和 Keepalived 通信端口。
  • 网络延迟:跨机房部署需考虑网络延迟对 VRRP 通信的影响,advert_int 可适当调整。
  • DNS 配置:建议将业务域名解析到两个 VIP,实现客户端侧的负载分担。
  • 监控告警:对接 Zabbix、Prometheus 等监控系统,实时监控 Keepalived 状态和 VIP 漂移事件。


评论