LVS(linux virtual server),集群

一.lvs概述
1.1什么是lvs

 LVS(Linux Virtual Server)是一个基于Linux操作系统的虚拟服务器技术,用于实现负载均衡和高可用性。LVS通过将客户端的请求分发到多台后端服务器上,从而提高整体服务的处理能力和可靠性。LVS主要有两个组件:IPVS(IP Virtual Server)和LVS-NAT、LVS-DR、LVS-TUN三种工作模式。

1.2lvs的优点

高性能:LVS工作在内核层,性能高效,能够处理大量并发请求。
高可用性:通过配置Keepalived等工具,LVS可以实现高可用性,确保服务的持续运行。
灵活性强:支持多种负载均衡算法和工作模式,适应不同的应用场景。

二.lvs架构
2.1lvs整体架构

LVS的整体架构主要包括负载均衡器(Load Balancer)、后端服务器(Real Server)和客户端三部分。客户端的请求首先到达负载均衡器,然后由负载均衡器根据一定的调度算法将请求转发到后端服务器进行处理,处理结果再返回给客户端。

2.2lvs工作模式

LVS支持三种主要的工作模式:  

LVS-NAT(Network Address Translation):

在这种模式下,负载均衡器作为所有进出流量的网关。请求报文到达负载均衡器后,负载均衡器将目标IP地址和端口修改为后端服务器的IP地址和端口,然后将报文转发给后端服务器。后端服务器处理完请求后,将响应报文发送给负载均衡器,负载均衡器再将源IP地址和端口修改为虚拟服务的IP地址和端口,然后将报文发送给客户端。

VS/NAT 的优点是服务器可以运行任何支持TCP/IP的操作系统,它只需要一个IP地址配置在调度器上,服务器组可以用私有的IP地址。缺点是它的伸缩能力有限, 当服务器结点数目升到20时,调度器本身有可能成为系统的新瓶颈,因为在VS/NAT中请求和响应报文都需要通过负载调度器。

1.请求接收:客户端发送请求到LVS的虚拟IP地址,这个地址实际上是Director Server的外网地址。 2.地址转换:当请求到达Director Server时,它会修改请求的源IP地址和端口号,并将其转发给后端的真实服务器(Real Server)。真实服务器必须使用私有IP地址。 3.处理请求:真实服务器处理请求并准备响应。在响应过程中,服务器会将响应报文的源IP地址修改为Director Server的IP地址,然后将报文返回给Director Server。 4.返回响应:Director Server收到响应后,将其转发回客户端,完成整个请求-响应过程。

服务器数量不多:如果服务器数量不是很多,NAT模式可以比较容易地实施和维护。

网络环境简单:在网络环境较为简单,不需要复杂的路由配置的情况下,NAT模式可以快速部署。


LVS-DR(Direct Routing):

在这种模式下,负载均衡器不修改数据包的IP地址和端口,而是直接通过修改数据包的MAC地址来实现数据包的转发。这种方式可以进一步减少负载均衡器的负载,并提高系统的性能。

跟VS/TUN方法一样,VS/DR调度器只处理客户到服务器端的连接,响应数据可以直接从独立的网络路由返回给客户。这可以极大地提高LVS集群系统的伸缩性。

跟VS/TUN相比,这种方法没有IP隧道的开销,但是要求负载调度器与实际服务器都有一块网卡连在同一物理网段上,服务器网络设备(或者设备别名)不作ARP响应,或者能将报文重定向(Redirect)到本地的Socket端口上。

1.请求分发:客户端发出的请求首先到达负载均衡器,负载均衡器根据配置的负载均衡算法选择一个真实服务器,并将请求的MAC地址修改为选中的真实服务器的MAC地址,然后在同一个局域网内将请求转发给真实服务器。 2.直接响应:真实服务器处理完请求后,直接将响应数据包发送回客户端,不需要经过负载均衡器。这意味着在DR模式下,负载均衡器只负责请求的分发,不参与响应的传输,从而减少了负载均衡器的负担,提高了整个系统的处理能力。

物理连接:LVS调度器(Director)和各后端真实服务器(Real Server,简称RS)都必须在同一个物理网络中,通常通过交换机或高速HUB相连。

请求转发:LVS调度器只负责将客户端的请求调度到后端的真实服务器,而不处理响应报文。

性能提升:由于响应报文直接由真实服务器发送给客户端,不经过调度器,这大大减轻了调度器的负担,提高了系统的整体性能。

直接响应:真实服务器在接收到请求后,直接处理并将响应报文发送给客户端,无需经过调度器转发。


LVS-TUN(IP Tunneling):

