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
相关推荐
天若有情67310 小时前
逆向玩家狂喜!用C++野生写法一键破解线性加密(不规范但巨好用)
开发语言·c++·算法
XiYang-DING10 小时前
JavaScript
开发语言·javascript·ecmascript
skywalk816310 小时前
代码高尔夫(Code Golf)是一种以“用最少的字符数实现特定功能”为核心目标的编程挑战或风格。
开发语言
xyq202410 小时前
MySQL 安装配置
开发语言
鸽子一号10 小时前
c#Modbus通信
开发语言·c#
念何架构之路10 小时前
Go Socket编程
开发语言·后端·golang
feifeigo12310 小时前
基于无迹变换的电网概率潮流分析 MATLAB 实现
开发语言·算法·matlab
时空系10 小时前
第13篇:综合实战——制作我的小游戏 Rust中文编程
开发语言·后端·rust
CoderCodingNo11 小时前
【信奥业余科普】C++ 的奇妙之旅 | 19:内存的门牌号——地址与指针的设计原理
开发语言·c++
@insist12311 小时前
信息安全工程师-物理隔离技术基础核心考点解析
开发语言·网络·安全·软考·信息安全工程师·软件水平考试