CentOS 7 搭建 LVS + Keepalived 高可用负载均衡

CentOS 7 搭建 LVS + Keepalived 高可用负载均衡

1. 服务介绍

LVS(Linux Virtual Server)工作在内核 IPVS 层,可以把访问虚拟 IP(VIP)的请求按调度算法分发到多台真实服务器。Keepalived 使用 VRRP 在主、备调度器之间漂移 VIP,并对后端服务执行健康检查。二者结合后,可以同时解决单台调度器故障和后端 Web 节点故障问题,适合四层高性能负载均衡场景。

2. 准备运行环境

本实验使用 CentOS 7.x,所有节点位于同一二层网络,示例拓扑如下:

| 角色 | 主机名 | IP 地址 |

| --- | --- | --- |

| LVS 主调度器 | lvs-master | 10.1.100.101 |

| LVS 备调度器 | lvs-backup | 10.1.100.102 |

| 虚拟地址 VIP | - | 10.1.100.100 |

| Web 节点 1 | web1 | 10.1.100.201 |

| Web 节点 2 | web2 | 10.1.100.202 |

| 测试客户端 | client | 10.1.100.50 |

先在各节点检查系统、网络和时间同步状态:

bash 复制代码
cat /etc/centos-release
uname -r
ip addr
ping -c 3 10.1.100.101
timedatectl status

实验采用 LVS-DR 模式。放行 VRRP 协议和 Web 服务端口;如果是临时实验环境,也可以在确认网络边界安全后暂时停用 firewalld。

3. 相关知识

• **NAT 模式**:请求和响应都经过调度器,部署简单,但调度器容易成为带宽瓶颈。

• **DR 模式**:调度器只改写二层目标 MAC,真实服务器直接向客户端响应,性能高,但调度器和真实服务器通常要在同一二层网络。

• **TUN 模式**:通过 IP 隧道转发,可跨网段部署,但节点必须支持隧道配置。

• **VIP 漂移**:同一时刻只应由 MASTER 持有 VIP;BACKUP 检测到主节点故障后接管 VIP。

• **ARP 抑制**:DR 模式中真实服务器也配置 VIP,但不能对外响应该 VIP 的 ARP,否则客户端可能绕过 LVS。

• **健康检查**:Keepalived 检测到某个 Web 节点异常后,会把它从 IPVS 转发表移除;服务恢复后再自动加入。

virtual_router_id 在同一广播域内必须唯一,主备节点配置必须一致;priority 较大的节点优先成为 MASTER。

4. 实验步骤

4.1 配置两台 Web 节点

web1web2 上安装并启动 Nginx:

bash 复制代码
yum install -y epel-release nginx
systemctl enable --now nginx
echo "web1 10.1.100.201" > /usr/share/nginx/html/index.html

web2 上把测试页内容改为:

bash 复制代码
echo "web2 10.1.100.202" > /usr/share/nginx/html/index.html

两台 Web 节点都把 VIP 配置在回环接口,并抑制 ARP 响应:

bash 复制代码
cat > /etc/sysctl.d/99-lvs-dr.conf <<'EOF'
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
EOF

sysctl --system
ip addr add 10.1.100.100/32 dev lo label lo:0

为保证重启后仍然生效,创建回环接口配置 /etc/sysconfig/network-scripts/ifcfg-lo:0

ini 复制代码
DEVICE=lo:0
IPADDR=10.1.100.100
NETMASK=255.255.255.255
ONBOOT=yes
NAME=loopback-VIP

4.2 安装 LVS 和 Keepalived

在两台调度器上执行:

bash 复制代码
yum install -y ipvsadm keepalived
systemctl enable keepalived

4.3 配置主调度器

备份配置文件:

bash 复制代码
cp -a /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak

编辑 /etc/keepalived/keepalived.conf。示例网卡名为 ens33,应按 ip link 的实际结果修改:

conf 复制代码
global_defs {
    router_id LVS_MASTER
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 120
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass lvs12345
    }
    virtual_ipaddress {
        10.1.100.100/24 dev ens33
    }
}

virtual_server 10.1.100.100 80 {
    delay_loop 3
    lb_algo rr
    lb_kind DR
    protocol TCP

    real_server 10.1.100.201 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            retry 3
            delay_before_retry 2
            connect_port 80
        }
    }

    real_server 10.1.100.202 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            retry 3
            delay_before_retry 2
            connect_port 80
        }
    }
}

4.4 配置备调度器

备调度器使用相同的 virtual_server 配置,只修改以下项目:

conf 复制代码
global_defs {
    router_id LVS_BACKUP
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass lvs12345
    }
    virtual_ipaddress {
        10.1.100.100/24 dev ens33
    }
}

virtual_router_id、认证信息、VIP 和后端节点配置必须与主调度器一致。

4.5 启动服务

先检查配置,再分别启动主、备调度器:

bash 复制代码
keepalived -t -f /etc/keepalived/keepalived.conf
systemctl restart keepalived
systemctl status keepalived --no-pager

5. 验证结果

在主调度器检查 VIP、VRRP 状态和 IPVS 转发表:

bash 复制代码
ip addr show dev ens33
ipvsadm -Ln
ipvsadm -Ln --stats
journalctl -u keepalived -n 50 --no-pager

正常情况下,VIP 10.1.100.100 位于 MASTER,转发表中有两个真实服务器。

在客户端连续访问 VIP,观察请求是否轮询到不同后端:

bash 复制代码
for i in {1..6}; do curl -s http://10.1.100.100/; done

验证后端健康检查时,在 web1 停止 Nginx:

bash 复制代码
systemctl stop nginx

随后在主调度器执行 ipvsadm -Ln,确认 10.1.100.201:80 被移除,同时客户端仍能通过 web2 访问服务。恢复 Nginx 后,该节点应自动重新加入。

验证主备切换时,在 MASTER 上停止 Keepalived:

bash 复制代码
systemctl stop keepalived

在备调度器执行:

bash 复制代码
ip addr show dev ens33
ipvsadm -Ln
journalctl -u keepalived -n 50 --no-pager

如果 VIP 已漂移到备调度器,客户端访问没有长时间中断,说明 LVS + Keepalived 高可用负载均衡配置成功。

相关推荐
爆浇牛肉面1 小时前
Linux进阶命令:测开必学的curl和jq
linux
minglie13 小时前
zynq的linux驱动版终端AtShellDrv
linux
欧神附体1235 小时前
在虚拟机搭建本地仓库和网络仓库
linux·运维·服务器
是个西兰花6 小时前
Linux:深入解析Linux线程原理与实现
linux·运维·c++·线程·互斥锁
运维大师6 小时前
【Linux运维极简教程】07-磁盘管理与LVM
linux·运维·服务器
乖巧的妹子6 小时前
刷题总结知识
linux·服务器·windows
拳里剑气7 小时前
Linux:基础IO
linux·运维·服务器·io
小小龙学IT7 小时前
Day 2-3:Linux 文件与目录操作
linux
三8447 小时前
基本Linux命令总结
linux·运维·服务器
hehelm8 小时前
AI 大模型接入 SDK —项目概述
linux·服务器·网络·数据库·c++