lvs 集群部署

LVS 集群部署

一、LVS 核心概念与模式选择

LVS(Linux Virtual Server)是 Linux 内核集成的四层负载均衡解决方案,通过 IPVS 模块实现请求分发,性能远高于 Nginx 等七层负载均衡。

1.1 三种工作模式对比

模式 核心原理 性能 网络要求 适用场景
DR 模式(Direct Routing) 调度器仅修改 MAC 地址,RS 直接响应客户端 最高 VIP 与 RS 同网段,RS 需配置 VIP 到 lo 接口 大规模 Web 服务,追求机制性能
NAT 模式 调度器做 DNAT / PNAT转换,RS 网关指向调度器 调度器双网卡,RS 与外网隔离 小规模服务,RS 无公网 IP
TUN 模式 IP 隧道封装,RS 跨网段直接响应客户端 中高 支持 IPIP / GRE 隧道,RS 需配置隧道接口 跨机房部署,RS 分散在不同网段

二、环境规划与准备(DR 模式)

2.1 服务器角色与网络配置

角色 主机名 IP 地址 核心配置
调度器 (Director) lvs-director DIP: 192.168.1.100VIP: 192.168.1.200/32 双网卡 (可选),安装 ipvsadm
真实服务器 1 (RS1) web1 RIP: 192.168.1.101VIP: 192.168.1.200/32(lo) 安装 Nginx,配置 ARP 参数
真实服务器 2 (RS2) web2 RIP: 192.168.1.102VIP: 192.168.1.200/32(lo) 安装 Nginx,配置 ARP 参数
客户端 client 192.168.1.201 测试访问 VIP

2.2 基础环境准备(所有节点)

bash 复制代码
# 关闭防火墙和SELinux(生产环境建议开放必要端口)
systemctl stop firewalld && systemctl disable firewalld
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

# 安装依赖工具
yum install -y ipvsadm net-tools vim wget  # CentOS/RHEL
dnf install -y ipvsadm net-tools vim wget  # openEuler

# 加载IPVS内核模块
modprobe ip_vs
modprobe ip_vs_rr  # 轮询算法
modprobe ip_vs_wrr # 加权轮询
modprobe ip_vs_sh  # 源地址哈希
lsmod | grep ip_vs  # 验证模块加载

# 安装Web服务(RS节点额外执行)
yum install -y nginx
systemctl start nginx && systemctl enable nginx
echo "RS1: $(hostname -I)" > /usr/share/nginx/html/index.html  # RS1
echo "RS2: $(hostname -I)" > /usr/share/nginx/html/index.html  # RS2

三、DR 模式核心配置步骤

3.1 调度器(Director)配置

3.1.1 配置 VIP 地址
bash 复制代码
# 临时添加VIP(重启失效)
ip addr add 192.168.1.200/32 dev eth0  # 绑定到外网网卡

# 永久配置VIP(推荐)
cat > /etc/sysconfig/network-scripts/ifcfg-eth0:0 << EOF
DEVICE=eth0:0
ONBOOT=yes
IPADDR=192.168.1.200
NETMASK=255.255.255.255
EOF
ifup eth0:0
3.1.2 配置 IPVS 规则
bash 复制代码
# 清空原有规则
ipvsadm -C

# 添加虚拟服务(VIP:80,轮询算法rr)
ipvsadm -A -t 192.168.1.200:80 -s rr

# 添加真实服务器(DR模式用-g参数,权重1)
ipvsadm -a -t 192.168.1.200:80 -r 192.168.1.101:80 -g -w 1
ipvsadm -a -t 192.168.1.200:80 -r 192.168.1.102:80 -g -w 1

# 保存规则(重启后自动加载)
ipvsadm -S > /etc/sysconfig/ipvsadm
systemctl enable ipvsadm --now

# 查看规则
ipvsadm -Ln

3.2 真实服务器(RS)核心配置

DR 模式必须配置以下内容,否则会出现 VIP 地址冲突和 ARP 响应异常问题。

