# Linux运维Day04:集群与 LVS 负载均衡(LVS-NAT 集群,LVS-DR 集群)

1. 集群简介

1.1 集群概述

  • 通过网络将大量服务器集中,对外提供统一服务,客户端感知为一台服务器
    • 任务调度是集群系统的核心技术。

1.2 集群目的

  • 提高性能:适用于计算密集型场景(如天气预报、核试验模拟)。
  • 降低成本:对比百万级超级计算机,价格更便宜,性价比更高。
  • 提高可扩展性:弹性伸缩。新增节点即可扩容。
  • 增加可靠性:多节点冗余,避免单点故障。

1.3 集群分类

  • 负载均衡集群(LB集群):客户端请求平均分摊到集群节点。
  • 高可用集群(HA集群):避免单点故障,故障节点自动切换,保障服务持续可用。
  • 高性能计算集群(HPC):并行计算,解决复杂科学问题。

2. LVS 软件简介

  • Linux 虚拟服务器(LVS):章文嵩在国防科技大学读博期间创建。
  • 实现高可用、可伸缩的 Web、Mail、Cache (缓存)等网络服务。
  • 目标:基于 Linux + LVS,构建高可用、高性能、低成本服务器集群。

LVS工作在传输层四层(TCP/UDP),它的本质是虚拟路由调度,只做请求调度分发,不处理业务、不拆包重组。

工作原理:像路由器一样转发数据包,只改 IP 端口,不解析应用数据

2.1 LVS 组成

  • 前端:负载均衡层:一台或多台调度器(Director Server)。
  • 中间:服务器群组层:真实提供服务的服务器(Real Server)。
  • 底端:数据共享存储层 :提供共享存储空间(如NFS等),保证数据一致性。

2.2 LVS 术语

  • Director Server(调度器)分发请求到真实服务器的服务器(仅作NAT地址转换,充当路由)
  • Real Server(真实服务器) :实际提供业务服务的服务器
  • VIP(虚拟 IP):对外暴露、用户访问的虚拟 IP。客户端只连 VIP
  • DIP(调度器 IP):调度器连接后端节点的中转 IP(相当于RIP的网关)。
  • RIP(真实 IP):后端集群节点服务器的IP地址。

如下图:客户端封包指向调度器,调度器转换地址,源地址不变,目标地址从VIP变成了RIP。回复的时候,服务端的包到达调度器,源地址是8网段,目标地址是DIP,调度器转换地址为客户端的ip

原理解析: DS同时拥有VIP和DIP。VIP用于和客户端通信,DIP用于和RIP通信(这里只做分发,不处理数据,不进行拆包)。请求到达调度器,调度器仅作NAT地址转换。
流量走向: 入站:客户端→VIP→DS (NAT地址转换,将目标地址转换成内网地址)路由转发→RIP 出站:RIP→网关
DIP→DS(NAT地址转换,将源地址转换成公网地址)→回传给客户端 换句话讲,调度器DS起到路由的作用,是集群内网核心路由,DIP
是后端服务器的默认网关

2.3 LVS 工作模式

  • VS/NAT(NAT 模式) :通过网络地址转换实现虚拟服务器;大并发时调度器易成瓶颈
  • VS/DR(DR 模式):直接路由技术实现虚拟服务器;节点需配置 VIP,需注意MAC地址广播
  • VS/TUN(隧道模式。用的少):IP 隧道封装转发;跨网段部署,成本高。

2.4 LVS 负载均衡调度算法(10 种,常用 4 种)

  • 轮询(Round Robin):请求依次分配,节点权重一致。
  • 加权轮询(Weighted Round Robin):性能高的节点可以增加更多权重,分配更多请求。
  • 最少连接(Least Connections):优先分配给当前连接数最少的节点。(当服务器连接数一致时,采用轮询算法)
  • 加权最少连接(Weighted Least Connections):结合权重与连接数,性能最优。(当服务器连接数一致时,采用加权算法)

下列几种了解即可:

  • 源地址散列(Source Hashing)
  • 目标地址散列(Destination Hashing)
  • 基于局部性的最少连接
  • 带复制的基于局部性的最少连接
  • 最短的期望延迟
  • 最少队列调度

3. LVS-NAT 集群

