负载均衡LB》》LVS

发布于:2025-06-14 ⋅ 阅读:(21) ⋅ 点赞:(0)

LO 接口

LVS简介

LVS(Linux Virtual Server)即Linux虚拟服务器,是由章文嵩博士主导的开源负载均衡项目,通过LVS提供的负载均衡技术和Linux操作系统实现一个高性能、高可用的服务器集群,它具有良好可靠性、可扩展性和可操作性,从而以低廉的成本实现最优的服务性能。目前LVS已经被集成到Linux内核模块中。该项目在Linux内核中实现了基于IP的数据请求负载均衡调度方案,终端互联网用户从外部访问公司的外部负载均衡服务器,终端用户的Web请求会发送给LVS调度器,调度器根据自己预设的算法决定将该请求发送给后端的某台Web服务器,比如,轮询算法可以将外部的请求平均分发给后端的所有服务器,终端用户访问LVS调度器虽然会被转发到后端真实的服务器,但如果真实服务器连接的是相同的存储,提供的服务也是相同的服务,最终用户不管是访问哪台真实服务器,得到的服务内容都是一样的,整个集群对用户而言都是透明的。最后根据LVS工作模式的不同,真实服务器会选择不同的方式将用户需要的数据发送到终端用户,
LVS工作模式分为NAT模式、TUN模式、以及DR模式。

LVS的IP负载均衡技术是通过IPVS模块来实现的,IPVS是LVS集群系统的核心软件,它的主要作用是:安装在Director Server上,同时在Director Server上虚拟出一个IP地址**,用户必须通过这个虚拟的IP地址访问服务**。这个虚拟IP一般称为LVS的VIP,即Virtual IP。访问的请求首先经过VIP到达负载调度器,然后由负载调度器从Real Server列表中选取一个服务节点响应用户的请求。
  当用户的请求到达负载调度器后,调度器如何将请求发送到提供服务的Real Server节点,而Real Server节点如何返回数据给用户,是IPVS实现的重点技术,IPVS实现负载均衡机制有三种,分别是NAT、TUN和DR.

LVS 核心组件和专业术语

# 核心组件
LVS  的  管理工具ipvsadm 和  内核模块  ipvs
ipvsadm :用户空间的命令行工具,用于管理集群服务及集群服务上的RS(Real Server 后端的真实服务器)等
ipvs: 工作于内核上的程序,可根据用户定义的集群实现请求转发

#  专业术语
VS:Virtual Server   虚拟服务
DR、DS:Director,Balancer   负载均衡器、分发器
RS:Real Server    后端请求处理的真实服务器
CIP:Client IP   用户端IP
#  负载均衡器 有两个IP  VIP,DIP
VIP:Director Virtual IP   负载均衡器虚拟IP
DIP: Director IP          负载均衡器IP
RIP: Real Server IP   后端请求处理真实服务器IP

LVS负载均衡器4种工作模式

LVS-NAT 》》网络地址转换模式
进站、出站的数据流程都经过DS(DR)负载均衡器(IP负载均衡,修改的是IP地址),利用网络层(四层)
支持端口映射
NAT模式支持对IP地址和端口进行转换。即用户请求的端口和真实服务器的端口可以不一致。
LVS-DR》》直接路由模式
只有进站的数据流程经过DS(DR)负载均衡器(数据链路层负载均衡,修改的是目的MAC地址),利用数据链路层(二层)
不支持端口映射(端口不能修败)
LVS-TUN 》》隧道模式 三层
不支持端口映射, .RS 的 OS 须支持隧道功能
只有进站的数据流程经过DS(DR)负载均衡器
LVS-full-nat》》双向转换模式
通过请求报文的源地址为DIP,目标为RIP来实现转发 支持端口映射
对应响应报文而言,修改源地址为VIP,目标地址为CIP来实现转发

资料

网络地址转换模式》》NAT模式

资料

在这里插入图片描述
在这里插入图片描述