3.2.1 配置 VIP 到 lo 接口
bash 复制代码
# 临时配置
ip addr add 192.168.1.200/32 dev lo

# 永久配置
cat > /etc/sysconfig/network-scripts/ifcfg-lo:0 << EOF
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.1.200
NETMASK=255.255.255.255
EOF
ifup lo:0
3.2.2 修改 ARP 内核参数(禁用 VIP 响应)
bash 复制代码
# 临时生效
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

# 永久生效
cat >> /etc/sysctl.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 -p

参数说明:

  • arp_ignore:仅响应目标 IP 为接收网卡配置 IP 的 ARP 请求
  • arp_announce=2:发送 ARP 时仅使用网卡真实 IP 作为源地址
3.2.3 验证 RS 配置
bash 复制代码
yum install -y keepalived
systemctl enable keepalived --now

四、LVS + Keepalived 高可用配置(生产)

点调度器存在单点故障,通过 Keepalived 实现双机热备,自动故障转移

4.1 安装 Keepalived(两台调度器)

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

4.2 主调度器(Master)配置

文件位置:/etc/keepalived/keepalived.conf

bash 复制代码
! Configuration File for keepalived
global_defs {
   router_id LVS_DEVEL  # 唯一标识
}

vrrp_instance VI_1 {
    state MASTER        # 主节点
    interface eth0      # 绑定VIP的网卡
    virtual_router_id 51 # 虚拟路由ID(主备一致)
    priority 150        # 优先级(主>备)
    advert_int 1        # 心跳间隔1秒

    authentication {
        auth_type PASS
        auth_pass 1111  # 认证密码(主备一致)
    }

    virtual_ipaddress {
        192.168.1.200/32 dev eth0  # VIP配置
    }
}