LVS-NAT 集群流程详解:

    1. 客户端请求阶段(客户端 → LVS)
    • 客户端发送请求包:
      • IP 头:src=192.168.4.10,dst=192.168.4.5(VIP)
      • TCP 头:sport=随机端口,dport=80
    • 数据包到达 LVS 调度器,调度器根据调度算法(如轮询)选中 RS1(192.168.8.100)
    1. LVS 做 DNAT 改写(LVS → RS
    • LVS 对数据包进行目的地址转换(DNAT):
      • IP 头改写:src=192.168.4.10(不变),dst=192.168.8.100(改为 RS1 的 RIP)
      • TCP 头不变:端口号保持不变(80)
      • 数据包通过 DIP 所在的内网网段,转发给 RS1。
    1. RS 处理请求并回包(RS → LVS)
    • RS1 收到请求后,处理并生成响应包:
      • IP 头:src=192.168.8.100,dst=192.168.4.10(客户端 IP)
      • 由于 RS1 的默认网关是 LVS 的 DIP(192.168.8.5),响应包必须先发给 LVS 调度器,无法直接回客户端。
    1. LVS 做 SNAT 改写(LVS → 客户端)
    • LVS 对响应包进行源地址转换(SNAT):
      • IP 头改写:src=192.168.4.5(VIP),dst=192.168.4.10(不变)
      • 数据包通过外网网卡,发回给客户端。
    1. 客户端收到响应
    • 客户端收到响应包,看到的源 IP 是 VIP(192.168.4.5),完全无感知后端 RS 的存在。

可以看得出来,LVS在客户端发起请求的时候,把目的IP从VIP改成RIP,回复的时候把源IP从RIP改成VIP

客户端的通信对象,从头到尾必须是 VIP,无论发出请求还是接收回复都是VIP。也就是我给A发请求,收到的回复必须是A给的,不然就是陌生人,陌生人的东西不能收,就会丢包

3.1 实验环境

  • 使用 template 模板机 ,准备 4 台虚拟机
  • 配置 IP,使用 WindTerm 远程连接。
  • 双网卡配置参考 Day03。

注意:web1,2的4网段是后续LVS-DR 集群的实验用得到的,不要配置过早,倘若过早配置,会因最短路径原则导致nat实验出问题

3.2 安装 ipvsadm(lvs 主机)

  • ipvsadm是lvs集群管理命令,需要安装软件ipvsadm
  • 虚拟机lvs主机操作
bash 复制代码
[root@lvs ~]# dnf -y install ipvsadm  #安装软件
[root@lvs ~]# ipvsadm  -v             #查看版本

3.3 ipvsadm 用法

虚拟服务器:由 LVS 调度器搭建而成的统一对外访问入口,并非真实业务主机

创建虚拟服务器
  • -A:添加虚拟服务器,创建集群
  • -t:指定集群地址,即VIP端口(VIP,Virtual IP)
  • -s:指定集群算法(rr|wrr|lc|wlc|...)
bash 复制代码
[root@lvs ~]# ipvsadm -A -t 192.168.4.5:80 -s rr  #添加虚拟服务器,VIP 4.50:80,算法为轮询
[root@lvs ~]# ipvsadm -Ln      #查看集群详细列表
添加/删除真实服务器
  • -a:添加真实服务器
  • -d:删除真实服务器
  • -r:指定真实服务器的地址(Real Server)
  • -w:为节点服务器设置权重,默认为1
    • -m:NAT 模式;
    • -g:DR 模式;
    • -i:TUN 模式
bash 复制代码
[root@lvs ~]# ipvsadm -A -t 192.168.4.5:80 -r 192.168.8.100:80 -m   #向集群添加成员,NAT模式
[root@lvs ~]# ipvsadm -A -t 192.168.4.5:80 -r 192.168.8.200:80 -m    #向集群添加成员,NAT模式

如果使用的算法是rr(轮询),此时使用-w增加权重是无效的,只有使用wrr时候使用-w才有效

常用查看/清空命令
  • 查看集群成员列表:ipvsadm -Ln
  • 清空集群配置:ipvsadm -C
bash 复制代码
[root@lvs ~]# ipvsadm -Ln                 #查看集群列表,同时列出IP地址和端口号
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.4.5:80 rr
  -> 192.168.8.100:80             Masq    1      0          0         
  -> 192.168.8.200:80             Masq    1      0          0 
[root@lvs ~]# ipvsadm -d -r 192.168.8.200:80 -t 192.168.4.5:80  #删除集群中的8.200主机
[root@lvs ~]# ipvsadm -Ln                #查看集群列表
[root@lvs ~]# ipvsadm -C                 #清空集群配置
[root@lvs ~]# ipvsadm -Ln                #查看集群列表,已经没有成员

4. LVS-NAT 案例

4.1 部署流程

  • Real Server(web1/web2)
    • 部署 httpd 服务。
  • Director Server(lvs)
    • 开启路由转发
    • 安装并启用ipvsadm
    • 创建虚拟服务器
    • 向虚拟服务器中加入节点
  • Client
    • 访问虚拟服务器,访问测试

4.2 部署 Web 服务器(web1/web2)

web1
  • web1主机安装httpd
  • web1主机安装httpd服务,编写首页文件,启动服务
bash 复制代码
[root@web1 ~]# dnf   -y   install   httpd              #安装软件包
[root@web1 ~]# echo web1 > /var/www/html/index.html    #修改首页文件
[root@web1 ~]# systemctl enable httpd --now            #启动服务
[root@web1 ~]# ss -nutlp | grep :80                    #查看端口
[root@web1 ~]# curl 192.168.8.100                      #自己访问自己测试,可以
web2
  • web2主机安装httpd
  • web2主机安装httpd服务,编写首页文件,启动服务
bash 复制代码
[root@web2 ~]# dnf   -y   install   httpd              #安装软件包
[root@web2 ~]# echo web2> /var/www/html/index.html     #修改首页文件
[root@web2 ~]# systemctl enable httpd --now            #启动服务
[root@web2 ~]# ss -nutlp | grep :80                    #查看端口
[root@web2 ~]# curl 192.168.8.200                      #自己访问自己测试,可以

4.3 部署 LVS 调度器

  • lvs主机启用路由转发并启动服务
  • Linux是天生的"软路由",但需要开启路由转发功能,即可使用NAT功能
  • 临时开启:echo 1 > /proc/sys/net/ipv4/ip_forward(重启失效)
  • 永久开启:修改/etc/sysctl.conf
开启路由转发(永久)
bash 复制代码
[root@lvs ~]# dnf -y install ipvsadm  #安装ipvsadm软件
#如果已经安装,无需重复安装
[root@lvs ~]# vim /etc/sysctl.conf                     #修改配置文件,开启路由转发
...此处省略1万字...
net.ipv4.ip_forward = 1  #末尾增加配置
[root@lvs ~]# sysctl -p        #刷新配置
[root@lvs ~]# ipvsadm --save > /etc/sysconfig/ipvsadm  #--save意思是保存,生成永久规则文件
  • 开启路由转发分为两步:
    • 修改 /etc/sysctl.conf 设置 net.ipv4.ip_forward = 1
    • 执行 sysctl -p 使其生效
创建虚拟服务器(VIP:192.168.4.5,算法 rr)
bash 复制代码
ipvsadm -A -t 192.168.4.5:80 -s rr  #创建虚拟服务器,算法轮询
ipvsadm -a -t 192.168.4.5:80 -r 192.168.8.100:80 -m -w 1  #添加真实服务器8.100
ipvsadm -a -t 192.168.4.5:80 -r 192.168.8.200:80 -m -w 1  #添加真实服务器8.200
ipvsadm -Ln
...
TCP  192.168.4.5:80 rr
  -> 192.168.8.100:80             Masq   1      0          0         
  -> 192.168.8.200:80             Masq   1      0          0
...
ipvsadm --save > /etc/sysconfig/ipvsadm  #保存配置信息

4.4 Web 服务器配置网关(指向 lvs 的 DIP)

web1
  • web1服务器配置网关:192.168.8.5(lvs调度器的DIP地址)
bash 复制代码
nmcli connection modify ens160 ipv4.method manual ipv4.gateway 192.168.8.5 connection.autoconnect yes
nmcli connection up ens160
web2
  • web2服务器配置网关:192.168.8.5(lvs调度器的DIP地址)
bash 复制代码
nmcli connection modify ens160 ipv4.method manual ipv4.gateway 192.168.8.5 connection.autoconnect yes
nmcli connection up ens160

注意:如果之前配置环境时,web1和web2都提前配置了ens192,会和192.168.4.0网段有冲突,本次实验需要禁用该网卡:

nmcli connection down ens192

4.5 Client 访问测试

bash 复制代码
curl 192.168.4.5  # 轮询返回 web1/web2

dnf -y install httpd-tools
ab -c 1000 -n 1000 http://192.168.4.5/index.html/

# web 服务器查看访问日志
cat /var/log/httpd/access_log

4.6 修改算法为加权轮询(wrr)

-E:修改已存在的虚拟服务器(VIP)的算法、超时等的参数
-e:修改真实服务器(RS)的参数,改权重、改转发模式等

  • web1 权重 2,web2 权重 1
bash 复制代码
ipvsadm -E -t 192.168.4.5:80 -s wrr #修改集群算法为加权轮询
ipvsadm -e -t 192.168.4.5:80 -r 192.168.8.100:80 -w 2 -m   #修改8.100权重
ipvsadm -Ln   #查看集群列表
ipvsadm --save > /etc/sysconfig/ipvsadm  #保存配置

LVS-NAT部署 步骤总结:

  • 环境准备(网络拓扑)
  • 部署 Web 服务器(web1 / web2)
    *
    1. 安装 httpd
      1. 编写首页文件
      1. 启动并设置开机自启
  • 部署 LVS 调度器
    • 开启路由转发
    • 绑定 VIP 到网卡
    • 安装并配置 LVS
  • Web 服务器配置网关(指向 LVS 的 DIP)
  • 访问测试

5. LVS-DR 集群

5.1 案例说明

  • web1/web2 使用 ens192 网卡;lvs 使用 ens192 网卡。

LVS-NAT 集群流程详解:

步骤 1:客户端发起请求

  • 客户端(192.168.4.10)发送 HTTP 请求到 VIP:192.168.4.15
  • 数据包的 IP 头:
    • src: 192.168.4.10(客户端 IP)
    • dst: 192.168.4.15(VIP)
  • 数据包的 MAC 头:
    • src: 客户端网卡MAC
    • dst: LVS调度器的MAC地址(因为客户端认为 VIP 在 LVS 上)

步骤 2:LVS 调度器接收并转发请求(关键:只改 MAC,不改 IP)

  • LVS 收到数据包后,识别到这是访问 VIP 的请求,根据调度算法(比如轮询)选中一台 RS(比如 RS1 192.168.4.100)。
  • LVS 不会修改 IP 头,IP 地址还是 192.168.4.10 → 192.168.4.15。
  • LVS 只修改二层 MAC 地址:
    • 新的目的 MAC:RS1(192.168.4.100)的网卡 MAC
    • 源 MAC:LVS 调度器的网卡 MAC
  • 数据包通过二层网络,直接转发给 RS1。

DR 模式的灵魂:IP 层地址不变,只改 MAC 层地址,实现 "转发不中转"

步骤 3:RS1 接收并处理请求(核心:VIP 绑定在 lo 回环)

  • RS1 收到数据包后,检查 IP 头:目的 IP 是 192.168.4.15(VIP)。
  • 因为 RS1 的 lo:0 接口上绑定了 192.168.4.15/32,所以它会认为这个 IP 是自己的,正常接收并处理请求。
  • 这里必须配合 ARP 抑制配置(伪装ip),防止 RS1 对外宣称 "VIP 是我的",导致客户端 ARP 解析混乱。
    步骤 4:RS1 直接返回响应(关键:不经过 LVS)
  • RS1 处理完请求后,生成响应包:
    • IP 头:src: 192.168.4.15(VIP),dst: 192.168.4.10(客户端 IP)
    • MAC 头:src: RS1的MAC,dst: 客户端MAC(或网关 MAC,由路由决定)
  • 响应包直接从 RS1 发回客户端,完全不经过 LVS 调度器
  • 客户端收到响应后,看到的源 IP 是 VIP,完全感知不到后端 RS 的存在。

所以DS 只负责给请求"带个路",RS 处理完直接"自己回家"。

为什么配置伪装ip?

配置伪装IP(隐藏VIP) 是为了"隐藏自己,避免冲突",解决ARP冲突

VIP和伪装ip一致,是为了让客户端以为是VIP给他的回复,不至于丢包

5.2 部署流程

  • Real Server
    • 部署 httpd → 配置 lo 网卡 VIP(伪装IP地址) → 调整内核 ARP 参数。
  • Director Server
    • 开启路由转发 → 安装 ipvsadm → 创建虚拟服务器 → 添加节点。
  • Client
    • 访问 虚拟服务器,访问测试。

5.3 ARP 广播问题

  • VIP 同时配置在调度器和所有真实服务器,ARP 广播会导致多主机响应 VIP,引发冲突。
  • 解决:真实服务器禁止响应 VIP 的 ARP 请求

所以要设置伪装ip解决arp问题

  • 当客户端发起访问 VIP 对应的域名的请求时,根据网络通信原理会产生 ARP 广播
  • 因为调度器和真实的服务器在同一网络并且 VIP 设置在集群中的每个节点上
  • 此时集群内的真实服务器会尝试回答来自客户端的 ARP 广播,这就会产生问题,大家都说我是 "VIP"

5.4 内核 ARP 参数(web1/web2)

bash 复制代码
vim /etc/sysctl.conf
# 添加
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2

sysctl -p
  • arp_ignore=1:忽略非本机 IP 的 ARP 请求。
  • arp_announce=2:不向外宣告 lo 网卡 VIP。

6. LVS-DR 案例

6.1 Web 服务器配置伪装 IP(VIP:192.168.4.15)

web1
  • web1安装network服务,配置伪装IP,配置在lo网卡的虚拟接口上
  • 伪装IP配在本地回环 lo 网卡,可通过内核参数禁止 lo 上 VIP 发送 ARP 应答,只让调度器响应 ARP
bash 复制代码
[root@web1 ~]# nmcli connection up ens192                    #DR模式激活此网卡
[root@web1 ~]# dnf -y install network-scripts                #安装network服务
[root@web1 ~]# cd /etc/sysconfig/network-scripts/
[root@web1 network-scripts]# cp ifcfg-lo ifcfg-lo:0          #复制lo网卡配置文件
[root@web1 network-scripts]# vim  ifcfg-lo:0
DEVICE=lo:0                      #设备名称
IPADDR=192.168.4.15              #伪装IP地址
NETMASK=255.255.255.255          #子网掩码32
ONBOOT=yes                       #开机自动启动此配置
BOOTPROTO=static                 #配置方式为静态手动配置
  • web1防止地址冲突,修改内核参数,禁止对外广播自己是192.168.4.15
bash 复制代码
[root@web1 ~]# vim /etc/sysctl.conf
#手动写入如下4行内容
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2

#当有arp广播问谁是192.168.4.15时,本机忽略该ARP广播,不做任何回应
#本机不要向外宣告自己的lo回环地址是192.168.4.15
[root@web1 ~]# sysctl -p
[root@web1 ~]# systemctl restart network            #重启网络服务
[root@web1 ~]# ip  a  s                             #查看ip地址,lo网卡上边已经有了4.15的伪装IP

ip a s :查看全部ip,包括伪装IP和VIP

web2
bash 复制代码
dnf -y install network-scripts
cd /etc/sysconfig/network-scripts/
cp ifcfg-lo ifcfg-lo:0

vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.4.15
NETMASK=255.255.255.255
ONBOOT=yes
BOOTPROTO=static

# 配置内核参数(同上)
vim /etc/sysctl.conf
sysctl -p

systemctl restart network
ip a s

6.2 LVS 调度器配置 VIP

bash 复制代码
dnf -y install network-scripts
cd /etc/sysconfig/network-scripts/
cp ifcfg-ens192 ifcfg-ens192:0

vim ifcfg-ens192:0
DEVICE=ens192:0
IPADDR=192.168.4.15
NETMASK=255.255.255.255
ONBOOT=yes
BOOTPROTO=static

systemctl restart network
ip a s

6.3 创建虚拟服务器(DR 模式,算法 wlc)

bash 复制代码
ipvsadm -A -t 192.168.4.15:80 -s wlc
ipvsadm -a -t 192.168.4.15:80 -r 192.168.4.100:80 -g -w 2
ipvsadm -a -t 192.168.4.15:80 -r 192.168.4.200:80 -g -w 1
ipvsadm -Ln

6.4 Client 访问测试(wlc 算法,比例 2:1)

bash 复制代码
curl 192.168.4.15
curl 192.168.4.15
curl 192.168.4.15

7. 总结

  • 掌握 LVS 调度器的作用与核心术语。
  • 掌握 LVS-NAT 模式:原理、配置、网关设置、算法调整。
  • 掌握 LVS-DR 模式:原理、ARP 问题、内核参数、lo 网卡 VIP 配置。
  • 理解 伪装 VIP 的作用:保证响应直接返回客户端,减轻调度器压力。

重点理解原理和配置步骤,不要死记硬背配置命令

相关推荐
charlie1145141911 小时前
嵌入式Linux驱动开发——Pinctrl 子系统架构深度解析
linux·驱动开发·系统架构
Shadow(⊙o⊙)1 小时前
Linux基础IO-1.0——open、close、read及write-深入手搓分析!
linux·运维·服务器·开发语言·c++·学习
yyuuuzz1 小时前
境外云服务器使用常见问题梳理
运维·服务器·网络·aws
zincsweet1 小时前
一文掌握 Linux 文件操作:C 语言接口 + 系统调用 + 缓冲区原理
linux·c语言
会编程的土豆1 小时前
Docker 里面的镜像(Image)和容器(Container)到底是什么
运维·docker·容器
代码中介商1 小时前
Git 版本控制完全指南:从分支管理到远程协作
linux·git
s_w.h1 小时前
【 linux 】进程的调度算法
linux·运维·服务器
c++逐梦人1 小时前
多路转接epoll
linux·网络·epoll
r-t-H1 小时前
KVM虚拟化与Docker基础实践-第三章
linux·运维·nginx·docker·容器