LVS简介
LVS(Linux Virtual Server)是一个基于Linux平台的开源负载均衡系统。它通过将多个服务器组成一个虚拟服务器集群,实现了高效的负载均衡和流量分发。
LVS的核心思想是利用IP负载均衡技术和内容请求分发机制,将客户端的请求均衡地分配给服务器集群中的各个节点。这种机制能够有效地提高服务器的利用率,降低单点故障的风险,并提供高可用性和可伸缩性的服务。
LVS 官网: http://www.linuxvirtualserver.org/
VS: Virtual Server,负责调度
RS:RealServer,负责真正提供服务
LVS的三种工作模式分别是NAT模式、DR模式和IP隧道模式。
VS:Virtual Server
RS:Real Server
CIP:Client IP
VIP: Virtual serve IP VS外网的IP
DIP: Director IP VS内网的IP
RIP: Real server IP
访问流程:CIP <--> VIP == DIP <--> RIP
lvs集群类型
lvs-nat: 修改请求报文的目标IP,多目标IP的DNAT
lvs-dr: 操纵封装新的MAC地址
lvs-tun: 在原请求IP报文之外新加一个IP首部
lvs-fullnat: 修改请求报文的源和目标IP
lvs的调度算法
根据其调度时是否考虑各RS当前的负载状态被分为两种:静态方法和动态方法
静态方法:仅根据算法本身进行调度,不考虑RS的负载情况
动态方法:主要根据每RS当前的负载状态及调度算法进行调度Overhead=value较小的RS被调度
lvs静态调度算法
RR:roundrobin 轮询 RS分别被调度,当RS配置有差别时不推荐
WRR:Weighted RR,加权轮询根据RS的配置进行加权调度,性能差的RS被调度的次数少
SH:Source Hashing,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往 第一次挑中的RS,从而实现会话绑定
DH:Destination Hashing;目标地址哈希,第一次轮询调度至RS,后续将发往同一个目标地址的请 求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如:宽带运营商
lvs动态调度算法
主要根据RS当前的负载状态及调度算法进行调度Overhead=value较小的RS会被调度
LC:least connections(最少链接发) 适用于长连接应用Overhead(负载值)=activeconns(活动链接数) x 256+inactiveconns(非活 动链接数)
WLC:Weighted LC(权重最少链接) 默认调度方法Overhead=(activeconns x 256+inactiveconns)/weight
SED:Shortest Expection Delay, 初始连接高权重优先Overhead=(activeconns+1+inactiveconns) x 256/weight 但是,当node1的权重为1,node2的权重为10,经过运算前几次的调度都会被node2承接
NQ:Never Queue,第一轮均匀分配,后续SED
LBLC:Locality-Based LC,动态的DH算法,使用场景:根据负载状态实现正向代理
LBLCR:LBLC with Replication,带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制 到负载轻的RS
NAT模式
本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和 PORT实现转发
RIP和DIP应在同一个IP网络,且应使用私网地址;RS的网关要指向DIP
请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈
支持端口映射,可修改请求报文的目标PORT
VS必须是Linux系统,RS可以是任意OS系统
优点:配置和管理相对简单,网络架构灵活,允许后端服务器在不同网段中,客户端不需要感知后端服务器的存在。
缺点:在整个流程中,所有输入输出的流量都要经过负载均衡器,这会导致负载均衡器成为性能瓶颈,尤其是在Web类应用中,响应流量大于请求流量时更为明显。
实验
四台虚拟机:客户端、lvs调度器、webserver1、webserver2
Director 服务器采用双网卡,一个是桥接网卡连接外网,一个是仅主机网卡与后端Web服务器相连 Web服务器采用仅主机网卡与director相连
Web服务器网关指向192.168.0.100
后端web服务器不需要连接外网
实验步骤:
1、启动路由器内核路由功能
2、lvs
下载 ipvsadm负载均衡控制组件
yum install -y ipvsadm
通过ipvsadm配置负载均衡器
ipvsadm -A -t 172.25.254.100:80 -s rr
ipvsadm -a -t 172.25.254.100:80 -r 172.25.254.10:80 -m
ipvsadm -a -t 172.25.254.100:80 -r 172.25.254.20:80 -m
3、sr1
yum install -y httpd
echo this is sr 1 > /var/www/html/index.html
systemctl enable --now httpd
4、测试
[root@client ~]# for i in {1..10}
> do
> curl 172.25.254.100
> done
this is rs2
this is rs1
this is rs2
this is rs1
this is rs2
this is rs1
this is rs2
this is rs1
this is rs2
this is rs1
DR模式
DR:Direct Routing,直接路由,LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行 转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源 IP/PORT,以及目标IP/PORT均保持不变
DR模式的特点
1.Director和各RS都配置有VIP
2.确保前端路由器将目标IP为VIP的请求报文发往Director
3.在前端网关做静态绑定VIP和Director的MAC地址 在RS上使用arptables工具 在RS上修改内核参数以限制arp通告及应答级别
4.RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;
5.RIP的网关不能指向DIP,以确保响应报文不会经由Director
6.RS和Director要在同一个物理网络
7.请求报文要经由Director,但响应报文不经由Director,而由RS直接发往Client
8.不支持端口映射(端口不能修败) arptables -A IN -d $VIP -j DROP arptables -A OUT -s $VIP -j mangle --mangle-ip-s $RIP /proc/sys/net/ipv4/conf/all/arp_ignore /proc/sys/net/ipv4/conf/all/arp_announce
9.RS可使用大多数OS系统
实验
实验环境
准备五台虚拟机:客户端、路由器、负载均衡器、真实服务器1、真实服务器2
五台虚拟机均为openEuler-22.03-LTS-SP3-x86_64-dvd.iso
router两个网卡,一个为nat模式一个为仅主机模式
client -- nat | 172.25.254.200 |
router -- nat | 172.25.254.100 |
router -- 仅主机 | 182.168.0.100 |
LVS -- DIP | 192.168.0.50 |
sr1 -- RIP1 | 192.168.0.10 |
sr2 -- RIP2 | 192.168.0.20 |
VIP | 192.168.0.200 |
实验步骤
1、五台设备的ip配置
# client
[root@client ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:bd:21:87 brd ff:ff:ff:ff:ff:ff
inet 172.25.254.200/24 brd 172.25.254.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:febd:2187/64 scope link
valid_lft forever preferred_lft forever
# router
[root@router ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:7a:6c:bf brd ff:ff:ff:ff:ff:ff
inet 172.25.254.100/24 brd 172.25.254.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe7a:6cbf/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:7a:6c:c9 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.100/24 brd 192.168.0.255 scope global noprefixroute eth1
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe7a:6cc9/64 scope link
valid_lft forever preferred_lft forever
# LVS
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 192.168.0.200/32 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:95:4f:97 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.50/24 brd 192.168.0.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe95:4f97/64 scope link
valid_lft forever preferred_lft forever
# sr1
[root@rs1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 192.168.0.200/32 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:3e:fc:63 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.10/24 brd 192.168.0.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe3e:fc63/64 scope link
valid_lft forever preferred_lft forever
# sr2
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 192.168.0.200/32 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:06:4a:cd brd ff:ff:ff:ff:ff:ff
inet 192.168.0.20/24 brd 192.168.0.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe06:4acd/64 scope link
valid_lft forever preferred_lft forever
1、禁用sr1和sr2的arp响应
#在RS1和RS2中解决响应问题
[root@rs1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@rs1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@rs1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@rs1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@rs2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@rs2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@rs2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@rs2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
3、开启router路由器的路由转发
4、在LVS中配置策略
在LVS、rs1、rs2的换回接口中配置VIP,都为192.168.0.200
ip a a 192.168.0.200/32 dev lo
#LVS配置
[root@lsv ~]# ipvsadm -A -t 192.168.0.200:80 -s wrr
[root@lsv ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10 -w 1 -g
[root@lsv ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20 -w 1 -g
# 查看规则[root@lsv ~]# ipvsadm -Ln
[root@lsv ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.0.200:80 wrr
-> 192.168.0.10:80 Route 1 0 0
-> 192.168.0.20:80 Route 1 0 0
5、sr1配置
[root@rs1 ~]# yum install httpd -y
[root@rs1 ~]# echo this is rs1 > /var/www/html/index.html
[root@rs1 ~]# systemctl restart httpd
sr2配置相同
6、测试
[root@client ~]# for i in {1..10}
> do
> curl 192.168.0.200
> done
this is rs2
this is rs1
this is rs2
this is rs1
this is rs2
this is rs1
this is rs2
this is rs1
this is rs2
this is rs1