# LVS虚拟服务配置
virtual_server 192.168.1.200 80 {
    delay_loop 3          # 健康检查间隔
    lb_algo rr            # 调度算法(rr/wrr/lc/wlc/sh等)
    lb_kind DR            # DR模式
    persistence_timeout 50 # 会话保持时间(0=关闭)
    protocol TCP

    real_server 192.168.1.101 80 {
        weight 1          # 权重
        TCP_CHECK {       # 健康检查
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 192.168.1.202 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

4.3 备调度器(Backup)配置

(进修改差异部分)

bash 复制代码
state BACKUP           # 备节点
priority 100           # 优先级低于主节点

4.4 启动并验证高可用

bash 复制代码
systemctl restart keepalived
ip addr show eth0  # 主节点应绑定VIP
tail -f /var/log/messages  # 查看日志

五、NAT 模式快速部署

5.1 基础准备(所有节点)

bash 复制代码
# 1. 关闭防火墙与 SELinux(生产按需开放端口)
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

# 2. 安装依赖
yum install -y ipvsadm net-tools vim  # CentOS 7
dnf install -y ipvsadm net-tools vim  # openEuler

# 3. 加载 IPVS 内核模块
modprobe ip_vs
modprobe ip_vs_rr
modprobe ip_vs_wrr
modprobe ip_vs_sh
lsmod | grep ip_vs  # 验证

5.2 调度器配置

外网网卡(eth0,VIP)

bash 复制代码
vim /etc/sysconfig/network-scripts/ifcfg-eth0
ini 复制代码
TYPE=Ethernet
BOOTPROTO=static
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=203.0.113.100
NETMASK=255.255.255.0
GATEWAY=203.0.113.1    # 外网网关
DNS1=223.5.5.5

内网网卡(eth1,DIP)

bash 复制代码
vim /etc/sysconfig/network-scripts/ifcfg-eth1
ini 复制代码
TYPE=Ethernet
BOOTPROTO=static
NAME=eth1
DEVICE=eth1
ONBOOT=yes
IPADDR=192.168.10.1
NETMASK=255.255.255.0
# 内网网卡**不要配网关与DNS**

重启网络

复制代码
systemctl restart network
# 验证
ip addr show eth0
ip addr show eth1

5.3 开启 IP 转发

bash 复制代码
# 临时生效
echo 1 > /proc/sys/net/ipv4/ip_forward

# 永久生效
cat >> /etc/sysctl.conf << EOF
net.ipv4.ip_forward = 1
# 关闭重定向(避免路由异常)
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0
net.ipv4.conf.eth1.send_redirects = 0
EOF

sysctl -p  # 加载

5.4 配置 LVS-NAT 规则(ipvsadm)

bash 复制代码
# 1. 清空旧规则
ipvsadm -C

# 2. 添加虚拟服务(VIP:80,轮询 rr)
# -A:添加虚拟服务;-t:TCP;-s:调度算法(rr/wrr/lc/wlc)
ipvsadm -A -t 203.0.113.100:80 -s rr

# 3. 添加后端 RS(-m 指定 NAT 模式)
# -a:添加RS;-r:RIP;-m:NAT;-w:权重
ipvsadm -a -t 203.0.113.100:80 -r 192.168.10.101:80 -m -w 1
ipvsadm -a -t 203.0.113.100:80 -r 192.168.10.102:80 -m -w 1

# 4. 保存规则(开机自加载)
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl enable ipvsadm --now

# 5. 查看规则
ipvsadm -Ln

输出

复制代码
TCP  203.0.113.100:80 rr
  -> 192.168.10.101:80          Masq    1      0          0
  -> 192.168.10.102:80          Masq    1      0          0

5.5 真实服务器(RS)配置

bash 复制代码
vim /etc/sysconfig/network-scripts/ifcfg-eth0

RS1

ini 复制代码
TYPE=Ethernet
BOOTPROTO=static
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.10.101
NETMASK=255.255.255.0
GATEWAY=192.168.10.1    # 必须是调度器内网DIP
DNS1=223.5.5.5

RS2

ini 复制代码
IPADDR=192.168.10.102
其余同 RS1

重启网络

bash 复制代码
systemctl restart network
# 验证网关
ip route show | grep default
# 输出:default via 192.168.10.1 dev eth0

5.6 功能测试

负载均衡

bash 复制代码
# 循环访问 VIP 10 次
for i in {1..10}; do curl http://203.0.113.100; done

预期结果

复制代码
RS-01: 192.168.10.101
RS-02: 192.168.10.102
RS-01: 192.168.10.101
RS-02: 192.168.10.102
...(轮询分发)

连接状态查看

bash 复制代码
ipvsadm -Ln --stats  # 查看连接统计
ipvsadm -Ln --rate   # 查看速率

故障转移

bash 复制代码
# 停止 RS1 Nginx
systemctl stop nginx@web-01

# 再次访问,所有流量自动切到 RS2
for i in {1..5}; do curl http://203.0.113.100; done

# 启动 RS1,自动恢复负载均衡
systemctl start nginx@web-01
相关推荐
沐雪轻挽萤2 小时前
6. C++17新特性-编译期 if 语句 (if constexpr)
开发语言·c++
水云桐程序员2 小时前
C语言编程基础,输入与输出
c语言·开发语言·算法
爱代码的小黄人2 小时前
MATLAB中for循环实现递减遍历(通用方法)
开发语言·matlab
weixin_704266052 小时前
手机体检预约系统开发解析
java·开发语言
白露与泡影2 小时前
Java八股文大全(2026最新版)大厂面试题附答案详解
java·开发语言
apcipot_rain2 小时前
【天梯赛】2026天梯赛模拟赛——题解
开发语言·c++·算法·蓝桥杯·天梯赛
Rust研习社2 小时前
Rust 堆内存指针 Box 详解
开发语言·后端·rust
liulilittle2 小时前
Lua 浮点数比较
开发语言·junit·lua
杰克尼2 小时前
redis(day08-Redis原理篇)
数据库·redis·php