LVS:Linux Virtual Server,负载调度器,内核集成,章文嵩,阿里的四层SLB(Server LoadBalance)是基于LVS+keepalived实现
LVS 官网: http://www.linuxvirtualserver.org/ LVS 相关术语: VS: Virtual Server,负责调度 RS:RealServer,负责真正提供服务LVS(Linux Virtual Server)是一个高性能的、开源的负载均衡器,用于Linux操作系统环境。LVS主要基于IP层(第四层,即传输层)和TCP/IP协议栈来实现请求的分发和负载均衡。它通过在一个或多个服务器集群前面设置一个负载均衡器(通常称为前端调度器或Director),来将客户端的请求根据预设的策略分发给后端的一组服务器(通常称为Real Server或后端服务器)。
高性能:LVS具有很高的吞吐量,可以处理大量的并发连接,非常适合高访问量的网站或应用。
可扩展性:LVS可以轻松扩展后端服务器的数量,以满足不断增长的业务需求。
可靠性:LVS支持多种负载均衡算法,包括轮询(RR)、最少连接(LC)、源地址哈希(SH)等,可以根据实际情况选择最合适的算法。同时,LVS还支持健康检查功能,能够自动将故障服务器从负载均衡池中剔除,保证服务的持续性和可靠性。
低成本:LVS是开源软件,可以免费使用,并且可以在大多数Linux发行版上运行,降低了部署和运维的成本。
NAT(网络地址转换)模式:在这种模式下,LVS会修改客户端的请求报文的目标地址和端口,将请求转发到后端的Real Server。Real Server处理完请求后,将响应报文发送给LVS,LVS再将响应报文的源地址和端口修改回客户端的真实地址和端口,然后发送给客户端。
DR(直接路由)模式:在这种模式下,LVS不会修改请求报文的目标地址,而是将请求报文通过物理网络直接发送给后端的Real Server。Real Server处理完请求后,直接将响应报文发送给客户端,而不需要经过LVS。这种方式需要确保Real Server和LVS在物理网络上是可达的,并且Real Server的网关指向LVS的IP地址。
TUN(隧道)模式:在这种模式下,LVS会将请求报文封装在IP隧道中,然后发送给后端的Real Server。Real Server处理完请求后,将响应报文封装在相同的IP隧道中,发送给LVS。LVS再将响应报文解封装后发送给客户端。这种方式适用于Real Server和LVS不在同一物理网络中的情况。
LVS作为Linux环境下的一种高性能负载均衡解决方案,被广泛应用于Web服务、数据库服务、邮件服务等领域,为企业提供了稳定、可靠、可扩展的服务保障。
lvs集群的类型
DR模式的数据传输过程可以概括如下:
1. 客户端发送请求
客户端向目标虚拟IP(VIP)发送请求报文。请求的数据报文源IP地址是客户端IP(CIP),目标IP是VIP。
2. 调度器接收请求
请求报文到达调度器(Director Server,即负载均衡器)的内核空间。
调度器通过IPVS(IP虚拟服务器)比对数据包请求的服务是否是集群服务。如果是集群服务,则根据负载均衡算法选择一台合适的真实服务器(Real Server)。
3. 调度器修改并转发请求
调度器重新封装数据包,修改源MAC地址为调度器的MAC地址,修改目标MAC地址为选定的真实服务器的MAC地址,但源IP地址与目标IP地址保持不变。
调度器通过二层数据链路层(如交换机)将修改后的数据包转发给选定的真实服务器。
4. 真实服务器处理请求
真实服务器收到请求报文后,检查目标MAC地址是否为自己的MAC地址,如果是,则接收此报文。
真实服务器解封装报文,发现目标IP地址(VIP)与本地配置的VIP地址匹配,于是处理该请求。
5. 真实服务器返回响应
真实服务器在返回响应报文前,会重新封装报文,将源IP地址设置为VIP,目标IP地址设置为客户端IP(CIP)。
真实服务器通过本地回环接口(lo接口)将响应报文传送给物理网卡,然后通过物理网卡将响应报文直接发送给客户端。
6. 客户端接收响应
客户端收到响应报文后,认为得到了正常的服务,而不知道是哪一台真实服务器处理的请求。
1.Director和各RS都配置有VIP
2.确保前端路由器将目标IP为VIP的请求报文发往Director
3.在前端网关做静态绑定VIP和Director的MAC地址
在RS上使用arptables工具
arptables -A IN -d $VIP -j DROP arptables -A OUT -s $VIP -j mangle --mangle-ip-s $RIP
在RS上修改内核参数以限制arp通告及应答级别
/proc/sys/net/ipv4/conf/all/arp_ignore /proc/sys/net/ipv4/conf/all/arp_announce
4.RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;
5.RIP的网关不能指向DIP,以确保响应报文不会经由Director
6.RS和Director要在同一个物理网络
7.请求报文要经由Director,但响应报文不经由Director,而由RS直接发往Client
8.不支持端口映射(端口不能修败)
9.RS可使用大多数OS系统
DR模式通过直接路由的方式实现了高效的负载均衡,避免了IP隧道的开销,并且没有对真实服务器的特殊要求。然而,它要求调度器和真实服务器必须在同一个物理网络中,这在一定程度上限制了其应用范围。
优点
高吞吐量:
扩展性好:
配置灵活:
负载均衡效率高:
缺点
部署限制:
ARP问题:
依赖网络性能:
安全性问题:
综上所述,DR模式在LVS负载均衡技术中具有高吞吐量、扩展性好、配置灵活和负载均衡效率高等优点,但同时也存在部署限制、ARP问题、依赖网络性能和安全性问题等缺点。
定义:TUN设备是一种虚拟网络设备,操作在网络层,处理的是IP数据包。它允许用户空间的程序与内核空间的网络堆栈进行交互,从而可以在用户空间直接处理网络流量。
应用场景:TUN设备常用于实现VPN(虚拟专用网络)和其他类似的网络隧道技术。例如,在连接VPN服务时,通常会创建一个TUN设备,所有要发送到VPN的数据都会写入这个设备,而从VPN接收的数据则会从这个设备读出。
在TUN模式下,数据包的处理流程大致如下:
优点:
缺点
网络地址转换(NAT)的扩展:FullNet模式可能类似于FULLNAT模式,在请求和响应上都会发生源地址(SNAT)和目标地址(DNAT)的转换。这意味着客户端的请求和真实服务器的响应都会经过负载均衡器,并且它们的IP地址和端口号都会被转换。
灵活性:FullNet模式可能提供了更高的部署灵活性,允许负载均衡器和真实服务器之间的网络架构更加多样化,可能不再受限于同一VLAN或同一网段。
性能损耗:由于FullNet模式在请求和响应上都会进行NAT转换,因此可能会引入额外的性能损耗。这种损耗可能包括处理时间的增加和带宽的占用。
LVS(Linux Virtual Server)的调度算法是LVS实现负载均衡的关键部分,它们决定了如何将客户端的请求分配给后端的真实服务器(Real Server,简称RS)。LVS的调度算法可以分为静态调度算法和动态调度算法两大类。以下是LVS的一些主要调度算法及其特点:
静态调度算法主要基于算法本身的规则进行调度,不考虑服务器当前的负载情
动态调度算法主要根据服务器当前的负载状况和算法进行调度。
此外,LVS还有一些其他的调度算法,如Overflow-connection(OVF)等,这些算法在不同场景下具有不同的优势和适用性。
管理集群服务 ipvsadm -A|E -t(tcp)|u(udp)|f(防护墙标签) \ service-address(集群地址) \ [-s scheduler(调度算法)] \ [-p [timeout]] \ [-M netmask] \ [--pepersistence_engine] \ [-b sched-flags] ipvsadm -D -t|u|f service-address 删除 ipvsadm –C 清空 ipvsadm –R 重载 ipvsadm -S [-n] 保存 管理集群中的real server ipvsadm -a|e -t|u|f service-address -r server-address [-g | -i| -m](工作模式) [-w weight](权重) ipvsadm -d -t|u|f service-address -r server-address 删除RS ipvsadm -L|l [options] 查看rs ipvsadm -Z [-t|u|f service-address] 清楚计数器
#增加 [root@DR-server ~]# ipvsadm -A -t 172.25.254.100:80 -s rr [root@DR-server ~]# ipvsadm -A -f 66 -p 3000 #修改 [root@DR-server ~]# ipvsadm -E -t 172.25.254.100:80 -s wrr -p 3000 #删除 [root@DR-server ~]# ipvsadm -D -t 172.25.254.100:80 [root@DR-server ~]# ipvsadm -D -f 66
-a #添加realserver -e #更改realserver -t #tcp协议 -u #udp协议 -f #火墙 标签 -r #realserver地址 -g #直连路由模式 -i #ipip隧道模式 -m #nat模式 -w #设定权重 -Z #清空计数器 -C #清空lvs策略 -L #查看lvs策略 -n #不做解析 --rate :输出速率信息 #添加 [root@DR-server ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.30 -m [root@DR-server ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.40 -m -w 2 #更改 [root@DR-server ~]# ipvsadm -e -t 172.25.254.100:80 -r 192.168.0.30 -m -w 1 [root@DR-server ~]# ipvsadm -e -t 172.25.254.100:80 -r 192.168.0.30 -i -w 1 #删除 [root@DR-server ~]# ipvsadm -d -t 172.25.254.100:80 -r 192.168.0.30
[root@DR-server ~]# ipvsadm -Ln [root@DR-server ~]# ipvsadm -Ln --rate IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port CPS InPPS OutPPS InBPS OutBPS -> RemoteAddress:Port TCP 172.25.254.100:80 0 0 0 0 0 -> 192.168.0.30:80 0 0 0 0 0 -> 192.168.0.40:80 0 0 0 0 0 [root@DR-server ~]# ipvsadm -C [root@DR-server ~]# ipvsadm -Z -t 172.25.254.20:80 [root@DR-server ~]# ipvsadm -Ln --rate IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port CPS InPPS OutPPS InBPS OutBPS -> RemoteAddress:Port TCP 172.25.254.20:80 0 0 0 0 0 -> 192.168.0.30:80 0 0 0 0 0 -> 192.168.0.40:80 0 0 0 0 0
pvs规则:/proc/net/ip_vs ipvs连接:/proc/net/ip_vs_conn 克隆四个虚拟机
第一个主机:
NAT模式设置其IP为:eth0 172.25.254.200 client.yxy.org
第二个主机:添加两个网卡,一个NAT,一个仅主机。
NAT模式设置其IP为:eth0 172.25.254.100 lvs.yxy.org
仅主机模式设置其IP为:eth1 192.168.0.100 lvs.yxy.org
后两个虚拟机 ,均为仅主机模式。
一个设置为webserver1 其IP为:eth0 192.168.0.10 webserver1.yxy,log
一个设置为webserver2 其IP为:eth0 192.168.0.20 webserver2.yxy,log
在lvs中打开内核路由功能
在webserver1和webserver2中安装http,并且将其两个地址分别存入 /var/www/html/index.html中;
[root@webserver1 ~]# dnf install httpd -y [root@webserver1 ~]# systemctl enable --now httpd [root@webserver1 ~] echo webserver1 - 192.168.0.10 > /var/www/html/index.html [root@webserver2 ~]# dnf install httpd -y [root@webserver2 ~]# systemctl enable --now httpd [root@webserver2 ~] echo webserver2 - 192.168.0.20 > /var/www/html/index.html
在lvs中安装 http 和 ipvsadm ,并进行操作;
[root@lvs ~]# dnf install httpd -y [root@lvs ~]# systemctl --now enable httpd [root@lvs ~]# dnf install ipvsadm -y [root@lvs ~]# ipvsadm -Ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn [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 0 -> 192.168.0.20:80 Masq 1 0 0 //保存策略 [root@lvs ~]# ipvsadm -Sn -A -t 172.25.254.100:80 -s rr -a -t 172.25.254.100:80 -r 192.168.0.10:80 -m -w 1 -a -t 172.25.254.100:80 -r 192.168.0.20:80 -m -w 1 [root@lvs ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm-config //删除所有策略 [root@lvs ~]# ipvsadm -C [root@lvs ~]# ipvsadm -Ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn //重新加载策略 [root@lvs ~]# ipvsadm -R < /etc/sysconfig/ipvsadm-config [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 0 -> 192.168.0.20:80 Masq 1 0 0 //以上操作均为临时,如果想开机启动 [root@lvs ~]# systemctl enable --now ipvsadm.service Created symlink /etc/systemd/system/multi-user.target.wants/ipvsadm.service → /usr/lib/systemd/system/ipvsadm.service. //如果出现以下问题 [root@lvs ~]# systemctl enable --now ipvsadm.service Job for ipvsadm.service failed because the control process exited with error code. See "systemctl status ipvsadm.service" and "journalctl -xeu ipvsadm.service" for details. [root@lvs ~]# cat /etc/sysc sysconfig/ sysctl.conf sysctl.d/ [root@lvs ~]# cat /etc/sysconfig/ipvsadm cat: /etc/sysconfig/ipvsadm: 没有那个文件或目录 [root@lvs ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm [root@lvs ~]# systemctl enable --now ipvsadm.service
测试并保存
修改为权重调用算法:
[root@lvs ~]# ipvsadm -E -t 172.25.254.100:80 -s wrr [root@lvs ~]# ipvsadm -e -t 172.25.254.100:80 -r 192.168.0.10:80 -m -w 2 [root@lvs ~]# ipvsadm -e -t 172.25.254.100:80 -r 192.168.0.20:80 -m -w 1 [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 wrr -> 192.168.0.10:80 Masq 2 0 0 -> 192.168.0.20:80 Masq 1 0 0
在lvs中测试:
在client中测试:
Note:确保每台主机ping都可以互相通信
(作用:直接将响应数据包发送给客户端,不再经过 LVS 调度器)
DR模型中各主机上均需要配置VIP,解决地址冲突的方式有三种:LVS中配置:
[root@lvs ~]# ip addr add dev lo 192.168.0.200/32 //添加回环 [root@lvs ~]# ip a 1: lo: 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 [root@lvs ~]# dnf install ipvsadm -y //已经安装就无需再次安装 //在lvs中配置策略 [root@lvs ~]# ipvsadm -A -t 192.168.0.200:80 -s wrr [root@lvs ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10:80 -g -w 1 [root@lvs ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20:80 -g -w 2 [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 wrr -> 192.168.0.10:80 Masq 2 0 0 -> 192.168.0.20:80 Masq 1 0 0 TCP 192.168.0.200:80 wrr -> 192.168.0.10:80 Route 1 0 0 -> 192.168.0.20:80 Route 2 0 0 [root@lvs ~]#
webserver1配置:
[root@webserver1 ~]# ip addr add dev lo 192.168.0.200/32 [root@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore [root@webserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce [root@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore [root@webserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
webserver2配置: [root@webserver2 ~]# ip addr add dev lo 192.168.0.200/32 [root@webserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore [root@webserver2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce [root@webserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore [root@webserver2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
(webserver1和webserver2中都是临时生效,重启就失效)
和DR相同
在webserver1和webserver2中安装并重启;
]# dnf install mod_ssl -y ]# systemctl restart httpd
[root@webserver1 ~]# netstat -lntup | grep httpd tcp6 0 0 :::80 :::* LISTEN 32851/httpd tcp6 0 0 :::443 :::* LISTEN 32851/httpd //在vs调度器中设定端口标签,人为80和443是一个整体
在主机打标记: [root@lvs ~]# iptables -t mangle -A PREROUTING -d 192.168.0.200 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 666 这条命令作用是在数据包进入系统的预处理阶段(PREROUTING),对目标地址为192.168.0.200、协议类型为TCP、目标端口为80或443的数据包进行标记(MARK)。 下面是对这条命令各部分的详细解释: iptables: 这是Linux下用于配置、维护IPv4数据包过滤规则的工具。 -t mangle: 指定要操作的表为mangle表。iptables有多个表,每个表负责不同的功能。mangle表主要用于修改数据包的服务类型(TOS)、TTL、以及为数据包设置标记(MARK)等。 -A PREROUTING: -A 表示向指定的链(chain)追加(Append)一条规则。PREROUTING 是mangle表中的一个链,用于处理进入本机前的数据包,即数据包路由决策前的处理。 -d 192.168.0.200: -d 或 --destination 指定目标IP地址。这里的目标地址是192.168.0.200,意味着这条规则仅适用于目标地址为此IP的数据包。 -p tcp: -p 或 --protocol 指定协议类型。这里是TCP协议,表示这条规则仅适用于TCP协议的数据包。 -m multiport --dports 80,443: -m 或 --match 指定要使用的扩展匹配模块。multiport 是一个扩展模块,用于匹配多个端口。--dports 指定目标端口,这里是80和443,意味着这条规则适用于目标端口为80或443的数据包。 -j MARK --set-mark 666: -j 或 --jump 指定满足匹配条件后执行的动作。这里是MARK,表示对数据包进行标记。--set-mark 666 指定了标记的值为666。这个标记可以在后续的数据包处理过程中被用来进行路由决策或其他操作。 综上所述,这条命令的作用是:对于所有目标IP为192.168.0.200、协议为TCP、目标端口为80或443的数据包,在它们进入系统的预处理阶段时,给它们打上标记666。这个标记可以用于后续的路由决策或防火墙规则匹配中。
[root@lvs ~]# iptables -t mangle -A PREROUTING -d 192.168.0.200 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 666 [root@lvs ~]# ipvsadm -C //在Director主机基于标记定义集群服务: (ipvsadm -A -f NUMBER [options]) [root@lvs ~]# ipvsadm -A -f 666 -s rr [root@lvs ~]# ipvsadm -a -f 666 -r 192.168.0.10 -g [root@lvs ~]# ipvsadm -a -f 666 -r 192.168.0.20 -g [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 666 rr -> 192.168.0.10:0 Route 1 0 0 -> 192.168.0.20:0 Route 1 0 0 [root@lvs ~]# systemctl restart ipvsadm.service [root@lvs ~]# cat /etc/sysconfig/ipvsadm -A -f 666 -s rr -a -f 666 -r 192.168.0.10:0 -g -w 1 -a -f 666 -r 192.168.0.20:0 -g -w 1
ipvsadm -AlE -tlulf service-address [-s scheduler] [-p [timeout]]默认360秒