lvs简介
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可以轻松扩展后端服务器的数量,以满足不断增长的业务需求。
可靠性:LVS支持多种负载均衡算法,包括轮询(RR)、最少连接(LC)、源地址哈希(SH)等,可以根据实际情况选择最合适的算法。同时,LVS还支持健康检查功能,能够自动将故障服务器从负载均衡池中剔除,保证服务的持续性和可靠性。
低成本:LVS是开源软件,可以免费使用,并且可以在大多数Linux发行版上运行,降低了部署和运维的成本。
LVS的工作模式主要有三种:
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集群体系结构:
工作原理:
VS根据请求报文的目标IP和目标协议及端口将其调度转发至某RS,根据调度算法来挑选RS LVS概念- VS:Virtual Server
- RS:Real Server
- CIP:Client IP
- VIP: Virtual serve IP VS外网的IP
- DIP: Director IP VS内网的IP
- RIP: Real server IP
lvs集群的类型
- lvs-nat: 修改请求报文的目标IP,多目标IP的DNAT
- lvs-dr:操纵封装新的MAC地址
- lvs-tun: 在原请求IP报文之外新加一个IP首部
- lvs-fullnat:修改请求报文的源和目标IP
nat模式
- Ivs-nat: 本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和 PORT实现转发
- RIP和DIP应在同一个IP网络,且应使用私网地址;RS的网关要指向DIP
- 请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈
- 支持端口映射,可修改请求报文的目标PORT
- VS必须是Linux系统,RS可以是任意OS系统
nat模式数据逻辑
1.客户端发送访问请求,请求数据包中含有请求来源(cip),访问目标地址(VIP)访问目标端口(9000port) 2.VS服务器接收到访问请求做DNAT把请求数据包中的目的地由VIP换成RS的RIP和相应端口 3.RS1相应请求,发送响应数据包,包中的相应保温为数据来源(RIP1)响应目标(CIP)相应端口(9000port) 4.VS服务器接收到响应数据包,改变包中的数据来源(RIP1-->VIP),响应目标端口(9000-->80) 5.VS服务器把修改过报文的响应数据包回传给客户端 6.lvs的NAT模式接收和返回客户端数据包时都要经过lvs的调度机,所以lvs的调度机容易阻塞 客户请求到达vip后进入PREROUTING,在没有ipvs的时候因该进入本机INPUT,当IPVS存在后访问请求在通过PREROUTING后被ipvs结果并作nat转发 因为ipvs的作用点是在PREROUTING和INPUT链之间,所以如果在prerouting中设定规则会干扰ipvs的工 作。所以在做lvs时要把iptables的火墙策略全清理掉。NAT优点以及缺点
优点操作系统兼容性好:
NAT模式下,集群中的物理服务器(真实服务器)可以使用任何支持TCP/IP的操作系统。这意味着不需要对服务器操作系统进行特殊配置或限制,提高了系统的兼容性和灵活性。
IP地址灵活分配:
在NAT模式下,物理服务器可以分配Internet的保留私有地址(如RFC 1918地址),而只有负载均衡器需要一个合法的公网IP地址。这种IP地址的分配方式既节省了公网IP资源,又降低了配置复杂度。
配置简单:
NAT模式的配置相对简单,不需要额外的网络配置,如IP隧道或MAC地址欺骗等。这使得管理员可以更容易地部署和维护负载均衡系统。
安全性较高:
由于客户端的请求是通过负载均衡器进行地址转换后再转发给真实服务器的,因此真实服务器的IP地址对客户端是隐藏的。这增加了系统的安全性,防止了直接针对真实服务器的攻击。
负载均衡器成为单点故障风险降低:
尽管NAT模式下负载均衡器仍然是所有流量的必经之路,但由于其配置简单且可靠性高,因此成为单点故障的风险相对较低。此外,还可以通过冗余部署等方式进一步提高负载均衡器的可用性。
缺点
扩展性有限:
当集群中的服务器节点数量增长到一定程度时(如超过20个节点),NAT模式下的负载均衡器可能会成为整个系统的瓶颈。因为所有的请求包和应答包都需要经过负载均衡器进行地址转换,这会导致负载均衡器的处理速度变慢,进而影响整个系统的性能。
性能瓶颈:
由于NAT模式需要进行地址转换操作,这会增加负载均衡器的处理负担。在高并发场景下,如果负载均衡器的性能不足,可能会导致请求处理延迟增加,甚至引发系统崩溃等问题。
不支持端口映射:
NAT模式不支持端口映射功能,即所有真实服务器必须监听相同的端口。这限制了系统在处理多端口服务时的灵活性。
网络延迟增加:
由于所有进出真实服务器的数据包都需要经过负载均衡器进行地址转换,这会增加网络延迟。虽然对于大多数应用场景来说这种延迟是可以接受的,但在对实时性要求较高的场景下可能会成为问题。
综上所述,LVS NAT模式具有操作系统兼容性好、IP地址灵活分配、配置简单和安全性较高等优点;但同时也存在扩展性有限、性能瓶颈、不支持端口映射和网络延迟增加等缺点。
DR模式
DR:Direct Routing,直接路由,LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行 转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源 IP/PORT,以及目标IP/PORT均保持不变DR模式数逻辑
在DR模式中,RS接收到访问请求后不需要回传给VS调度器,直接把回传数据发送给client,所以RS和vs上都要有vipDR模式数据传输过程
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. 客户端接收响应
客户端收到响应报文后,认为得到了正常的服务,而不知道是哪一台真实服务器处理的请求。
DR模式的特点
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隧道的开销,并且没有对真实服务器的特殊要求。然而,它要求调度器和真实服务器必须在同一个物理网络中,这在一定程度上限制了其应用范围。
DR模式的优缺点分析:
优点
高吞吐量:
- DR模式下,负载均衡器只负责将请求包分发给后端节点服务器,而服务器直接将响应返回给客户。这种方式减少了负载均衡器的大量数据流动,使得负载均衡器不再是系统的瓶颈,因此能够处理巨大的请求量。
- 由于数据包的直接路由,减少了数据在传输过程中的延迟和开销,从而提高了整个集群系统的吞吐量。
扩展性好:
- 当集群中的服务器节点增加时,由于数据包是直接由服务器返回给客户端的,不需要经过负载均衡器,因此负载均衡器的性能不会成为系统扩展的瓶颈。
- 这种模式使得系统能够轻松地支持更多的服务器节点,提高了系统的可扩展性。
配置灵活:
- DR模式不要求负载均衡器和服务器必须在同一个物理网络中,只要它们能够通过网络相互通信即可。这增加了系统配置的灵活性。
- 服务器可以使用私有的IP地址,而对外服务的虚拟IP地址则配置在负载均衡器上,从而隐藏了服务器的真实IP地址,提高了系统的安全性。
负载均衡效率高:
- 负载均衡器可以根据服务器的负载情况动态地选择一台服务器来处理请求,从而实现了高效的负载均衡。
- 这种动态选择机制能够确保系统的资源得到充分利用,提高了系统的整体性能。
缺点
部署限制:
- DR模式要求负载均衡器和服务器之间必须处于同一个广播域内,这限制了系统的部署灵活性。
- 在某些网络环境中,可能无法满足这一要求,从而限制了DR模式的应用范围。
ARP问题:
- 由于DR模式使用虚拟IP地址对外提供服务,这可能会引发ARP(地址解析协议)问题。
- 为了解决这一问题,通常需要对服务器进行ARP抑制处理,以确保虚拟IP地址的ARP请求只由负载均衡器响应。
依赖网络性能:
- DR模式的性能很大程度上依赖于网络的性能。如果网络出现延迟或丢包等问题,将会影响系统的整体性能。因此,在使用DR模式时,需要确保网络的稳定性和可靠性。
安全性问题:
- 尽管DR模式通过隐藏服务器的真实IP地址提高了系统的安全性,但仍然存在一些潜在的安全风险。
- 例如,如果负载均衡器受到攻击或出现故障,将会影响整个系统的正常运行。因此,在使用DR模式时,需要采取适当的安全措施来保护系统的安全。
综上所述,DR模式在LVS负载均衡技术中具有高吞吐量、扩展性好、配置灵活和负载均衡效率高等优点,但同时也存在部署限制、ARP问题、依赖网络性能和安全性问题等缺点。
TUN模式(了解)
转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而在原IP报文之外再封装一个IP首部(源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户(源IP是VIP,目标IP 是CIP)TUN设备概述
定义:TUN设备是一种虚拟网络设备,操作在网络层,处理的是IP数据包。它允许用户空间的程序与内核空间的网络堆栈进行交互,从而可以在用户空间直接处理网络流量。
应用场景:TUN设备常用于实现VPN(虚拟专用网络)和其他类似的网络隧道技术。例如,在连接VPN服务时,通常会创建一个TUN设备,所有要发送到VPN的数据都会写入这个设备,而从VPN接收的数据则会从这个设备读出。
TUN模式的工作原理
在TUN模式下,数据包的处理流程大致如下:
- 数据包写入:应用程序将数据包写入TUN设备。
- 内核接收:内核接收到TUN设备中的数据包后,会将其视为普通的IP数据包进行处理。
- 转发处理:内核根据路由表将数据包转发到指定的目的地。如果目的地是另一台服务器,数据包可能会被封装并发送到网络上;如果目的地是本地服务,数据包则会被直接传递给相应的服务程序。
- 响应返回:对于来自外部的数据包,内核会将其发送到TUN设备,然后由用户空间的应用程序进行处理。
TUN模式数据传输过程
- 客户端发送请求数据包,包内有源IP+vip+dport
- 到达vs调度器后对客户端发送过来的数据包重新封装添加IP报文头,新添加的IP报文头中包含 TUNSRCIP(DIP)+TUNDESTIP(RSIP1)并发送到RS1
- RS收到VS调度器发送过来的数据包做出响应,生成的响应报文中包含SRCIP(VIP)+DSTIP(CIP)+port,响应数据包通过网络直接回传给client
TUN模式特点
- DIP, VIP, RIP都应该是公网地址
- RS的网关一般不能指向DIP
- 请求报文要经由Director,但响应不能经由Director
- 不支持端口映射
- RS的OS须支持隧道功能
TUN模式的优点和缺点
优点:
- 灵活性高:TUN模式允许用户空间的应用程序直接处理网络数据包,提供了更高的灵活性和控制力。
- 跨平台性好:由于TUN设备是在操作系统内核中创建的虚拟设备,因此可以在支持TUN/TAP设备的操作系统上使用,具有良好的跨平台性。
- 性能较好:虽然TUN设备的性能可能不如物理设备,但对于大多数应用场景(如VPN、网络测试等)来说,其性能通常是足够的。
缺点
- 配置复杂:相对于其他网络隧道技术(如IPsec、OpenVPN等),TUN模式的配置可能更加复杂和繁琐。
- 安全性问题:由于TUN设备允许用户空间的应用程序直接处理网络数据包,因此可能存在安全风险。如果应用程序存在漏洞或配置不当,可能会导致数据泄露或网络攻击。
fullnet模式(了解)
技术特点
网络地址转换(NAT)的扩展:FullNet模式可能类似于FULLNAT模式,在请求和响应上都会发生源地址(SNAT)和目标地址(DNAT)的转换。这意味着客户端的请求和真实服务器的响应都会经过负载均衡器,并且它们的IP地址和端口号都会被转换。
灵活性:FullNet模式可能提供了更高的部署灵活性,允许负载均衡器和真实服务器之间的网络架构更加多样化,可能不再受限于同一VLAN或同一网段。
性能损耗:由于FullNet模式在请求和响应上都会进行NAT转换,因此可能会引入额外的性能损耗。这种损耗可能包括处理时间的增加和带宽的占用。
LVS工作模式总结
- lvs-nat与lvs-fullnat:请求和响应报文都经由Director
- lvs-nat:RIP的网关要指向DIP
- lvs-fullnat:RIP和DIP未必在同一IP网络,但要能通信
- lvs-dr与lvs-tun:请求报文要经由Director,但响应报文由RS直接发往Client
- lvs-dr:通过封装新的MAC首部实现,通过MAC网络转发
- lvs-tun:通过在原IP报文外封装新IP头实现转发,支持远距离通信
lvs的调度算法
LVS(Linux Virtual Server)的调度算法是LVS实现负载均衡的关键部分,它们决定了如何将客户端的请求分配给后端的真实服务器(Real Server,简称RS)。LVS的调度算法可以分为静态调度算法和动态调度算法两大类。以下是LVS的一些主要调度算法及其特点:
静态调度算法
静态调度算法主要基于算法本身的规则进行调度,不考虑服务器当前的负载情
- 轮询调度(Round Robin,简称RR)
- 特点:按依次循环的方式将请求调度到不同的服务器上,假设所有服务器处理请求的能力相同,调度器会将请求平均分配给每个服务器。
- 优点:实现简单,适用于服务器性能相近的场景。
- 缺点:不考虑服务器实际负载,可能导致负载不均衡。
- 加权轮询调度(Weighted Round Robin,简称WRR)
- 特点:在RR算法的基础上增加了权重的概念,权重越高的服务器分配到的请求数越多。
- 优点:能够根据服务器的处理能力分配请求,提高资源利用率。
- 缺点:仍然不考虑服务器当前的实际负载情况。
- 目标地址散列调度(Destination Hashing,简称DH)
- 特点:根据请求的目标IP地址作为哈希键,从静态分配的哈希表中找出对应的服务器。同一个目标地址的请求始终发往第一次调度的服务器,可实现会话绑定。
- 优点:适用于缓存服务器集群,提高缓存命中率。
- 缺点:可能导致负载不均衡,特别是当目标地址分布不均时。
- 源地址散列调度(Source Hashing,简称SH)
- 特点:根据请求的源IP地址作为哈希键进行调度,同一个源IP地址的请求始终发往第一次调度的服务器。
- 优点:实现会话绑定,适用于需要保持用户会话一致性的场景。
- 缺点:同样可能导致负载不均衡。
动态调度算法
动态调度算法主要根据服务器当前的负载状况和算法进行调度。
- 最少连接调度(Least Connections,简称LC)
- 特点:将新的连接请求分配给连接数最少的服务器。
- 优点:能够较好地均衡负载,适用于长连接应用。
- 缺点:未考虑服务器的处理能力差异。
- 加权最少连接调度(Weighted Least Connections,简称WLC)
- 特点:在LC算法的基础上增加了权重的概念,权重越高的服务器将承受更大比例的活动连接负载。
- 优点:能够更合理地分配负载,适用于服务器性能差异较大的场景。
- 缺点:计算相对复杂。
- 最短期望延迟调度(Shortest Expected Delay Scheduling,简称SED)
- 特点:只考虑活动连接,不考虑非活动连接,通过计算服务器的期望延迟来选择负载最小的服务器。
- 优点:能够更精确地评估服务器的负载情况,提高系统性能。
- 缺点:计算相对复杂。
- 基于局部性的最少连接调度(Locality-Based Least Connections,简称LBLC)
- 特点:根据请求的目标IP地址找出该目标IP最近使用的服务器,若该服务器可用且未超载,则将请求发给它;否则,使用最少连接原则选择其他服务器。
- 优点:针对目标IP地址的负载均衡,适用于缓存服务器集群。
- 缺点:可能导致某些服务器负载过高。
- 带复制的基于局部性的最少连接调度(Locality-Based Least Connections with Replication,简称LBLCR)
- 特点:维护一个目标IP地址到一组服务器的映射,根据最少连接原则从组内选择服务器,若组内服务器均超载,则从集群中选择一个服务器加入组。
- 优点:解决了LBLC负载不均衡的问题,提高了系统的灵活性和可扩展性。
- 缺点:增加了管理的复杂性。
此外,LVS还有一些其他的调度算法,如Overflow-connection(OVF)等,这些算法在不同场景下具有不同的优势和适用性。
ipvsadm命令
核心功能:
- 集群服务管理:增、删、改
- 集群服务的RS管理:增、删、改
- 查看
命令参数
管理集群服务 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] 清楚计数器
lvs集群中的增删改
1.管理集群服务中的增删改- ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
- -A #添加
- -E #修改
- -t #tcp服务
- -u #udp服务
- -s #指定调度算法,默认为WLC
- -p #设置持久连接超时,持久连接可以理解为在同一个时间段同一个来源的请求调度到同一Realserver
- -f #firewall mask 火墙标记,是一个数字
#增加 [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
管理集群中RealServer的曾增删改
ipvsadm -a|e -t|u|f service-address -r realserver-address [-g|i|m] [-w weight]-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模式:
进行基础设置;
克隆四个虚拟机
第一个主机:
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中测试:
DR模式
实验准备:
基础配置:
Note:确保每台主机ping都可以互相通信
解决vip响应问题
(作用:直接将响应数据包发送给客户端,不再经过 LVS 调度器)
DR模型中各主机上均需要配置VIP,解决地址冲突的方式有三种:- (1)在前端网关做静态绑定
- (2)在各RS使用arptables
- (3)在各RS修改内核参数,来限制arp响应和通告的级别
- 0:默认值,表示可使用本地任意接口上配置的任意地址进行响应
- 1:仅在请求的目标IP配置在本地主机的接收到请求报文的接口上时,才给予响应
- 0:默认值,把本机所有接口的所有信息向每个接口的网络进行通告
- 1:尽量避免将接口信息向非直接连接网络进行通告
- 2:必须避免将接口信息向非本网络进行通告
配置内容如下:
LVS中配置:
[root@lvs ~]# ip addr add dev lo 192.168.0.200/32 //添加回环 [root@lvs ~]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> 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
测试:
lvs持久链接
在我们客户上网过程中有很多情况下需要和服务器进行交互,客户需要提交响应信息给服务器,如果单 纯的进行调度会导致客户填写的表单丢失,为了解决这个问题我们可以用sh算法,但是sh算法比较简单 粗暴,可能会导致调度失衡解决方案
在进行调度时,不管用什么算法,只要相同源过来的数据包我们就把他的访问记录在内存中,也就是把这个源的主机调度到了那个RS上 如果在短期(默认360S)内同源再来访问我仍然按照内存中记录的调度信息,把这个源的访问还调度到 同一台RS上。 如果过了比较长的时间(默认最长时间360s)同源访问再次来访,那么就会被调度到其他的RS上ipvsadm -AlE -tlulf service-address [-s scheduler] [-p [timeout]]默认360秒