在这种模式下,负载均衡器将请求报文封装在一个新的IP首部中,并将封装后的报文发送给后端服务器。后端服务器直接处理请求,并将响应报文发送给客户端,而不需要经过负载均衡器。这种方式可以减少负载均衡器的负载,提高系统的吞吐量。

在VS/TUN 的集群系统中,负载调度器只将请求调度到不同的后端服务器,后端服务器将应答的数据直接返回给用户。这样,负载调度器就可以处理大量的请求,它甚至可以调 度百台以上的服务器(同等规模的服务器),而它不会成为系统的瓶颈。即使负载调度器只有100Mbps的全双工网卡,整个系统的最大吞吐量可超过 1Gbps。所以,VS/TUN可以极大地增加负载调度器调度的服务器数量。VS/TUN调度器可以调度上百台服务器,而它本身不会成为系统的瓶颈,可以 用来构建高性能的超级服务器。

VS/TUN技术对服务器有要求,即所有的服务器必须支持“IP Tunneling”或者“IP Encapsulation”协议。目前,VS/TUN的后端服务器主要运行Linux操作系统,我们没对其他操作系统进行测试。因为“IP Tunneling”正成为各个操作系统的标准协议,所以VS/TUN应该会适用运行其他操作系统的后端服务器。

VS/TUN技术对服务器有要求,即所有的服务器必须支持“IP Tunneling”或者“IP Encapsulation”协议。目前,VS/TUN的后端服务器主要运行Linux操作系统,我们没对其他操作系统进行测试。因为“IP Tunneling”正成为各个操作系统的标准协议,所以VS/TUN应该会适用运行其他操作系统的后端服务器。

双层IP封装:当用户请求到达Director Server时,请求的数据报文会在内核空间的PREROUTING链进行第一次处理,然后IPVS会将请求报文的首部再次封装一层IP头,从而实现数据的转发。 适用性广泛:由于TUN模式基于IP封装技术,它可以适用于多种网络环境,尤其是当需要跨越不同网络区域或进行远程访问时。

三.lvs调度算法
3.1调度算法类型

根据其调度时是否考虑各RS当前的负载状态被分为两种:静态方法和动态方法。静态方法:仅根据算法本身进行调度,不考虑RS的负载情况。动态方法:主要根据每RS当前的负载状态及调度算法进行调度。

3.2静态算法

1. 轮询(Round Robin,RR):将请求依次分配给各个真实服务器,依次循环。

2. 加权轮询(Weighted Round Robin,WRR):给每个真实服务器设置一个权重,根据权重的比例将请求分配给服务器。权重越高,分配到的请求越多。

3.目标地址散列(Destination Hashing,  DH):根据请求的目标 IP 地址进行哈希运算,将请求分配到固定的服务器。

4.源地址散列(Source Hashing,  SH):根据请求的源 IP 地址进行哈希运算,将请求分配到固定的服务器。

3.3动态算法

1. 最小连接调度(LC)
Overhead(负载值)=activeconns(活动链接数) x 256+inactiveconns(非活动链接数)

最小连接调度(Least-Connection Scheduling)算法是把新的连接请求分配到当前连接数最小的服务器。最小连接调度是一种动态调度算法,它通过服务器当前所活跃的连接数来估计服务 器的负载情况。调度器需要记录各个服务器已建立连接的数目,当一个请求被调度到某台服务器,其连接数加1;当连接中止或超时,其连接数减一。

在系统实现时,我们也引入当服务器的权值为零时,表示该服务器不可用而不被调度,当各个服务器有相同的处理性能时,最小连接调度算法能把负载变化大的请求分布平滑到各个服务器上,所有处理时间比较长的请求不可能被发送到同一台服 务器上。但是,当各个服务器的处理能力不同时,该算法并不理想,因为TCP连接处理请求后会进入TIME_WAIT状态,TCP的TIME_WAIT一般 为2分钟,此时连接还占用服务器的资源,所以会出现这样情形,性能高的服务器已处理所收到的连接,连接处于TIME_WAIT状态,而性能低的服务器已经 忙于处理所收到的连接,还不断地收到新的连接请求。

2.加权最小连接调度(WLC)
Overhead=(activeconns x 256+inactiveconns)/weight

加权最小连接调度(Weighted Least-Connection Scheduling)算法是最小连接调度的超集,各个服务器用相应的权值表示其处理性能。服务器的缺省权值为1,系统管理员可以动态地设置服务器的权 值。加权最小连接调度在调度新连接时尽可能使服务器的已建立连接数和其权值成比例。

3、SED(Shortest Expection Delay)
Overhead=(activeconns+1+inactiveconns) x 256/weight

但是,当node1的权重为1,node2的权重为10,经过运算前几次的调度都会被node2承接

4、NQ(Never Queue)
第一轮均匀分配,后续SED

