LVS与HAProxy高可用负载方案详解

目录

[方案 1:LVS + Keepalived(四层负载,性能最高)](#方案 1:LVS + Keepalived(四层负载,性能最高))

前提

[步骤 1:配置 MASTER 节点(LB1:192.168.1.20)](#步骤 1:配置 MASTER 节点(LB1:192.168.1.20))

[步骤 2:配置 BACKUP 节点(LB2:192.168.1.21)](#步骤 2:配置 BACKUP 节点(LB2:192.168.1.21))

[步骤 3:添加 Nginx 检测脚本(/etc/keepalived/check_nginx.sh)](#步骤 3:添加 Nginx 检测脚本(/etc/keepalived/check_nginx.sh))

[步骤 4:启动服务](#步骤 4:启动服务)

[方案 2:HAProxy + Keepalived(七层负载,支持 Cookie 会话保持)](#方案 2:HAProxy + Keepalived(七层负载,支持 Cookie 会话保持))

前提

[步骤 1:配置 HAProxy(/etc/haproxy/haproxy.cfg)](#步骤 1:配置 HAProxy(/etc/haproxy/haproxy.cfg))

[步骤 2:配置 Keepalived(主备节点,负责 VIP 漂移)](#步骤 2:配置 Keepalived(主备节点,负责 VIP 漂移))

[MASTER 节点(LB1:192.168.1.20):](#MASTER 节点(LB1:192.168.1.20):)

[BACKUP 节点(LB2:192.168.1.21):](#BACKUP 节点(LB2:192.168.1.21):)

[步骤 3:HAProxy 检测脚本(/etc/keepalived/check_haproxy.sh)](#步骤 3:HAProxy 检测脚本(/etc/keepalived/check_haproxy.sh))

[步骤 4:启动服务](#步骤 4:启动服务)

验证会话保持是否生效

[方法 1:日志验证(推荐)](#方法 1:日志验证(推荐))

[方法 2:浏览器验证(Cookie 方式)](#方法 2:浏览器验证(Cookie 方式))

总结


既然你需要更精准的配置,我先把LVS+Keepalived (四层最常用)和HAProxy+Keepalived (七层更灵活)两种主流方案的完整可运行配置部署步骤验证方法都给你,你可以根据实际环境直接套用。


方案 1:LVS + Keepalived(四层负载,性能最高)

前提

  • 两台负载均衡器(LB1/MASTER:192.168.1.20,LB2/BACKUP:192.168.1.21)
  • 两台 Nginx 节点(NG1:192.168.1.30,NG2:192.168.1.31)
  • VIP(虚拟 IP):192.168.1.100(客户端访问的入口)
  • 所有机器已安装 keepalived ipvsadm(CentOS:yum install -y keepalived ipvsadm

步骤 1:配置 MASTER 节点(LB1:192.168.1.20)

编辑 /etc/keepalived/keepalived.conf

复制代码
! Configuration File for keepalived

global_defs {
   router_id LVS_MASTER  # 标识,唯一即可
}

# 监控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  # 网卡名(根据实际改,比如ens33)
    virtual_router_id 51  # 同一集群ID要一致
    priority 100  # MASTER优先级高于BACKUP(比如BACKUP设为90)
    advert_int 1  # 心跳间隔1秒
    authentication {
        auth_type PASS
        auth_pass 1111  # 认证密码,主备一致
    }
    virtual_ipaddress {
        192.168.1.100/24 dev eth0  # VIP绑定到网卡
    }
    track_script {
        check_nginx  # 启用Nginx检测脚本
    }
}

# LVS核心配置(会话保持+负载均衡)
virtual_server 192.168.1.100 80 {
    delay_loop 6  # 检测后端节点间隔
    lb_algo wrr   # 加权轮询(常用,也可设rr/leastconn)
    lb_kind DR    # DR模式(性能最好,推荐)
    persistence_timeout 600  # 会话保持超时(10分钟,同一IP固定到同一Nginx)
    protocol TCP

    # 后端Nginx节点1
    real_server 192.168.1.30 80 {
        weight 1  # 权重,数值越高分配越多
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    # 后端Nginx节点2
    real_server 192.168.1.31 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

步骤 2:配置 BACKUP 节点(LB2:192.168.1.21)

仅需修改 3 处,其余和 MASTER 一致:

复制代码
state BACKUP
priority 90  # 低于MASTER的100
router_id LVS_BACKUP

步骤 3:添加 Nginx 检测脚本(/etc/keepalived/check_nginx.sh)

bash 复制代码
#!/bin/bash
NGINX_PORT=80
# 检查Nginx是否运行
ps -ef | grep nginx | grep -v grep > /dev/null 2>&1
if [ $? -ne 0 ]; then
    # 停止keepalived,VIP漂移到备节点
    systemctl stop keepalived
    exit 1
fi
# 检查端口是否通
ss -tulpn | grep ":$NGINX_PORT " > /dev/null 2>&1
if [ $? -ne 0 ]; then
    systemctl stop keepalived
    exit 1
fi
exit 0

赋予执行权限:

bash 复制代码
chmod +x /etc/keepalived/check_nginx.sh

步骤 4:启动服务

bash 复制代码
# 主备节点都执行
systemctl enable --now keepalived
systemctl start ipvsadm  # 启用LVS

前提

  • 负载均衡器节点(LB1/MASTER:192.168.1.20,LB2/BACKUP:192.168.1.21)
  • Nginx 节点(NG1:192.168.1.30,NG2:192.168.1.31)
  • VIP:192.168.1.100
  • 已安装 keepalived haproxy(CentOS:yum install -y keepalived haproxy

步骤 1:配置 HAProxy(/etc/haproxy/haproxy.cfg)

复制代码
global
    log         127.0.0.1 local2
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon
    stats socket /var/lib/haproxy/stats

defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000

# 前端监听VIP
frontend http_front
    bind *:80
    bind 192.168.1.100:80  # 绑定VIP
    mode http
    option httplog
    default_backend nginx_backend

# 后端Nginx集群(Cookie会话保持)
backend nginx_backend
    mode http
    balance roundrobin  # 负载算法
    cookie SRV_ID insert indirect nocache  # 插入Cookie标识节点
    option httpchk GET /health  # 健康检查(Nginx需配置/health接口)
    # 绑定Cookie到节点,同一客户端固定到该节点
    server nginx1 192.168.1.30:80 check cookie nginx1 weight 1
    server nginx2 192.168.1.31:80 check cookie nginx2 weight 1

# 可选:HAProxy监控页面(访问 http://VIP/haproxy-stats)
listen stats
    bind *:8888
    mode http
    stats enable
    stats uri /haproxy-stats
    stats auth admin:123456  # 账号密码

步骤 2:配置 Keepalived(主备节点,负责 VIP 漂移)

MASTER 节点(LB1:192.168.1.20):
复制代码
global_defs {
   router_id HAPROXY_MASTER
}

vrrp_script check_haproxy {
    script "/etc/keepalived/check_haproxy.sh"
    interval 2
    weight -20
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 52
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 2222
    }
    virtual_ipaddress {
        192.168.1.100/24 dev eth0
    }
    track_script {
        check_haproxy
    }
}
BACKUP 节点(LB2:192.168.1.21):
复制代码
global_defs {
   router_id HAPROXY_BACKUP
}

vrrp_script check_haproxy {
    script "/etc/keepalived/check_haproxy.sh"
    interval 2
    weight -20
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 52
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 2222
    }
    virtual_ipaddress {
        192.168.1.100/24 dev eth0
    }
    track_script {
        check_haproxy
    }
}

步骤 3:HAProxy 检测脚本(/etc/keepalived/check_haproxy.sh)

bash 复制代码
#!/bin/bash
ps -ef | grep haproxy | grep -v grep > /dev/null 2>&1
if [ $? -ne 0 ]; then
    systemctl stop keepalived
    exit 1
fi
exit 0

赋予执行权限:

bash 复制代码
chmod +x /etc/keepalived/check_haproxy.sh

步骤 4:启动服务

bash 复制代码
# 主备节点都执行
systemctl enable --now haproxy
systemctl enable --now keepalived

验证会话保持是否生效

方法 1:日志验证(推荐)

  1. 在 Nginx 节点的 /etc/nginx/nginx.conf 中,确保日志格式包含客户端 IP 和服务器 IP:

    log_format main 'remote_addr - remote_user [time_local] "request" '
    'status body_bytes_sent "http_referer" ' '"http_user_agent" "http_x_forwarded_for" ' 'server_ip:server_addr'; # 新增服务器IP
    access_log /var/log/nginx/access.log main;

重启 Nginx:systemctl restart nginx

  1. 用同一客户端访问 http://192.168.1.100 多次,查看 Nginx 日志:
bash 复制代码
# 在NG1节点执行
tail -f /var/log/nginx/access.log
# 在NG2节点执行
tail -f /var/log/nginx/access.log

✅ 生效:所有请求都出现在同一台 Nginx 的日志里;❌ 未生效:请求分散在两台 Nginx 日志中。

方法 2:浏览器验证(Cookie 方式)

访问 http://192.168.1.100,打开浏览器「开发者工具→网络→请求头」,查看是否有 Set-Cookie: SRV_ID=nginx1(或 nginx2),且后续请求都携带该 Cookie → 生效。


总结

  1. 核心配置 :LVS 靠 persistence_timeout 实现 IP 级会话保持,HAProxy 靠 cookie 实现 Cookie 级会话保持;
  2. Keepalived 作用:仅负责 VIP 漂移(高可用),不参与负载分发和会话保持;
  3. 验证关键:同一客户端多次请求,日志仅出现在一台 Nginx 节点 → 会话保持生效。
相关推荐
docsz3 小时前
Flink-1.20集群部署
linux·服务器·flink
坤坤藤椒牛肉面3 小时前
常用知识点
linux
昵称只能一个月修改一次。。。3 小时前
串口+温度传感器
网络
行思理3 小时前
Linux查看网站访问IP的命令大全
linux·服务器·前端
zuozewei3 小时前
11 天,1 个人 + AI,搭了一套网络监控系统
网络·人工智能
sdszoe49223 小时前
OSPF多区域实验2
网络·路由与交换综合实验·多区域ospf路由
Rondox3 小时前
wake on lan 电脑局域网内远程开机
服务器·网络·电脑
Saniffer_SH3 小时前
【高清视频】实验室搭建PCIe 6.0测试环境需要的retimer卡介绍
服务器·驱动开发·测试工具·fpga开发·计算机外设·硬件架构·压力测试
sdm0704273 小时前
Linux-基础IO
linux·运维·操作系统·理解文件