原理
DS(DR)负载均衡器把客户端发来的数据包的IP头的目标地址,在DS(DR)负载均衡器上换成其中一个RS的IP地址,并发至RS来处理,
RS处理完成后,
把数据交给经过DS(DR)负载均衡器,DS(DR)负载均衡器再把数据包的源IP改成自己的VIP
①源CIP——>目VIP (客户端向——DS(DR)负载均衡器 通信)
②目VIP——>改成RIP(DS(DR)负载均衡器中做转换)
(DS(DR)负载均衡器中做转换)——>RS 通信
③源RIP——>目DIP(RS——负载均衡器 通信)
④源RIP——>改成VIP(处理完成之后,DS(DR)负载均衡器中再转换)
(DS(DR)负载均衡器中做转换)——>客户端通信

优点
集群中的物理服务器(RS服务器),可以使用任何支持TCP/IP操作系统,只有(DS(DR)负载均衡器)需要一个合法的IP(VIP)地址
不足
扩展性有限,当服务器节点(普通PC服务器)增长过多时,(DS(DR)负载均衡器)将成为整个系统的瓶颈,因为所有的请求包和应答包的流向都经过(DS(DR)负载均衡器)。当服务器节点过多时,大量的数据包都交会在(DS(DR)负载均衡器),速度就会变慢

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

直接路由模式》》DR 模式

直接路由模式则应该是工作在数据链路层上(二层)

同一个网段的设备之间通信,可用MAC直接通信
不同网段的设备之间通信,必须借助网关

arp协议

资料
在这里插入图片描述

1、当用户请求到达Director Server (DS,负载均衡器),此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP;
2、检查发现数据包的目标IP是本机,将数据包送至INPUT链;
3、IPVS比对数据包请求的服务是否为集群服务,若是,将请求报文中的源MAC地址修改为DIP的MAC地址,将目标MAC地址修改RIP的MAC地址,然后将数据包发至POSTROUTING链。 此时的源IP和目的IP均未修改,仅修改了源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址;
4、由于DS和RS在同一个网络中,所以是通过二层,数据链路层来传输。POSTROUTING链检查目标MAC地址为RIP的MAC地址,那么此时数据包将会发至Real Server;
5 、RS发现请求报文的MAC地址是自己的MAC地址,就接收此报文。处理完成之后,将响应报文通过lo接口传送给eth0网卡(ens网卡)然后向外发出。 此时的源IP地址为VIP,目标IP为CIP;
6、响应报文最终送达至客户端。

# DR 原理
DS(DR)负载均衡器和RS都使用同一个IP(即VIP)对外服务,但只有DS(DR)负载均衡器对ARP请求进行响应,所有RS对本身这个IP(VIP)的ARP请求保持静默(就是不理它),也就是说,网关会把这个服务IP(VIP)的请求全部定向给DS(DR)负载均衡器,而DS(DR)负载均衡器收到数据包后根据调度算法(当然前提IPVS会判断是否是集群,只有集群才会用到调度算法了)。找出对应的RS,
把, 源MAC(即CIP的MAC)————>改成DIP的MAC, 
    目的MAC(即VIP的MAC)————>改为RS的RIP的MAC,
 并将请求分发给这台RS。这时RS收到这个数据包,处理完成之后,由于IP(VIP)是一致,可以直接将数据返给客户端,则等于直接从客户端接收到这个数据包无异,处理后直接返回给客户端。
**优点:**
   与TUN模式(隧道模式)一样,DS(DR)负载均衡器也只是分发请求,应答包通过单独的路由方法返回客户端,与TUN相比,DR模式不需要隧道结构,因此可以使用大多数操作系统做为物理服务器
**不足:**
   要求DS(DR)负载均衡器的网卡必须与物理网卡在一个网段上(DS(DR)负载均衡器到RS 是通过MAC地址通信的)。
# DR模式的特点
1、DS(DR)和所有RS 都要配置 VIP 
2、RS的RIP 可以使用私有IP,也可以共有IP,RIP、DIP要在同一网段(因为需要通过MAC通信)
3、RIP的网关不能指向DIP,以确保响应报文不会通过DS(DR)负载均衡器,减少流量。
4、RS和DS(DR)负载均衡器要在同一个物理网络
5、请求报文经过DS(DR)负载均衡器,但响应报文不经过DS(DR)负载均衡器,而由RS直接发往请求方(client端)

