1.LVM简介
LVS(Linux Virtual Server)是Linux虚拟服务器的简称,它是一个高性能的、开源的负载均衡器,用于将网络请求分发到一组服务器上,以实现负载均衡和故障转移。LVS最初由章文嵩博士在1998年发起,是中国国内最早出现的自由软件项目之一。如今,LVS已经成为Linux标准内核的一部分,无需重新编译内核即可使用其提供的各种功能。
2.LVS的主要特点和优势包括:
-
高性能:LVS能够处理极高的网络流量,因为它在内核级别工作,减少了数据包处理的开销。
-
可扩展性:LVS支持水平扩展,可以轻松地添加更多的服务器来应对增长的负载。
-
可靠性:通过负载均衡和故障转移机制,LVS能够确保服务的高可用性。
-
灵活性:LVS提供了多种负载均衡算法,可以根据需要选择最适合的算法。
2.1集群 Cluster
LB: Load Balancing,负载均衡,多个主机组成,每个主机只承担一部分访问请求
HA: High Availiablity,高可用,避免 SPOF(single Point Of failure 单点故障)
HPC: High-performance computing.(高性能计算,国家战略资源)
3.LVS工作模式
1 .网络地址转换(NAT)模式:
在这种模式下,负载均衡器作为所有进出流量的网关。请求报文到达负载均衡器后,负载均衡器将目标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模式可以快速部署。
2.IP隧道(TUN)模式(了解):
在这种模式下,负载均衡器将请求报文封装在一个新的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封装技术,它可以适用于多种网络环境,尤其是当需要跨越不同网络区域或进行远程访问时。
3.直接路由(DR)模式:
在这种模式下,负载均衡器不修改数据包的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调度器只负责将客户端的请求调度到后端的真实服务器,而不处理响应报文。
性能提升:由于响应报文直接由真实服务器发送给客户端,不经过调度器,这大大减轻了调度器的负担,提高了系统的整体性能。
直接响应:真实服务器在接收到请求后,直接处理并将响应报文发送给客户端,无需经过调度器转发。
4.fullnet模式(了解)
1.VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此,RIP的网关一般不会指向DIP
2.RS收到的请求报文源地址是DIP,因此,只需响应给DIP;但Director还要将其发往Client
3.请求和响应报文都经由Director
4.支持端口映射
4.LVS算法介绍
4.1lvs静态调度算法
1、RR:roundrobin 轮询 RS分别被调度,当RS配置有差别时不推荐
2、WRR:Weighted RR,加权轮询根据RS的配置进行加权调度,性能差的RS被调度的次数少
3、SH:Source Hashing,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定.(客户地址和RS服务器绑定)
4、DH:Destination Hashing;目标地址哈希,第一次轮询调度至RS,后续将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如:宽带运营商(目标地址和Rs服务器绑定)
4.2lvs动态调度算法
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地址对应的服务器组;按“最小连接”原则从该服务器组中选出一台服务器,若服务器没有超载, 将请求发送到该服务器;若服务器超载;则按“最小连接”原则从整个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该 服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。
5.lvs部署命令介绍
5.1lvs软件相关信息
程序包:ipvsadm
Unit File: ipvsadm.service
主程序:/usr/sbin/ipvsadm
规则保存工具:/usr/sbin/ipvsadm-save
规则重载工具:/usr/sbin/ipvsadm-restore
配置文件:/etc/sysconfig/ipvsadm-config
ipvs调度规则文件:/etc/sysconfig/ipvsadm
5.2 ipvsadm命令
##管理集群服务
ipvsadm -A -t 172.25.254.100:80 -s rr
-A #添加
-E #修改
-t #tcp服务
-u #udp服务
-s #指定调度算法,默认为WLC
-p #持久链接,实现会话绑定
-f #firewall mask 火墙标记,是一个数字
-D #删除
-M netmask工作模式
–R 重载
–C 清空
-L #查看lvs策略
-n #不做解析
#################
##管理集群中RealServer的曾增删改
ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10:80 -m
-a #添加realserver
-e #更改realserver
-t #tcp协议
-u #udp协议
-f #火墙 标签
-r #realserver地址
-g #直连路由模式
-i #ip隧道模式
-m #nat模式
-w #设定权重
--rate :输出速率信息
5.3保存规则
ipvsadm -Sn > /etc/sysconfig/ipvsadm-config
ipvsadm-save -n > /etc/sysconfig/ipvsadm
systemctl restart ipvsadm
LVM-nat模式
#lvm主机
添加两块网卡,一张网卡使用net模式,一张网卡使用仅主机模式
net模式网卡,作为Vip:ip=172.25.254.100/24,gateway=172.25.254.2
仅主机模式作为Dip:192.168.0.100/24
[root@rhel9 ~]# 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@rhel9 ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
##启用内核路由功能
[root@rhel9 ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@rhel9 ~]# ipvsadm -A -t 172.25.254.100:80 -s rr
[root@rhel9 ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10:80 -m
[root@rhel9 ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.20:80 -m
[root@rhel9 ~]# ipvsadm -Ln
#webserver1主机
网卡为仅主机模式:ip=192.168.0.10/24,gateway=192.168.0.100
yum install httpd -y
echo server1——192.168.0.10 > /var/www/html/index.html
systemctl enable --now httpd
#测试一下ok不
curl 192.168.0.10
#webserver2主机
网卡为仅主机模式:ip=192.168.0.20/24,gateway=192.168.0.100
yum install httpd -y
echo server2——192.168.0.20 > /var/www/html/index.html
systemctl enable --now httpd
#测试一下ok不
curl 192.168.0.20
#回到lvm主机测试
[root@rhel9 ~]# for i in {1..10}
> do
> curl 172.25.254.100
> done
webserver1-192.168.0.10
server-192.168.0.20
webserver1-192.168.0.10
server-192.168.0.20
webserver1-192.168.0.10
server-192.168.0.20
webserver1-192.168.0.10
server-192.168.0.20
webserver1-192.168.0.10
server-192.168.0.20
[root@rhel9 ~]#
集群中的增删改查
[root@rhel9 ~]# ipvsadm -A -t 172.25.254.100:80 -s rr
—A表示添加
-E表示修改
-t使用tcp协议
-D删除
[root@rhel9 ~]# ipvsadm -C 表示全部删除
realserver中的增删改查
[root@rhel9 ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10:80 -m
[root@rhel9 ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.20:80 -m
-a表示添加realserver
-r表示添加realserver的ip地址
-e表示更改realserver
-m表示net模式
-n表示不做解析
ipvsadm -C清空lvs策略
ipvsadm -l查看策略
[root@rhel9 ~]# ipvsadm -Ln
[root@rhel9 ~]# ipvsadm -Ln --rate
#查看详细信息
ipvsadm-save -n > /etc/sysconfig/ipvsadm
systemctl restart ipvsadm
LVS-dr模式
#客户端
ip:172.25.254.200/24
网关:172.25.254.100
#route路由,添加两个网卡
nat模式的网卡:172.25.254.100/24,网关:172.25.254.2(其实路由可以不设置网关)
仅主机模式下的网卡:192.168.0.100,不设置网关
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p
#检查一下
sysctl -a | grep ip_forward
#LVS主机,网卡使用仅主机模式
仅主机模式ip:192.168.0.100/24,网关192.168.0.100
使用环回网卡:ip a a 192.168.0.200/32 dev lo
[root@rhel9 ~]# 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@rhel9 ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@rhel9 ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@rhel9 ~]# ipvsadm -A -t 192.168.0.200:80 -s rr
[root@rhel9 ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10:80 -m
[root@rhel9 ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20:80 -m
[root@rhel9 ~]# ipvsadm -Ln
#webserver1主机
网卡为仅主机模式:ip=192.168.0.10/24,gateway=192.168.0.100
在添加lo的ip:ip a a 192.168.0.200/32 dev lo
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
yum install httpd -y
echo server1——192.168.0.10 > /var/www/html/index.html
systemctl enable --now httpd
#测试一下ok不
curl 192.168.0.10
#webserver2主机
网卡为仅主机模式:ip=192.168.0.20/24,gateway=192.168.0.100
在添加lo的ip:ip a a 192.168.0.200/32 dev lo
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
yum install httpd -y
echo server2——192.168.0.20 > /var/www/html/index.html
systemctl enable --now httpd
#测试一下ok不
curl 192.168.0.20
最后回到客户端,写一个循环进行测试:
for i in {1..10}
>do
>curl 192.168.0.200
>done
防火墙标记解决轮询调度的问题
#在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
lvs持久连接
在lvs主机
[root@rhel9 ~]# ipvsadm -A -f 66 -s rr -p 360
#360秒内,会和用户建立会话绑定