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直接通信
不同网段的设备之间通信,必须借助网关
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