LVS:是一种负载均衡器,工作在osi四层,基于ip和端口实现转发数据包,其传输的流量最多可达传输层。
lvs的相关名词解释:
RS:真实的后端服务器
CIP:客户端的ip
VIP: 虚拟服务器面向客户端的ip,我们称为外网ip
DIP: 虚拟服务器面向后端服务器的ip,我们称为内网ip
RIP: 真实后端服务器的ip
lvs集群的常见类型:
lvs-nat(网络地址装换): 其本质是修改请求报文的目标ip和端口从而实现的数据包转发
lvs-dr(直连路由): 其本质是通过修改请求报文的源目mac地址实现的数据包转发,该算法也是生产环境中使用最多的一种
lvs-tun(隧道): 其本质是将请求数据包重新封装在一个新的IP数据包中,并通过隧道发送给后端服务器
lvs的调度算法:
静态算法:不考虑后端服务器的负载
RR:轮询,客户端的请求被轮流调度到不同的后端服务器上
WRR:在RR的基础上,给后端服务器添加权重值,权重值大的服务器优先调度,调度完之后才轮到权重值小的服务器
SH:源地址哈希,将同一ip来源的请求,始终转发到同一后端服务器
DH:目标地址哈希,尽量保证相同目标地址的请求被分配到同一后端服务器。
动态算法:考虑后端服务器的负载,来动态分配请求
LC:会把连接请求分配到当前活动连接数最少的真实服务器上。
WLC:在 LC 算法的基础上,为每个真实服务器设置了权重值。服务器的权重越高,其处理新连接的能力就越强。在分配连接时,首先计算每个服务器的加权活动连接数(权重值与活动连接数的乘积),然后将新连接分配到加权活动连接数最小的服务器上。
SED: 算法在调度时会综合考虑服务器的权重和当前的连接数。其基本思想是为每个服务器计算一个预期延迟值,预期延迟值的计算基于服务器的权重和当前连接数。
具体来说,预期延迟值等于:(当前连接数 + 1) * 256 / 服务器权重,调度时,SED 算法会选择预期延迟值最小的服务器来处理新的请求。
LVS负载均衡使用的场景:
高并发网站:当网站的访问量巨大,单个服务器无法承受负载时,LVS 可以将流量分发到多个后端服务器,确保网站的快速响应和稳定性。
电商平台:在促销活动或高峰时段,电商平台会面临大量的用户请求,LVS 有助于平衡服务器负载,保证交易的顺利进行。
在线游戏:处理大量玩家的同时在线和交互请求,确保游戏服务的流畅性。
总之,只要存在大量并发请求且需要在多个服务器之间均衡分配负载以保证服务质量和可用性的场景,都可以考虑使用 LVS 负载均衡。
nat模式数据传输的原理:
我们的用户发出请求后,请求报文里会携带源客户端ip地址以及目的ip地址即中间虚拟服务器的外网ip地址以及端口,当我们的请求到达中间虚拟服务器后,会将请求报文的目的ip地址替换成真实后端服务器的ip地址以及端口,因为虚拟服务器的内网ip地址是和后端服务器处于同一网段,所以我们的请求会继续通过虚拟服务器的内网ip地址将请求转发到后端服务器,请求到达后端服务器后,会将源ip地址替换成后端服务器的ip地址,目标ip地址替换成客户端的ip地址以及端口,最后将数据包通过虚拟服务器返回给客户端,从而实现数据的双向交互。
实验环境:
虚拟机版本:redhat9.4
客户端服务器: windows端作为测试端
lvs服务器: eth0:172.25.254.100 NAT eth1:192.168.0.100 仅主机
web1服务器: 192.168.0.10 仅主机 gateway:192.168.0.100
web2服务器: 192.168.0.20 仅主机 gateway:192.168.0.100
web1服务器端配置:
- [root@www ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
- [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;
-
- [root@www ~]# nmcli connection reload
- [root@www ~]# nmcli connection up eth0
- [root@www ~]# yum install nginx -y
- [root@www ~]# echo web1 > /usr/share/nginx/html/index.html
- [root@www ~]# systemctl restart nginx
- [root@www ~]# curl 192.168.0.10
- web1
web2服务器端配置:
- [root@www ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
- [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;
-
- nmcli connection reload
- nmcli connection up eth0
- yum install nginx -y
- echo web2 > /usr/share/nginx/html/index.html
- systemctl restart nginx
- curl 192.168.0.20
- web2
lvs服务器端配置:
- [root@www ~]# cat /etc/NetworkManager/system-connections/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;
-
-
- nmcli connection reload
- nmcli connection up eth0
-
-
-
-
- [root@www ~]# cat /etc/NetworkManager/system-connections/eth1.nmconnection
- [connection]
- id=eth1
- type=ethernet
- interface-name=eth1
-
- [ipv4]
- address1=192.168.0.100/24,172.25.254.2
- method=manual
- dns=114.114.114.114;
-
-
-
- nmcli connection reload
- nmcli connection up eth1
-
-
-
-
- #打开路由转发功能,让172网段和192网段互通
- vim /etc/sysctl.conf
- net.ipv4.ip_forward = 1
-
- sysctl -p #重载生效
-
-
- #安装lvs软件
- yum install ipvsadm -y
-
-
-
-
- #设置lvs策略
- ipvsadm -A -t 172.25.254.100:80 -s rr
- ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10:80 -m
- ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.20:80 -m
-
-
- -A:添加lvs策略
- -t:指定传输的协议为tcp
- -s:指定调度算法
- -a:添加后端真实服务器
- -r:指定后端服务器的ip
- -m:指定lvs的模式为nat模式
-
-
-
-
- #查看添加的路由策略
- [root@www ~]# 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
windows客户端测试:
- C: \Users\大圣哥>curl 172. 25. 254. 100
- web2
-
- C: \Users\大圣哥>curl 172. 25. 254. 100
- web1
lvs-dr实验
dr模式数据传输的原理:
当我们的客户端发出请求后,请求报文里会携带客户端的ip地址以及mac地址,同时还会携带中间虚拟服务器的外网ip,以及mac地址,当请求到达虚拟服务器后,虚拟服务器会将虚拟服务器的外网的mac地址替换成真实的后端服务器的mac地址,接着请求被转发到后端服务器后,数据包会将虚拟服务器的ip作为源ip,后端服务器的mac作为源mac,而将客户端的ip作为目的ip,客户端的mac作为目的mac,最后直接将请求返回给客户端,从而实现数据的转发。
实验环境:
客户端:172.25.254.200 nat
router:eth0 172.25.254.100 nat eth1 192.168.0.100 仅主机
lvs: vip: 192.168.0.200 dip: 192.168.0.50 仅主机
web1: rip 192.168.0.10 vip:192.168.0.200 仅主机
web2: rip 192.168.0.20 vip:192.168.0.200 仅主机
注意:192网段为nat,172网段为仅主机
客户端配置:
- [root@www ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
- [connection]
- id=eth0
- type=ethernet
- interface-name=eth0
-
- [ipv4]
- address1=172.25.254.200/24,172.25.254.100
- method=manual
- dns=114.114.114.114;
router端配置:
- [root@www ~]# cat /etc/NetworkManager/system-connections/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@www ~]# cat /etc/NetworkManager/system-connections/eth1.nmconnection
- [connection]
- id=eth1
- type=ethernet
- interface-name=eth1
-
- [ipv4]
- address1=192.168.0.100/24
- method=manual
- dns=114.114.114.114;
lvs端配置:
- [root@www ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
- [connection]
- id=eth0
- type=ethernet
- interface-name=eth0
-
- [ipv4]
- address1=192.168.0.50/24,192.168.0.100
- method=manual
- dns=114.114.114.114;
-
-
-
- #打开路由转发
- vim /etc/sysctl.conf
- net.ipv4.ip_forward = 1
-
- sysctl -p #重载生效
-
-
- #添加vip
- ip a a 192.168.0.200/32 dev lo
-
-
-
-
- #添加路由策略
- yum install ipvsadm -y
- [root@www ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20:80 -g -w 1
- [root@www ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20:80 -g -w 1
web1端配置:
- [root@www ~]# yum install nginx -y
- [root@www ~]# echo web1 > /usr/share/nginx/html/index.html
- [root@www ~]# systemctl restart nginx
-
-
-
-
-
- [root@www ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
- [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;
-
-
- #添加vip
- ip a a 192.168.0.200/32 dev lo
-
-
-
- #忽略arp广播
- [root@www ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
- [root@www ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
- [root@www ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
- [root@www ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
web2端配置:
- [root@www ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
- [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;
-
-
- #添加vip
- ip a a 192.168.0.200/32 dev lo
-
-
- #忽略arp广播
- [root@www ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
- [root@www ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
- [root@www ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
- [root@www ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
访问测试
- [root@www ~]# for i in {1..10}
- > do
- > curl 192.168.0.200
- > done
- web1
- web2
- web1
- web2
- web1
- web2
- web1
- web2
- web1
- web2