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 节点 → 会话保持生效。
相关推荐
A小辣椒7 小时前
TShark:Wireshark CLI 功能
linux
A小辣椒11 小时前
TShark:基础知识
linux
AlfredZhao13 小时前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao1 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334661 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪1 天前
linux 拷贝文件或目录到指定的位置
linux
大树882 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠2 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush42 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5202 天前
Linux 11 动态监控指令top
linux