5、LBLC(Locality-Based LC)
算法是针对请求报文的目标IP地址的负载均衡调度,目前主要用于Cache集群系统,因为在Cache集群中 客户请求报文的目标IP地址是变化的。这里假设任何后端服务器都可以处理任一请求,算法的设计目标是在服务器的负载基本平衡情况下,将相同目标IP地址的 请求调度到同一台服务器,来提高各台服务器的访问局部性和主存Cache命中率,从而整个集群系统的处理能力。

LBLC调度算法先根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不 存在,或者该服务器超载且有服务器处于其一半的工作负载,则用“最少链接”的原则选出一个可用的服务器,将请求发送到该服务器。

此外,对关联变量ServerNode[dest_ip]要进行周期性的垃圾回收(Garbage Collection),将过期的目标IP地址到服务器关联项进行回收。过期的关联项是指哪些当前时间(实现时采用系统时钟节拍数jiffies)减去最 近使用时间超过设定过期时间的关联项,系统缺省的设定过期时间为24小时。

6.LBLCR(LBLC with Replication)
带复制的基于局部性最少链接调度(Locality-Based Least Connections with Replication Scheduling,以下简称为LBLCR)算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要 维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。对于一个“热门”站点的服务请求,一台Cache 服务器可能会忙不过来处理这些请求。这时,LBLC调度算法会从所有的Cache服务器中按“最小连接”原则选出一台Cache服务器,映射该“热门”站 点到这台Cache服务器,很快这台Cache服务器也会超载,就会重复上述过程选出新的Cache服务器。这样,可能会导致该“热门”站点的映像会出现 在所有的Cache服务器上,降低了Cache服务器的使用效率。LBLCR调度算法将“热门”站点映射到一组Cache服务器(服务器集合),当该“热 门”站点的请求负载增加时,会增加集合里的Cache服务器,来处理不断增长的负载;当该“热门”站点的请求负载降低时,会减少集合里的Cache服务器 数目。这样,该“热门”站点的映像不太可能出现在所有的Cache服务器上,从而提供Cache集群系统的使用效率。

LBLCR算法先根据请求的目标IP地址找出该目标IP地址对应的服务器组;按“最小连接”原则从该服务器组中选出一台服务器,若服务器没有超载, 将请求发送到该服务器;若服务器超载;则按“最小连接”原则从整个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该 服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。

四.具体实验讲解
4.1 nat模式

本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和 PORT实现转发
RIP和DIP应在同一个IP网络,且应使用私网地址;RS的网关要指向DIP
请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈
支持端口映射,可修改请求报文的目标PORT
VS必须是Linux系统,RS可以是任意OS系统

lvs

#配置环境,两个网卡
[root@lvs ~]# cd /etc/NetworkManager/system-connections/
[root@lvs system-connections]# ls
ens160.nmconnection  eth0.nmconnection  eth1.nmconnection
[root@lvs system-connections]# vim eth0.nmconnection 
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
address1=172.25.254.100/24,172.25.254.2
method=manual
dns=114.114.114.114;
 
 
[root@lvs system-connections]# vim eth1.nmconnection 
[connection]
id=eth1
type=ethernet
interface-name=eth1
[ipv4]
address1=192.168.0.100/24
method=manual
dns=114.114.114.114;
 
 
[root@lvs ~]# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 0
net.ipv4.ip_forward_update_priority = 1
net.ipv4.ip_forward_use_pmtu = 0
 
#打开内核路由功能
[root@lvs ~]# vim /etc/sysctl.conf 
#添加
net.ipv4.ip_forward = 1
 
#查看
[root@lvs ~]# sysctl -p
net.ipv4.ip_forward = 1
 
#安装lvs
[root@lvs ~]# dnf install ipvsadm -y
 
#查看策略
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
 
#-A增加 -t tcp -s指定调度算法 rr静态算法(你一个我一个)
[root@lvs ~]# ipvsadm -A -t 172.25.254.100:80 -s rr
 
