从原理到实战:Nginx/LVS 负载均衡与 Keepalived 高可用架构详解

发布于:2025-07-21 ⋅ 阅读:(14) ⋅ 点赞:(0)

在高并发业务场景中,单台服务器的性能和可靠性往往难以满足需求。负载均衡技术通过将流量分发到多台后端服务器,提升系统吞吐量;而高可用架构则通过消除单点故障,保障服务持续运行。本文将从 Nginx/LVS 的核心原理出发,结合 Keepalived 的高可用机制,详解 7 层负载均衡与双 VIP 架构的搭建过程,助力构建稳定可靠的服务集群。

一、负载均衡基础:Nginx 与 LVS 的核心区别​

负载均衡技术主要分为4 层(传输层) 和7 层(应用层),Nginx 与 LVS 分别是两者的典型代表,适用场景各有侧重。​

1. Nginx:7 层负载均衡​

Nginx 是一款轻量级的 HTTP 服务器,同时具备优秀的 7 层负载均衡能力,基于 HTTP/HTTPS 协议工作,支持复杂的路由规则和应用层处理。​

核心模块与工作原理:​

ngx_http_proxy_module:实现反向代理,通过proxy_pass指令将请求转发至后端服务器,例如:​

location /api/ {​
    proxy_pass http://backend_server;  # 转发至后端服务集群​
    proxy_set_header Host $host;      # 传递原始主机头​
    proxy_set_header X-Real-IP $remote_addr;  # 传递客户端真实IP​
}

ngx_http_upstream_module:管理后端服务器集群,支持多种负载均衡策略:​

轮询(默认):按顺序分发请求到各服务器;​

weight(权重):server 192.168.1.101 weight=5; 权重越高,接收请求越多,适合服务器性能不均的场景;​

ip_hash:根据客户端 IP 哈希值固定分发到某台服务器,解决会话保持问题(如登录状态);​

least_conn:优先分发到连接数最少的服务器,适合长连接场景(如 WebSocket)。​

优势与适用场景:​

    支持 URL 路由(如location /static/转发至静态资源服务器)、SSL 卸载(集中处理 HTTPS 加密);​

    配置简单,适合 Web 应用、API 服务等 7 层协议场景;​

    单实例能支撑数万并发,通过集群可进一步提升性能。​

2. LVS:4 层负载均衡的 “性能王者”​

LVS(Linux Virtual Server)是内核级别的 4 层负载均衡技术,基于 TCP/UDP 协议工作,性能远超 Nginx,能支撑百万级并发,适合高吞吐场景。​

核心模式与工作原理:​

    DR 模式(Direct Routing):最常用的模式,LVS 仅处理请求分发,后端服务器直接向客户端返回响应,避免流量回传瓶颈。原理是通过修改数据包的 MAC 地址,将请求转发至后端服务器,后端服务器需配置 VIP(虚拟 IP)在回环网卡;​

    NAT 模式:请求和响应均经过 LVS,适合后端服务器无法直接访问公网的场景,但存在性能瓶颈(流量翻倍);​

    TUN 模式:通过 IP 隧道转发数据包,适合跨机房集群,但配置复杂。​

调度算法:​

    rr(轮询)、wrr(加权轮询) 类似 Nginx;​

    lc(最少连接)、wlc(加权最少连接) 适合长连接服务;​

    sh(源地址哈希) 类似 ip_hash,实现会话绑定。​

优势与适用场景:​

    内核级转发,性能损耗极低,适合数据库、视频流等 4 层协议服务;​

    稳定性强,单点故障影响小(可配合 Keepalived 实现高可用)。​

二、Keepalived:高可用的 “守护者”​

即使负载均衡器性能再强,单点故障仍会导致整个服务中断。Keepalived 基于 VRRP(虚拟路由冗余协议)实现双机热备,确保负载均衡层的高可用。​

1. 核心工作原理​

VRRP 通过选举机制产生主节点(Master)和从节点(Backup),主节点持有 VIP(虚拟 IP)并处理流量,从节点实时监控主节点状态,当主节点故障时自动接管 VIP,实现无缝切换。​

    优先级:主节点优先级高于从节点(默认 100,数值越大优先级越高);​

    心跳检测:主节点定期发送 VRRP 通告报文(默认每 1 秒),从节点若超时未收到则认为主节点故障;​

    抢占模式:默认开启,当主节点恢复后,会抢占回 VIP(可关闭避免频繁切换)。​

2. 健康检测机制​

Keepalived 不仅能检测负载均衡器本身的状态,还能通过脚本检测后端服务健康状态,确保流量只分发到正常节点。​

配置示例(检测 Nginx 是否存活):​

vrrp_script check_nginx {​
    script "/etc/keepalived/check_nginx.sh"  # 检测脚本路径​
    interval 2  # 每2秒检测一次​
    weight -20  # 检测失败,优先级减20​
}​
​
vrrp_instance VI_1 {​
    state MASTER​
    interface eth0​
    virtual_router_id 51​
    priority 100​
    advert_int 1​
    authentication {​
        auth_type PASS​
        auth_pass 1111​
    }​
    virtual_ipaddress {​
        192.168.1.100  # VIP​
    }​
    track_script {​
        check_nginx  # 关联检测脚本​
    }​
}

检测脚本check_nginx.sh:​