在这里插入图片描述

在这里插入图片描述

TUN 隧道模式

资料

# 原理:
互联网上的大多数Internet服务的请求包很短小,而应答包通常很大。这种就是隧道模式(TUN)
把客户端发来的数据包,**封装**一个新的IP头标记(仅目的IP)发给RS,RS收到后,先把数据包的头解开,还原数据包,处理后,直接返回客户端
不需要再经过负载均衡器。
注意:由于RS需要对负载均衡器发过来的数据包进行还原,所以说必须支持IPTunnel协议。所以,在RS的内核中,必须编译支持IPTunnel这个选项
优点:
负载均衡器只负责将请求包分发给后端节点服务器(RS服务),而RS将应答包直接发给用户。
所以,减少了负载均衡器的大量数据流动,负载均衡器不再是系统的瓶颈,就能处理巨大的请求量,
这种方式,一台负载均衡器能够为很多RS进行分发。而且**跑在公网上就能进行不同地域的分发**
缺点:
TUN隧道模式的RS节点都需要合法IP(公网IP),这种方式需要所有服务器支持IP Tunneling 协议,服务器可能只局限在部分Linux系统上

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

LVS-DR 模式 案例
#  准备三台Ubuntu系统,上网模式,桥接模式,可以通过VM中创建  
#  
#  关闭 防火墙
ufw disable
# 修改主机名,和IP地址
[主机名和IP地址](https://ares-wang.blog.csdn.net/article/details/146230753)

所有的Director和RealServer都在同一个物理网络中。**同一个网段**  (VIP,DIP,RIP 要在同一个网段,LVS/DR只支持本地网络)

》》》DS(DR)负载均衡器 配置

#  DS 配置
# 安装  ipvsadm工具
apt update
apt install ipvsadm
# 在ens3 接口 添加VIP
# 如果VIP配置错误,可以删除  ip addr del IP dev ens33
ip addr  add dev ens33 172.XX.XX.140/32
# 启动 
# 如果启动 错误  ① mkdir -p /etc/sysconfig   ② ipvsadm -S > /etc/sysconfig/ipvsadm 在启动
systemctl start ipvsadm
# 添加 添加虚拟服务 
# 如果要清除DS虚拟服务器中所有记录(含虚拟服务) 第一次配置用不到的   ipvsadm -C  
#======
###  ipvsadm   -  大写字母 管理集群的, 小写字母管理  真实服务器的 
#########
# -s : 算法  
#1. 轮询调度 rr
#2. 加权轮询 wrr
#3. 最少链接 lc
#4. 加权最少链接 wlc
# ipvsadm -A -t VIP:端口 -s rr
ipvsadm -A -t 172.XX.XX.140:80 -s rr
# 添加真实服务器  180,104 是真实处理数据的服务器IP 真实服务器后面的80端口,因为我真实服务器用Nginx 做测试的  Nginx 默认端口就是80
# -g  #  指定LVS 模式  直接路由模式 (LVS默认模式)
# -r  真实服务器的IP地址
# -t, --tcp-service service-address, 指定虚拟服务为tcp服务  IP地址:端口号
# -a, --add-server为虚拟服务添加一个real server(RS)
# -g, --gatewaying:使用网关(即直接路由DR),此模式是默认模式。
ipvsadm -a -t 172.XX.XX.140:80 -r 172.XX.XX.180:80 -g
ipvsadm -a -t 172.XX.XX.140:80 -r 172.XX.XX.104:80 -g
# 保存
ipvsadm -S > /etc/sysconfig/ipvsadm
# 启动

systemctl start ipvsadm
# 查看
# -L|-l   # 显示内核虚拟服务器列表
# -n  # 以为数字形式输出端口号
ipvsadm -ln

在这里插入图片描述
》》》配置 RS真实服务器

# RS配置 每个真实服务器都有配置
#  VIP    是lo  接口     在lo接口上绑定VIP
#  删除 VIP  ip addr del dev lo 172.30.164.140/32
ip addr  add dev lo 172.XX.XX.140/32 
# RS在LO接口配置了VIP,这个同一个网段中就拥有多个VIP(RS中每个都配置VIP,DS也配置VIP)
# 客户端在网关发送arp广播需找VIP时,需要RS集群中不接受这个ARP请求,即要关闭ARP响应,ARP静默
# arp_ignore 设置1,意味着当别人的ARP请求过来的时候,如果接受的设备没有这个IP,就不做出响应(这个ip在lo接口,lo不说接受设备的进口)
# ARP静默   临时
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
# ARP静默  永久 
cat >> /etc/sysctl.conf <<EOF
net.ipv4.conf.lo.arp_ignore=1
net.ipv4.conf.lo.arp_announce=2
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
EOF
sysctl -p

#  安装nginx
apt install nginx & systemctl restart nginx
#  为了能看到数据来源那个服务器,故把默认的Index.html 覆盖了 
# CentOS 路径   /usr/share/nginx/html
# Ubuntu 路径  /var/www/html/index.nginx-debian.html 
# >>  追加   > 覆盖
echo "RS-104" > /var/www/html/index.nginx-debian.html



在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

栏位注解

ipvsadm -ln --stats
Conns: 已经转发过的连接数
InPkts:入包个数
OutPkts:出包个数
InBytes:入流量(字节)
OutBytes:出流量(字节)

ipvsadm -ln --rate
CPS:每秒连接数
InPPS:每秒的入包个数
OutPPS:每秒的出包个数
InBPS:每秒入流量(字节)
OutBPS: 每秒出流量(字节)

在这里插入图片描述

LVS-NAT 模式 案例

》》DS(DR)负载均衡器

#  准备三台Ubuntu系统,上网模式,NAT模式,可以通过VM中创建  
#  
#  关闭 防火墙
ufw disable
# 修改主机名,和IP地址
[主机名和IP地址](https://ares-wang.blog.csdn.net/article/details/146230753)
使用LVS-NAT模式将需要**两个不同网段**的IP,一个IP接受外部请求服务,一般为外网ip,此IP称为VIP,
        一个IP与后realserver同一地址段,负责相互通信,称为DIP。
        后端realserver的网关地址需指向DIP。
        同时需开启linux内核的数据包转发功能
# 因为VIP和RIP是不同的网段,所有达到隐藏真实IP目的

在这里插入图片描述
在这里插入图片描述

# 启用IP转发
echo 1 > /proc/sys/net/ipv4/ip_forward
# 永久生效
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p
# 添加VIP
ip addr  add dev ens33 172.XX.XX.140/32
# 添加虚拟服务
ipvsadm -A -t 172.XX.XX.140:80 -s rr
# 添加真实服务器  -m  代表 NAT模式
ipvsadm -a -t 172.XX.XX.140:80 -r 192.168.2.5 -m
ipvsadm -a -t 172.XX.XX.140:80 -r 192.168.2.3-m

# 启动
systemctl start ipvsadm
# 保存 如果保存不了,则要创建文件夹 mkdir -p /etc/sysconfig
ipvsadm -S > /etc/sysconfig/ipvsadm

》》RS服务器配置

# 配置IP地址,网关要指向DIP地址即可。

#  安装nginx测试
apt install nginx & systemctl restart nginx
#  为了能看到数据来源那个服务器,故把默认的Index.html 覆盖了 
# CentOS 路径   /usr/share/nginx/html
# Ubuntu 路径  /var/www/html/index.nginx-debian.html 
# >>  追加   > 覆盖
echo "RS-104" > /var/www/html/index.nginx-debian.html

在这里插入图片描述

LVS-TUN:隧道模式

 LVS/TUN与 LVS/DR 类似。只是在报文外面再加一层IP封装,整个过程比LVS/DR模式多一次报文的封装/解封过程。
     不同:LVS/DR只支持本地网络,LVS/TUN却可以跨机房

用内网测试,RIP、DIP 属于同一个网段  
我用的是私有的  
RS1——RIP:192.168.2.3   网关 192.168.2.1 
RS2——RIP:192.168.2.5   网关 192.168.2.1 
DS-DIP:192.168.2.4   网关 192.168.2.1 
# 在NAT中 RS 中RIP 网关要指向DIP,但TUN模式不可以的

》》DS(DR)负载均衡器

# 加载内核模块
 modprobe ip_vs
 modprobe ip_vs_rr
 modprobe ip_vs_wrr
 modprobe ip_vs_sh
 modprobe tun
# 启用IP转发
echo 1 > /proc/sys/net/ipv4/ip_forward
# 永久生效
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p
# 配置VIP 
sudo ip addr add 172.XX.XX.140/32 dev ens33
# 配置LVS规则 
 ipvsadm -A -t 172.XX.XX.140:80 -s rr  # 使用轮询调度
 # -i 是隧道模式
 # ipvsadm -a -t VIP:端口 -r RIP:端口 -i [-w 1]  # -i-->LVS-TUN
 ipvsadm -a -t 172.XX.XX.140:80 -r 192.168.2.5:80 -i  # -i 表示 TUN 模式
 ipvsadm -a -t 172.XX.XX.140:80 -r 192.168.2.3:80 -i

》》》RS服务器

# 安装 
modprobe ipip
#  创建隧道接口 每个RS 只有添加自身的 
# ip tunnel add tun0 mode ipip remote DIP local RIP
ip tunnel add tun0 mode ipip remote 192.168.2.4 local 192.168.2.3
ip link set tun0 up
# 配置VIP
ip addr add 172.XX.XX.140/32 dev tun0
# 禁用 ARP 响应  ARP静默  永久生效
echo 1 | sudo tee /proc/sys/net/ipv4/conf/tun0/arp_ignore
echo 2 | sudo tee /proc/sys/net/ipv4/conf/tun0/arp_announce
echo 1 | sudo tee /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 | sudo tee /proc/sys/net/ipv4/conf/all/arp_announce
# 添加路由
route add -host 172.XX.XX.140 dev tun0

# 测试 隧道  如果返回 Real Server 自己的服务(如 Nginx/Apache),说明隧道配置成功。 
# curl VIP 
curl 172.XX.XX.140

在这里插入图片描述
》》RS 持久化

资料

network:
    renderer: networkd
    ethernets:
        ens33: # 替换为你的网络接口名称
            dhcp4: false # 关闭 DHCP
            dhcp6: false # 关闭 DHCP
            addresses: [192.168.2.3/24] # 静态 IP 地址和子网掩码
            routes:
              - to: default
                via: 192.168.2.1 # 网关地址
            nameservers:
                addresses: [8.8.8.8,114.114.114.114] # DNS 服务器地址
                search: [] 
	tunnels:
	  tun0:
	    mode: ipip
		remote: 192.168.2.4 # DS负载均衡器的DIP
		local: 192.168.2.3  # 当前RS的RIP
		addresses:
		 - 172.30.164.140/32 # VIP
		routes:
		 - to: 172.30.164.140/32
		   via: 192.168.2.1
		   scope: link
		mtu: 1480
    version: 2

# 在不重启的情况下,网络配置 应用 
netplan apply  
# 验证上面的持久化
ip ad   #  显示所有的
ip ad show tun0 # 只显示  tuno接口的 
ip route show  

在这里插入图片描述

上面的虚拟服务器规则 重启消失了

该方式添加的规则重启服务器后规则就消失了,因此应该将该规则保存在文件中,待重启后可以直接从文件中恢复规则

# 保存 如果保存不了,则要创建文件夹 mkdir -p /etc/sysconfig
ipvsadm -S > /etc/sysconfig/ipvsadm

#   恢复  
ipvsadm -R < /etc/sysconfig/ipvsadm

可以通过systemctl 解决 ipvsadm.service

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到