1.何为LVS
LVS(Linux Virtual Server)即Linux虚拟服务器,是由章文嵩博士主导的开源负载均衡项目,目前LVS已经被集成到Linux内核模块中。该项目在Linux内核中实现了基于IP的数据请求负载均衡调度方案,其体系结构如图1所示,终端互联网用户从外部访问公司的外部负载均衡服务器,终端用户的Web请求会发送给LVS调度器,调度器根据自己预设的算法决定将该请求发送给后端的某台Web服务器,比如,轮询算法可以将外部的请求平均分发给后端的所有服务器,终端用户访问LVS调度器虽然会被转发到后端真实的服务器,但如果真实服务器连接的是相同的存储,提供的服务也是相同的服务,最终用户不管是访问哪台真实服务器,得到的服务内容都是一样的,整个集群对用户而言都是透明的。最后根据LVS工作模式的不同,真实服务器会选择不同的方式将用户需要的数据发送到终端用户,LVS工作模式分为NAT模式、TUN模式、以及DR模式。
运行原理图:
二.LVS的优点
高性能:LVS具有很高的吞吐量,可以处理大量的并发连接,非常适合高访问量的网站或应用。
可扩展性:LVS可以轻松扩展后端服务器的数量,以满足不断增长的业务需求。
可靠性:LVS支持多种负载均衡算法,包括轮询(RR)、最少连接(LC)、源地址哈希(SH)等,可以根据实际情况选择最合适的算法。同时,LVS还支持健康检查功能,能够自动将故障服务器从负载均衡池中剔除,保证服务的持续性和可靠性。
低成本:LVS是开源软件,可以免费使用,并且可以在大多数Linux发行版上运行,降低了部署和运维的成本。
三.集群和分布式简介
3.1.系统性能扩展方式
3.2.集群Cluster
3.3.分布式
3.4.集群和分布式
4.LVS三种模式
4.1概念
4.2集群类型
4.3三种模式
4.3.1 nat模式
nat模式特点:
-
负载均衡器与真实服务器之间的网络连接:在LVS/NAT模式下,负载均衡器(Director Server)与真实服务器(Real Server)通过Switch/HUB相连接,提供相同的网络服务。这种连接方式使得负载均衡器能够根据调度算法将客户端的请求转发给真实服务器1。
-
请求和响应的处理:当计算机发出请求的数据包到达负载均衡器后,负载均衡器会对请求数据包进行源地址转换(SNAT)和目标地址转换(DNAT)。通过这些转换,请求被转发到某个真实服务器的IP地址和端口号,同时使用真实服务器的MAC地址。真实服务器收到请求后,返回响应的数据包,负载均衡器再次进行源地址转换和目标地址转换,将响应数据包返回给客户端。这种处理方式使得客户端认为其直接与负载均衡器进行通信,而实际上请求和响应都是在负载均衡器和真实服务器之间进行的2。
-
会话共享:为了实现会话共享,真实服务器需要将会话数据存储在共享存储服务器上,通常使用NFS(Network File System)来实现。这种共享存储机制确保了即使多个真实服务器处理同一个会话请求,也能保持会话信息的一致性,从而提供一致的服务体验3。
综上所述,LVS/NAT模式通过负载均衡器和真实服务器之间的网络连接、请求和响应的处理机制以及共享存储的实现,提供了一种高性能、高可用的负载均衡解决方案
4.3.2 DR模式
LVS的DR模式是一种负载均衡模式,其中DR代表直接路由(Direct Routing)。在这种模式下,负载均衡器将请求发送到客户端,而真实的服务器将响应直接发送给客户端,避免了负载均衡器成为单点故障。DR模式利用了ARP抑制技术,确保真实服务器的MAC地址被注册到ARP表中,而负载均衡器的MAC地址则不被注册或者被设置为不存在的值,从而避免了数据包被发送到负载均衡器。这种模式适用于需要高可用性和可扩展性的应用场景,因为它可以有效地分散负载并提高系统的整体性能和可靠性。
在配置LVS的DR模式时,需要遵循一系列步骤来确保负载均衡和故障转移的机制能够正确运作。这包括配置负载均衡器、设置虚拟IP地址(VIP)、配置网络参数以确保数据包能够正确地路由到真实服务器,以及设置适当的负载均衡算法和故障检测机制。此外,还需要确保网络中的路由器和交换机配置正确,以便数据包能够直接从客户端发送到真实服务器,而不需要经过负载均衡器。
LVS的DR模式特别适用于需要高性能、高可用性和可扩展性的场景,如企业级应用、大型网站等。通过这种模式,可以显著提高系统的整体性能和可靠性,同时降低单点故障的风险。在实际应用中,需要根据具体的网络环境和需求来精细调整配置,以确保负载均衡和故障转移机制能够有效地工作
逻辑及数据传输图:
特点:
LVS的DR模式具有以下特点:
-
请求和响应分离:在DR模式下,负载均衡器(Director Server)负责接收客户端的请求,并根据调度算法将请求分发到后端真实服务器(Real Server)。真实服务器处理完请求后,直接将响应发送回客户端,无需经过负载均衡器。这种机制减少了负载均衡器的大量数据流动,使得负载均衡器不再是系统的瓶颈,能够处理巨大的请求量。
-
网络要求:DR模式要求负载均衡器和真实服务器必须在同一个物理网络中,且真实服务器的网关不允许指向负载均衡器的IP地址,即数据包不能经过负载均衡器。这是为了确保响应报文能够直接从真实服务器发送回客户端,而不经过负载均衡器。
-
地址配置:真实服务器需要在其通道接口上配置虚拟IP地址(VIP),以便接收来自负载均衡器转发过来的数据包,并以此作为响应报文的源IP地址。这种配置方式支持真实服务器的IP地址为公网地址或私有地址,如果使用公网地址,可以通过互联网直接访问。
-
不支持端口映射:DR模式不支持端口映射功能,这意味着如果需要端口映射,则不能使用DR模式。
-
隧道功能要求:真实服务器的操作系统需要支持隧道功能,这是因为DR模式下,请求报文虽然经过负载均衡器,但响应报文直接从真实服务器发送回客户端,这要求真实服务器能够正确处理隧道内的IP报文。
-
ARP问题:在配置DR模式时,需要注意ARP问题,确保ARP缓存的一致性,避免因为ARP问题导致的通信故障。
-
综上所述,LVS的DR模式通过优化数据流动和配置要求,实现了高效的数据处理和传输,特别适合需要高并发连接和低延迟的应用场景
4.3.3 tun模式(了解,不常用)
LVS的TUN模式是一种负载均衡技术,其特点在于不改变请求数据包,而是在请求数据包上新增一层IP首部信息。这种模式允许负载均衡器与真实服务器不在同一局域网内,并且真实服务器需要支持能够解析两层IP首部信息,即需要支持“IP Tunneling”或“IP Encapsulation”协议。在TUN模式下,负载均衡器只转发了请求数据包,响应数据包不经过负载均衡器,而是直接返回给客户端。
在配置LVS的TUN模式时,需要在负载均衡器上配置虚拟服务器,包括虚拟IP和轮询方式。真实服务器上需要配置虚拟接口(tunl0),并且需要配置内核参数如rp_filter和arp_filter来控制ARP响应。此外,还需要确保真实服务器上的VIP只能被自己“看见”,其他设备不可知,因此VIP必须绑定在真实服务器的lo网卡上,并且不允许将此网卡信息经过ARP协议对外通告。
TUN模式的优势在于负载均衡器与真实服务器可以不在同一局域网内,提供了更大的灵活性。然而,这种模式对网络设备和配置有一定的要求,包括对IP Tunneling或IP Encapsulation协议的支持,以及正确的内核参数配置。通过正确的配置和使用,TUN模式可以实现高效的负载均衡和容错,提高系统的可用性和性能
逻辑图:
特点:
- 负载均衡器只负责将请求包分发给后端节点服务器,而RS将应答包直接发给用户,减少了负载均衡器的大量数据流动。
- 这种模式允许负载均衡器处理巨大的请求量,使得一台负载均衡器能够为多个RS进行分发。
- LVS-TUN模式支持不同地域的分发,即使跑在公网上也能进行有效率的负载均衡。
然而,LVS-TUN模式也存在一些缺点:
- RS节点需要合法IP,且所有服务器必须支持"IP Tunneling"(IP Encapsulation)协议,这可能限制了服务器的使用范围。
- 这种方式可能需要特定的操作系统配置和内核支持,可能只在部分Linux系统上可用。
总结来说,LVS-TUN模式通过减少负载均衡器的数据流动和处理量,提高了系统的整体性能和可扩展性,但同时也对服务器和网络配置有一定的要求
5.LVS的调度算法
6.IPVSADM命令
7.LVS实战案例
DR模式较复杂所以DR实战会做就会nat模式,所以我们部署一下DR模式实验
部署DR模式:
1.配置实验环境
1.1每台主机都关闭防火墙和SELINUX
systemctl stop firewalld
setenforce 0
每台主机配置IP配置如下
lvs:
web1:
web2:
client:
router:
配置好网卡IP和网关IP,然后重启网卡
nmcli connection reload
nmcli connection up eth0
二、解决vip响应问题
DR模型中各主机上均需要配置VIP,解决地址冲突的方式有三种:
(1)在前端网关做静态绑定
(2)在各RS使用arptables
(3)在各RS修改内核参数,来限制arp响应和通告的级别
限制响应级别:arp_ignore
0:默认值,表示可使用本地任意接口上配置的任意地址进行响应
1:仅在请求的目标IP配置在本地主机的接收到请求报文的接口上时,才给予响应
限制通告级别:arp_announce
0:默认值,把本机所有接口的所有信息向每个接口的网络进行通告
1:尽量避免将接口信息向非直接连接网络进行通告 2:必须避免将接口信息向非本网络进行通告
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进行相同配置
LVS:
[root@lvs ~]# ipvsadm -A -t 192.168.186.200:80 -s wrr
[root@lvs ~]# ipvsadm -a -t 192.168.186.200:80 -r 192.168.186.10:80 -g -w 1
[root@lvs ~]# ipvsadm -a -t 192.168.186.200:80 -r 192.168.186.20:80 -g -w 2
路由器启用IP转发功能
net.ipv4.ip_forward = 1启用IP转发功能,当设置为 1 时,表示允许系统在不同的网络接口之间转发 IP 数据包。
net.ipv4.ip_forward_update_priority = 1这个配置项用于设置 IP 转发更新的优先级。当系统进行 IP 转发相关的更新操作时,这个优先级值会影响更新的顺序和处理方式。
net.ipv4.ip_forward_use_pmtu = 0这个配置项控制着在 IP 转发过程中是否使用路径最大传输单元(PMTU)发现机制。当设置为 0 时,表示在 IP 转发中不使用 PMTU 发现。
[root@route ~]# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 1
net.ipv4.ip_forward_update_priority = 1
net.ipv4.ip_forward_use_pmtu = 0
在 /etc/sysctl.conf配置文件中添加net.ipv4.ip_forward = 1
测试