lvs理论部分
LVS(Linux Virtual Server)是Linux虚拟服务器的简称,是一个基于Linux操作系统的虚拟服务器集群系统。LVS主要用于实现负载均衡和高可用性,通过将客户端的请求分发到多台后端服务器上,从而提高整体服务的处理能力和可靠性。以下是LVS的详细介绍:
一、基本概念
-
LVS架构:LVS架构从逻辑上可分为调度层、Server集群层和共享存储层。调度层负责接收客户端请求并根据一定的调度算法将请求分发到后端服务器;Server集群层由多台后端服务器组成,负责实际处理请求;共享存储层(可选)用于存储共享数据,保证数据的一致性。
-
组件:LVS主要由IPVS(IP Virtual Server)和三种工作模式(LVS-NAT、LVS-DR、LVS-TUN)组成。IPVS是LVS的核心,负责实现IP负载均衡技术;三种工作模式则分别适用于不同的应用场景。
二、主要功能
-
负载均衡:LVS通过将客户端的请求分发到多台后端服务器上,实现负载均衡,提高整体服务的处理能力和响应速度。
-
高可用性:通过配置Keepalived等工具,LVS可以实现高可用性,确保服务的持续运行。即使某台后端服务器出现故障,LVS也能自动将请求转发到其他健康的服务器上。
-
灵活性强:LVS支持多种负载均衡算法和工作模式,适应不同的应用场景和需求。用户可以根据实际情况选择合适的算法和模式来优化系统性能。
三、工作原理
LVS工作在网络层,通过修改数据包的目标IP地址或MAC地址来实现请求的转发。具体工作原理如下:
-
LVS-NAT模式:在该模式下,负载均衡器不仅需要修改请求报文的目标地址,还需要修改响应报文的源地址。客户端的请求首先到达负载均衡器,负载均衡器将请求报文的目标IP地址修改为后端服务器的IP地址,然后将请求转发给后端服务器。后端服务器处理完请求后,将响应报文发送给负载均衡器,负载均衡器再将响应报文的源地址修改为自己的IP地址,然后返回给客户端。
-
LVS-DR模式:在该模式下,负载均衡器只修改请求报文的目标MAC地址,而不修改IP地址。客户端的请求到达负载均衡器后,负载均衡器将请求报文的目标MAC地址修改为后端服务器的MAC地址,然后将请求直接发送给后端服务器(不经过物理网络)。后端服务器处理完请求后,直接将响应报文发送给客户端(不经过负载均衡器)。
-
LVS-TUN模式:该模式通过IP隧道将请求转发到后端服务器。客户端的请求到达负载均衡器后,负载均衡器将请求报文封装在IP隧道中发送给后端服务器。后端服务器解封装后处理请求,并将响应报文直接发送给客户端(不经过负载均衡器)。
四、应用场景
LVS广泛应用于各大企业的生产环境中,特别是在需要处理大量并发请求的场景下。例如,LVS可以用于构建高可用的Web服务器集群、数据库的读写分离和负载均衡、以及需要处理大量并发请求的应用程序等。
五、优势
-
高性能:LVS工作在内核层,性能高效,能够处理大量并发请求。
-
高可用性:通过配置高可用性工具,LVS可以确保服务的持续运行。
-
灵活性强:支持多种负载均衡算法和工作模式,适应不同的应用场景。
-
成本低廉:LVS是开源软件,可以免费使用,并且可以将多台低性能的服务器组合成一个高性能的服务器集群。
综上所述,LVS是一个功能强大、灵活性强、性能高效的负载均衡解决方案,广泛应用于各大企业的生产环境中。
lvs实验部分
lvs的NAT模式
1、环境
lvs主机:
rh9
2块网卡
eth0:172.25.254.100 lvs.timinglee.org NAT模式
eth1:192.168.0.100 lvs.timinglee.org 仅主机模式
[root@lvs ~]# cat /etc/NetworkManager/systemconnections/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 ~]# cat /etc/NetworkManager/systemconnections/eth1.nmconnection [connection] id=eth1 type=ethernet interface-name=eth1 [ipv4] address1=192.168.0.100/24 method=manual [root@lvs ~]# nmcli connection reload [root@lvs ~]# nmcli connection up eth0 #打开内核 [root@lvs ~]# sysctl -a | grep ip_forward [root@lvs ~]# vim /etc/sysctl.conf net.ipv4.ip_forward=1 [root@lvs ~]# sysctl -p #生效
RS:webserver1主机:
rh9
仅主机模式
192.168.0.10 webserver1.timinglee.org
[root@webserver1 ~]# cat /etc/NetworkManager/systemconnections/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@webserver1 ~]# nmcli connection reload [root@webserver1 ~]# nmcli connection up eth0
RS:webserver2主机
rh9
仅主机模式
192.168.0.20 webserver2.timinglee.org
[root@webserver2 ~]# 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; [root@webserver2 ~]# nmcli connection reload [root@webserver2 ~]# nmcli connection up eth0
2、正式部分
# webserver1 [root@webserver1 ~]# dnf install httpd -y [root@webserver1 ~]# echo webserver1 - 192.168.0.10 > /var/www/html/index.html [root@webserver1 ~]# systemctl enable --now httpd # webserver2 [root@webserver2 ~]# dnf install httpd -y [root@webserver2 ~]# echo webserver2 - 192.168.0.20 > /var/www/html/index.html [root@webserver2 ~]# systemctl enable --now httpd # 在lvs里检测 [root@lvs ~]# curl 192.168.0.10 [root@lvs ~]# curl 192.168.0.20
# 在lvs 安装lvs软件 [root@lvs ~]# dnf search lvs [root@lvs ~]# dnf install ipvsadm -y # 查看策略 [root@lvs ~]# ipvsadm -Ln (无) [root@lvs ~]# cat /etc/sysconfig/ipvsadm (无) # 创建策略 # -A:用于添加一个新的虚拟服务器 -t:指定了虚拟服务器的地址和端口 -s:指定了调度算法 rr:轮询算法 [root@lvs ~]# ipvsadm -A -t 172.25.254.100:80 -s rr [root@lvs ~]# ipvsadm -Ln (有) # -a:用于向虚拟服务器添加一个新的真实服务器 -t:虚拟服务器的地址和端口 -r:要添加的真实服务器的地址和端口 -m:指定了转发方法,即NAT(网络地址转换)模式 [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-save > /etc/sysconfig/ipvsadm #永久保存 [root@lvs ~]# ipvsadm-save -n > /etc/sysconfig/ipvsadm
二、lvs的DR模式
1、环境
#环境 lvs: 一张网卡 eth0 eth1:仅主机 192.168.0.50 lvs.timinglee.org (网关:192.168.0.100) 路由器router: 两张网卡 eth0:NAT 172.25.254.100 router.timinglee.org eth1:仅主机 192.168.0.100 router.timinglee.org (不需要网关) 打开内核 客户端client: 一张网卡 eth0: NAT 172.25.254.200 client.timinglee.org (网关:172.25.254.100)
客户端:
[root@client ~]# 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 [root@client ~]# nmcli c reload [root@client ~]# nmcli c up eth0
路由器:
[root@router ~]# 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@router ~]# cat /etc/NetworkManager/system-connections/eth1.nmconnection [connection] id=eth1 type=ethernet interface-name=eth1 [ipv4] address1=192.168.0.100/24 method=manual [root@router ~]# nmcli c reload [root@router ~]# nmcli c up eth1
lvs:
[root@lvs ~]# cat /etc/NetworkManager/system-connections/eth1.nmconnection [connection] id=eth1 type=ethernet interface-name=eth1 [ipv4] address1=192.168.0.50/24,192.168.0.100 method=manual [root@lvs ~]# nmcli c reload [root@lvs ~]# nmcli c up eth1 #内核路由功能打开 [root@lvs]# sysctl -a | grep ip_forward [root@lvs]# 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 #使其生效 [root@lvs ]#sysctl -p
#lvs、webserver1、webserver2上添加vip: ip a a 192.168.0.200/32 dev lo #删除 ip a d 查看 ip a show
2、lvs上做策略
# 在lvs 和 rs 中设定vip [root@lvs ~]# ip addr add dev lo 192.168.0.200/32 [root@rs1 ~]# ip addr add dev lo 192.168.0.200/32 [root@rs2 ~]# ip addr add dev lo 192.168.0.200/32 # 在RS1和RS2中解决响应问题 [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/all/arp_ignore [root@webserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_ignore [root@webserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore [root@webserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore [root@webserver2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_ignore [root@webserver2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_ignore # 在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
3、测试
三、防火墙标签解决轮询错误
1、火墙mark标记解决调度问题
#webserver1、webserver2 yum install mod_ssl -y #RS安装mod ssl模块 让rs支持https systemctl restart httpd netstat -antup | grep http #lvs上 [root@lvs boot]# ipvsadm -A -t 192.168.0.200:80 -s rr [root@lvs boot]# ipvsadm -A -t 192.168.0.200:443 -s rr [root@lvs boot]# ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.10:443 -g [root@lvs boot]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10:80 -g [root@lvs boot]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20:80 -g [root@lvs boot]# ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.20:443 -g [root@lvs boot]# ipvsadm -Ln #访问不对 [root@client ~]# for i in {1..10}; do curl 192.168.0.200; done webserver2 - 192.168.0.20 webserver2 - 192.168.0.20 webserver2 - 192.168.0.20
#lvs主机为端口做标记 [root@lvs boot]# iptables -t mangle -nL [root@lvs boot]# iptables -t mangle -A PREROUTING -d 192.168.0.200 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 66 [root@lvs boot]# iptables -t mangle -nL #清空之前的策略 [root@lvs boot]# ipvsadm -C #添加新策略 [root@lvs boot]# ipvsadm -A -f 66 -s rr [root@lvs boot]# ipvsadm -a -f 66 -r 192.168.0.10 -g [root@lvs boot]# ipvsadm -a -f 66 -r 192.168.0.20 -g #访问(如果访问不是这样,应该是穿透,arp响应没关) [root@client ~]# curl 192.168.0.200; curl -k https://192.168.0.200 webserver2 - 192.168.0.20 webserver1 - 192.168.0.10
2、lvs-session会话问题解决
在lvs调度器中设定 [root@lvs ~]# ipvsadm -E -f 66 -s rr -p 5 #5秒内会把流量打到同一个后端的webserver,之后根据调度策略重新打流量 [root@lvs ~]# ipvsadm -LnC # 未成功可能存在arp绑定 # 查看arp绑定 [root@client ~]# arp -a
3、为什么会出现haproxy
#当我们停止一台主机的HTTP时,lvs会出现下面这种情况,但应该只去找另一台主机,所有需要使用haproxy来实现 [root@webserver1 ~]# systemctl stop httpd [root@client ~]# curl 192.168.0.200; curl -k https://192.168.0.200 webserver2 - 192.168.0.20 crul: (7)