#!/bin/bash
if ! ps -C nginx > /dev/null; then
    systemctl start nginx  # 尝试重启Nginx
    sleep 2
    if ! ps -C nginx > /dev/null; then
        exit 1  # 重启失败,返回非0值触发主从切换
    fi
fi

3. Notify 功能:状态切换时的 “自动化工具”​

Notify 功能允许在主从状态切换时执行自定义脚本(如发送告警、切换服务配置),提升运维自动化水平。​

配置示例:​

vrrp_instance VI_1 {
    # ... 其他配置 ...
    notify_master "/etc/keepalived/notify_master.sh"  # 成为主节点时执行
    notify_backup "/etc/keepalived/notify_backup.sh"  # 成为从节点时执行
    notify_fault "/etc/keepalived/notify_fault.sh"    # 故障时执行
}

notify_master.sh(发送告警并启用服务):​

#!/bin/bash
echo "[$(date)] 切换为主节点,VIP: 192.168.1.100" >> /var/log/keepalived_notify.log
systemctl start nginx  # 确保Nginx启动
curl -X POST -d "状态切换:主节点接管VIP" https://alert.example.com  # 发送告警

三、实战:Nginx 7 层负载均衡 + 双 VIP 高可用架构​

1. 架构设计目标​

    负载均衡:通过 Nginx 将 HTTP 请求分发到 2 台后端 Web 服务器;​

    高可用:2 台 Nginx 节点(主从)配合 Keepalived,实现 VIP 自动漂移,避免单点故障;​

    双 VIP:主节点持有 VIP1(192.168.1.100),从节点持有 VIP2(192.168.1.101),正常情况下分担流量,故障时自动接管对方 VIP。​

2. 环境准备​

角色​

主机名​

IP 地址​

职责​

Nginx 主节点​

lb-master​

192.168.1.10​

主负载均衡,持有 VIP1​

Nginx 从节点​

lb-backup​

192.168.1.11​

从负载均衡,持有 VIP2​

后端服务器 1​

web1​

192.168.1.20​

提供 Web 服务​

后端服务器 2​

web2​

192.168.1.21​

提供 Web 服务​

3. 搭建步骤​

步骤 1:配置后端 Web 服务器​

在 web1 和 web2 上部署简单 Web 服务(以 Nginx 为例):​

# 安装Nginx
yum install -y nginx
# 编写测试页面
echo "web1: $(hostname -I)" > /usr/share/nginx/html/index.html  # web1
echo "web2: $(hostname -I)" > /usr/share/nginx/html/index.html  # web2
systemctl start nginx && systemctl enable nginx

步骤 2:配置 Nginx 7 层负载均衡​

在 lb-master 和 lb-backup 上配置相同的负载均衡规则(/etc/nginx/conf.d/proxy.conf):​

upstream web_servers {
    server 192.168.1.20 weight=1;  # 后端服务器1
    server 192.168.1.21 weight=1;  # 后端服务器2
    ip_hash;  # 启用会话保持
}

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://web_servers;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

启动 Nginx 并验证:systemctl start nginx && nginx -t​

步骤 3:配置 Keepalived 双 VIP 高可用​

在 lb-master 上配置/etc/keepalived/keepalived.conf:​

global_defs {
    router_id LVS_MASTER  # 唯一标识
}

# 检测Nginx存活的脚本
vrrp_script check_nginx {
    script "/etc/keepalived/check_nginx.sh"
    interval 2
    weight -20
}

# 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 dev eth0  # VIP1
    }
    track_script {
        check_nginx
    }
    notify_master "/etc/keepalived/notify_master.sh"
    notify_backup "/etc/keepalived/notify_backup.sh"
}

# VIP2配置(从节点角色)
vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    virtual_router_id 52
    priority 90  # 低于从节点的VI_2优先级
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.1.101/24 dev eth0  # VIP2
    }
    track_script {
        check_nginx
    }
}

在 lb-backup 上配置 Keepalived(与主节点类似,调整state和priority):​

    VI_1 的state设为 BACKUP,priority设为 90;​

    VI_2 的state设为 MASTER,priority设为 100。​

步骤 4:启动服务并测试​

  1. 启动 Keepalived:systemctl start keepalived && systemctl enable keepalived;​

  2. 验证 VIP:在主节点执行ip addr,应看到 VIP1;从节点看到 VIP2;​

  3. 测试负载均衡:访问http://192.168.1.100http://192.168.1.101,应交替返回 web1 和 web2 的页面;​

  4. 测试故障切换:关闭 lb-master 的 Nginx(systemctl stop nginx),等待 3 秒后,在 lb-backup 上执行ip addr,应看到 VIP1 已漂移过来。​

四、常见问题与优化​

  1. VIP 冲突:确保后端服务器不配置 VIP,避免 ARP 广播冲突;​
  2. 健康检测频率:interval不宜过短(建议 1-3 秒),避免误判;​
  3. 会话保持:7 层用 Nginx 的ip_hash,4 层用 LVS 的sh算法,或引入 Redis 存储会话;​
  4. 监控告警:结合 Prometheus+Grafana 监控 Nginx 连接数、Keepalived 状态,及时发现异常。​

总结​

Nginx 与 LVS 分别在 7 层和 4 层负载均衡中发挥核心作用,而 Keepalived 通过 VRRP 协议解决了单点故障问题。双 VIP 架构,既实现了负载分担,又保障了高可用。

 


网站公告

今日签到

点亮在社区的每一天
去签到