#查看策略
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.254.100:80 rr
 
 
[root@lvs ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10:80 -m
[root@lvs ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.20:80 -m
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.254.100:80 rr
-> 192.168.0.10:80              Masq    1      0          3         
-> 192.168.0.20:80              Masq    1      0          2 
 
#保存设置
[root@lvs ~]# ipvsadm-save > /etc/sysconfig/ipvsadm


wab1

#配置IP
[root@webserver1 ~]# cd /etc/NetworkManager/system-connections/
[root@webserver1 system-connections]# vim eth0.nmconnectio
[connection]
id=eth0
type=ethernet
interface-name=eth0
 
[ipv4]
address1=192.168.0.10/24,192.168.0.100
method=manual
dns=114.114.114.114;
 
#下载并启动httpd
[root@webserver1 system-connections]# cd
[root@webserver1 ~]# yum install httpd -y
[root@webserver1 ~]# echo webserver1 - 192.168.0.10 > /var/www/html/index.html
[root@webserver1 ~]# systemctl enable httpd

wab2

#配置IP
[root@webserver2 ~]# cd /etc/NetworkManager/system-connections/
[root@webserver2 system-connections]# vim eth0.nmconnectio
[connection]
id=eth0
type=ethernet
interface-name=eth0
 
[ipv4]
address1=192.168.0.20/24,192.168.0.100
method=manual
dns=114.114.114.114;
 
#下载并启动httpd
[root@webserver2 system-connections]# cd
[root@webserver2 ~]# yum install httpd -y
[root@webserver2 ~]# echo webserver1 - 192.168.0.20 > /var/www/html/index.html
[root@webserver2 ~]# systemctl enable httpd

测试

#注意测试的主机不能安装httpd
[root@lvs ~]# curl 172.25.254.100
webserver1 - 192.168.0.10
[root@lvs ~]# curl 172.25.254.100
webserver2 - 192.168.0.20
[root@lvs ~]# curl 172.25.254.100
webserver1 - 192.168.0.10
4.2DR模式

需要5个主机client,router,lvs,webserver1,webserver2

DR模式环境配置
主机名称主机IP网关配置
client172.25.254.200/24172.25.254.100
router

nat:172.25.254.100

仅主机:192.168.0.100

172.25.254.2
lvs

仅主机:192.168.0.50

VIP:192.168.0.200

192.168.0.100
webserver1

仅主机:192.168.0.10

vip:192.168.0.200

192.168.0.100
webserver2

仅主机:192.168.0.20

vip:192.168.0.200

192.168.0.100

在router中配置ip_forward

[root@client ~]# vim /etc/sysctl.conf 
[root@client ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@client ~]# cat /etc/sysctl.conf 
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
net.ipv4.ip_forward=1

使rs主机中使vip不对外响应

webserver1:

[root@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore 
[root@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore 
[root@webserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce 
[root@webserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce 

webserver2:

[root@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore 
[root@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore 
[root@webserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce 
[root@webserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce 

配置lvs规则


[root@lvs ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
FWM  66 rr
  -> 192.168.0.10:0               Route   1      0          0         
  -> 192.168.0.20:0               Route   1      0          0         

实现结果:

[root@client ~]# for i in {1..10}
> do
> curl 192.168.0.200
> done
webserver1 - 192.168.0.10
webserver2 - 192.168.0.20
webserver1 - 192.168.0.10
webserver2 - 192.168.0.20
webserver1 - 192.168.0.10
webserver2 - 192.168.0.20
webserver1 - 192.168.0.10
webserver2 - 192.168.0.20
webserver1 - 192.168.0.10
webserver2 - 192.168.0.20

五、防火墙标记解决轮询调度的问题

#在lvs-dr的实验基础下,当我们访问同一个ip地址,他有http和https加密,我们使用lvs调度器去访问,其实是有问题的,我们可以添加相关策略,实现解决
​
在server1主机
[root@rhel9 ~]# yum install mod_ssl  -y
[root@rhel9 ~]# systemctl restart htpd
​
在server2主机
[root@rhel9 ~]# yum install mod_ssl  -y
[root@rhel9 ~]# systemctl restart htpd
​
在lvs主机
[root@rhel9 ~]# ipvsadm -C  #清空之前的策略
[root@rhel9 ~]# iptables  -t mangle  -A  PREROUTING -d 192.168.0.200  -p tcp -m  multiport  --dports 80,443  -j MARK   --set-mark  66
##########
-t mangle 修改数据包的头信息
-A PREROUTING  向 PREROUTING 链添加一条新的规则
-d 指定目标地址
-p 指定tcp协议
-m multiport  使用 multiport 模块来匹配多个端口
--dports 80,443  指定端口
-j MARK: 指定如果数据包匹配上述条件,则执行 MARK 动作
--set-mark 66  设置数据包的标记(mark)为 66
###########
[root@rhel9 ~]# ipvsadm  -A -f 66  -s rr
[root@rhel9 ~]# ipvsadm  -a  -f 66  -r 192.168.0.10  -g
[root@rhel9 ~]# ipvsadm  -a  -f 66  -r 192.168.0.20  -g
[root@rhel9 ~]# curl192.168.0.20
[root@rhel9 ~]# curl -k  https://192.168.0.20:443
​
在客户机下
[root@redhat94 ~]# curl 192.168.0.200; curl   -k  https://192.168.0.200
webserver1-192.168.0.10
server-192.168.0.20
​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值