一、LVS简介
Internet的快速增长使多媒体网络服务器面对的访问数量快速增加,服务器需要具备提供大量并发访问服务的能力,因此对于大负载的服务器来讲, CPU、I/O处理能力很快会成为瓶颈。由于单台服务器的性能总是有限的,简单的提高硬件性能并不能真正解决这个问题。为此,必须采用多服务器和负载均衡技术才能满足大量并发访问的需要。Linux 虚拟服务器(Linux Virtual Servers,LVS) 使用负载均衡技术将多台服务器组成一个虚拟服务器。它为适应快速增长的网络访问需求提供了一个负载能力易于扩展,而价格低廉的解决方案。LVS通过工作于内核的ipvs模块来实现功能,其主要工作于netfilter 的INPUT链上。LVS具有以下优秀特质:
1.高可用性
LVS是一个基于内核级别的应用软件,因此具有很高的处理性能,用LVS构架的负载均衡集群系统具有优秀的处理能力,每个服务节点的故障不会影响整个系统的正常使用,同时又实现负载的合理均衡,使应用具有超高负荷的服务能力,可支持上百万个并发连接请求。如配置百兆网卡,采用VS/TUN或VS/DR调度 技术,整个集群系统的吞吐量可高达1Gbits/s;如配置千兆网卡,则系统的最大吞吐量可接近10Gbits/s。
2. 高可靠性
LVS负载均衡集群软件已经在企业、学校等行业得到了很好的普及应用,国内外很多大型的、关键性的web站点也都采用了LVS集群软件,所以它的可靠性在 实践中得到了很好的证实。有很多以LVS做的负载均衡系统,运行很长时间,从未做过重新启动。这些都说明了LVS的高稳定性和高可靠性。
3.适用性强
LVS对前端Director Server目前仅支持Linux和FreeBSD系统,但是支持大多数的TCP和UDP协议,支持TCP协议的应用有:HTTP,HTTPS ,FTP,SMTP,,POP3,IMAP4,PROXY,LDAP,SSMTP等等。支持UDP协议的应用有:DNS,NTP,ICP,视频、音频流播放协议等。
LVS对Real Server的操作系统没有任何限制,RealServer可运行在任何支持TCP/IP的操作系统上,包括Linux,各种Unix(如FreeBSD、SunSolaris、HP Unix等),Mac/OS和Windows等。
二、LVS的组成
(1)结构划分
LVS架构从逻辑上可分为调度层、Server集群层和共享存储
LVS 由2部分程序组成,包括 ipvs 和 ipvsadm。
1. ipvs(ip virtual server):一段代码工作在内核空间,叫ipvs,是真正生效实现调度的代码。
2. ipvsadm:另外一段是工作在用户空间,叫ipvsadm,负责为ipvs内核框架编写规则,设置lvs模型、调度方式以及指定后端主机
(2)名词解释
1.调度器:Virtual
Server(VS),Director(调度器),Dispatcher(分发器),Balancer(负载均衡器)
设置lvs模型、调度方式以及指定后端主机
2.真实主机:Real Server(RS)。
真正提供服务的后端服务器
3.Client IP:
客户端访问服务时所使用的IP地址,简称CIP
4.Director Virtual IP:
调度器用于与客户端通信的IP地址,简称为VIP
5.Director IP:
调度器用于与RealServer通信的IP地址,简称为DIP。
6.Real Server :
后端主机的用于与调度器通信的IP地址,简称为RIP。
LVS结构与工作原理
一.LVS的结构
LVS由前端的负载均衡器(Load Balancer,LB)和后端的真实服务器(Real Server,RS)群组成。RS间可通过局域网或广域网连接。LVS的这种结构对用户是透明的,用户只能看见一台作为LB的虚拟服务器(Virtual Server),而看不到提供服务的RS群。当用户的请求发往虚拟服务器,LB根据设定的包转发策略和负载均衡调度算法将用户请求转发给RS。RS再将用户请求结果返回给用户。
二.LVS内核模型
1.当客户端的请求到达负载均衡器的内核空间时,首先会到达PREROUTING链。
2.当内核发现请求数据包的目的地址是本机时,将数据包送往INPUT链。
3.LVS由用户空间的ipvsadm和内核空间的IPVS组成,ipvsadm用来定义规则,IPVS利用ipvsadm定义的规则工作,IPVS工作在INPUT链上,当数据包到达INPUT链时,首先会被IPVS检查,如果数据包里面的目的地址及端口没有在规则里面,那么这条数据包将被放行至用户空间。
4.如果数据包里面的目的地址及端口在规则里面,那么这条数据报文将被修改目的地址为事先定义好的后端服务器,并送往POSTROUTING链。
5.最后经由POSTROUTING链发往后端服务器。
三.LVS的三种调度模式
1.NAT模型:
①.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP(客户端IP),后面统称为CIP),目标地址为VIP(负载均衡器前端地址,后面统称为VIP)。
②.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将客户端请求报文的目标地址改为了后端服务器的RIP地址并将报文根据算法发送出去。
③.报文送到Real Server后,由于报文的目标地址是自己,所以会响应该请求,并将响应报文返还给LVS。
④.然后lvs将此报文的源地址修改为本机并发送给客户端。
注意:在NAT模式中,Real Server的网关必须指向LVS,否则报文无法送达客户端
。从客户端到调度器的数据包的源IP是CIP,目的IP是VIP,然后DNAT把其目的地址从VIP转换为RIP,所有数据包从DIP发送到RIP是,其源IP为CIP,目的IP为RIP。这样客户端的请求就到达了调度器选择的某一个RS上,然后此RS根据请求,向CIP发送一个响应,如果RIP直接响应CIP,不经过调度器,客户端收到一个源IP不是VIP的数据包,肯定莫名奇妙呀,明明我请求的是VIP,怎么会返回RIP的数据包呢?所以,RS响应客户端请求时,得重新把源地址为RIP的数据转换成VIP。然后客户端就收到响应啦
原理:
基于ip伪装MASQUERADES
,原理是多目标DNAT。
所以请求和响应都经由Director调度器。
在此模式下 ,我们只用把VIP设置为公网IP,把其他的DIP,RIP设置为私有地址,就可以提供服务器并满足负载均衡的需求了。而且,此模式还支持端口映射~因为调度器只是发送一个请求到后端服务器,所以VS必须是linux,比较LVS是linux上的东东,还加到内核了,RS就可以是任何系统了,能提供服务就好。
LVS-NAT的优点与缺点
优点:
- 支持端口映射
- RS可以使用任意操作系统
- 节省公有IP地址。
RIP和DIP都应该使用同一网段私有地址,而且RS的网关要指向DIP。
使用nat另外一个好处就是后端的主机相对比较安全。
缺点:
- 请求和响应报文都要经过Director转发;极高负载时,Director可能成为系统瓶颈。
就是效率低的意思。
特点:
- RS应该使用私有地址,RS的网关必须指向DIP
- DIP和RIP必须在同一个网段内
- 请求和响应报文都需要经过Director Server,高负载场景中,Director Server易成为性能瓶颈
- 支持端口映射
- RS可以使用任意操作系统
- 缺陷:对Director Server压力会比较大,请求和响应都需经过director server
2.DR模型:
①.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。
②.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将客户端请求报文的源MAC地址改为自己DIP的MAC地址,目标MAC改为了RIP的MAC地址,并将此包发送给RS。
③.RS发现请求报文中的目的MAC是自己,就会将次报文接收下来,处理完请求报文后,将响应报文通过lo接口送给eth0网卡直接发送给客户端。
注意:需要设置lo接口的VIP不能响应本地网络内的arp请求
。当客户端的请求经过无数个路由器,交换机到达我们的调度器时,此过程中源IP是客户端的CIP,目的IP是调度器的VIP,到达调度器的内网时,请求报文的源MAC地址为网关的MAC地址,目的MAC地址就是VIP所在的MAC地址。(这个东东必须明晰!不然后面理解有点困难,此处默认大家有基本的网络知识!)此结构中我们的VIP和DIP其实是同一个,然后我们把请求的数据包转发给处在同一网络中的VS选择的一个RS。此时的请求数据包的源IP依然是CIP,目的IP依然是VIP不变,但是目的MAC地址变为RIP所在接口的MAC地址。(必须知道,IP地址是逻辑上的地址,MAC地址才是真正的通信地址,所以我们才可以通过修改MAC地址发送到指定的RS)。RS接收到数据后,假如她能根据请求进行响应,直接发给客户端。这样就响应报文就不用经过调度器。
网关就通过MAC地址将客户端的请求发送给VIP所在的接口,因为是客户端请求,最后由网关发送到VIP的。所以,从网关出去时源IP为CIP,目的IP为VIP,源MAC为网关接口的MAC,目的IP为VIP所在接口的MAC,VS接收到请求数据包之后,根据调度策略选择一个合适的RS,然后从VIP接口发出,到RS所在的RIP接口,此时,源IP还是CIP,目的IP还是VIP,源MAC是VS的VIP所在的接口MAC,目的MAC是RIP所在接口的MAC,然后RS接收到数据包后,查看一下,嗯目的IP是我接口的IP,目的MAC是我接口的MAC,然后继续解封装到应用层,把请求给对应的服务器程序。服务器收到程序后,再从RS的VIP发送响应数据,此时源IP就为送出接口的IP即VIP,目的IP就是CIP啦~然后就实现所谓的响应报文不经过调度器啦。
不过有个问题还是没解决,RIP收到请求数据包后,在从此接口发出去的时候源IP依然是RIP,怎样才能实现上文提到的源IP为VIP呢?LVS在此处的设计相当精巧。在linux中有个思想就是,ip是属于内核的而不是接口的。即接口a上 有个IP1,接口b上有个ip2,当从a接口收到一个数据包,问接口a你有没有ip2呀,接口a回复说我有ip2,然后接口a收到ip2的数据包之后就转发给接口b。还有一点,一个数据包从哪个接口发出去,它的源 IP就是哪个接口的ip,即从接口a发出去的数据包的源ip为接口a的ip,但是从接口a发出,但转发到接口b发送给另外一个接口,源ip还是接口a的ip。根据这两个常识,第三种的实现如下:RS接收数据包的接口依然是RIP,但是我们把VIP设置到lo0环回接口上,因为接口a都会把lo0接口上的VIP告诉别人,所以我们得通过设置内核参数让ip地址就属于接口本身,不属于接口的ip他不能告诉别人。第二,我们让数据包从lo0口发出,然后从RIP所在的接口发送给外部主机,这样源IP就是lo0接口所在的VIP啦
因为LVS-dr模式是通过修改目的MAC地址来把请求报文从VS发送到RS的,而且MAC不能跨网络,所以LVS-dr模式只能用在同一广播域中。
原理
当Director接收到请求之后,通过调度方法选举出RealServer。
讲目标地址的MAC地址改为RealServer的MAC地址。
RealServer接受到转发而来的请求,发现目标地址是VIP。RealServer配置在lo接口上。
处理请求之后则使用lo接口上的VIP响应CIP。
LVS-DR的优点与缺点
优点:
- RIP可以使用私有地址,也可以使用公网地址。
只要求DIP和RIP的地址在同一个网段内。
- 请求报文经由Director调度,但是响应报文不经由Director。
- RS可以使用大多数OS
缺点:
- 不支持端口映射。
- 不能跨局域网。
- 在前端路由器做静态地址路由绑定,将对于VIP的地址仅路由到Director Server
- 存在问题:用户未必有路由操作权限,因为有可能是运营商提供的,所以这个方法未必实用
- arptables:在arp的层次上实现在ARP解析时做防火墙规则,过滤RS响应ARP请求。这是由iptables提供的
- 修改RS上内核参数(arp_ignore和arp_announce)将RS的VIP配置在lo接口的别名上,并限制其不能响应对VIP地址解析请求。
3.TUN模型:
①.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。
②.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将在客户端请求报文的首部再封装一层IP报文,将源地址改为DIP,目标地址改为RIP,并将此包发送给RS。
③.RS收到请求报文后,会首先拆开第一层封装,然后发现里面还有一层IP首部的目标地址是自己lo接口上的VIP,所以会处理次请求报文,并将响应报文通过lo接口送给eth0网卡直接发送给客户端。
注意:需要设置lo接口的VIP不能在共网上出现
。(a) 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP 。
(b) PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
(c) IPVS比对数据包请求的服务是否为集群服务,若是,在请求报文的首部再次封装一层IP报文,封装源IP为DIP,目标IP为RIP。然后发至POSTROUTING链。 此时源IP为DIP,目标IP为RIP
(d) POSTROUTING链根据最新封装的IP报文,将数据包发至RS(因为在外层封装多了一层IP首部,所以可以理解为此时通过隧道传输)。 此时源IP为DIP,目标IP为RIP
(e) RS接收到报文后发现是自己的IP地址,就将报文接收下来,拆除掉最外层的IP后,会发现里面还有一层IP首部,而且目标是自己的lo接口VIP,那么此时RS开始处理此请求,处理完成之后,通过lo接口送给eth0网卡,然后向外传递。 此时的源IP地址为VIP,目标IP为CIP
(f) 响应报文最终送达至客户端
原理:
基于隧道封装技术。在IP报文的外面再包一层IP报文。
当Director接收到请求的时候,选举出调度的RealServer
当接受到从Director而来的请求时,RealServer则会使用lo接口上的VIP直接响应CIP。
这样CIP请求VIP的资源,收到的也是VIP响应。
LVS-TUN的优点与缺点
优点:
- RIP,VIP,DIP都应该使用公网地址,且RS网关不指向DIP;
只接受进站请求,解决了LVS-NAT时的问题,减少负载。
请求报文经由Director调度,但是响应报文不需经由Director。
缺点:
- 不指向Director所以不支持端口映射。
- RS的OS必须支持隧道功能。
- 隧道技术会额外花费性能,增大开销。
特点:
- RIP、VIP、DIP全是公网地址
- RS的网关不会也不可能指向DIP
- 所有的请求报文经由Director Server,但响应报文必须不能进过Director Server
- 不支持端口映射
- RS的系统必须支持隧道
4.FULL-NAT模型:
四.LVS的调度算法
LVS的调度算法分为静态与动态两类。
1.静态算法(4种):只根据算法进行调度 而不考虑后端服务器的实际连接情况和负载情况
①.RR:轮询调度(Round Robin)
调度器通过”轮叫”调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。②.WRR:加权轮叫(Weight RR)
调度器通过“加权轮叫”调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。③.DH:目标地址散列调度(Destination Hash )
根据请求的目标IP地址,作为散列键(HashKey)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。④.SH:源地址 hash(Source Hash)
源地址散列”调度算法根据请求的源IP地址,作为散列键(HashKey)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
2.动态算法(6种):前端的调度器会根据后端真实服务器的实际连接情况来分配请求
①.LC:最少链接(Least Connections)
调度器通过”最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用”最小连接”调度算法可以较好地均衡负载。②.WLC:加权最少连接(默认采用的就是这种)(Weighted Least Connections)
在集群系统中的服务器性能差异较大的情况下,调度器采用“加权最少链接”调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。③.SED:最短延迟调度(Shortest Expected Delay )
在WLC基础上改进,Overhead = (ACTIVE+1)*256/加权,不再考虑非活动状态,把当前处于活动状态的数目+1来实现,数目最小的,接受下次请求,+1的目的是为了考虑加权的时候,非活动连接过多缺陷:当权限过大的时候,会倒置空闲服务器一直处于无连接状态。④.NQ永不排队/最少队列调度(Never Queue Scheduling NQ)
无需队列。如果有台 realserver的连接数=0就直接分配过去,不需要再进行sed运算,保证不会有一个主机很空间。在SED基础上无论+几,第二次一定给下一个,保证不会有一个主机不会很空闲着,不考虑非活动连接,才用NQ,SED要考虑活动状态连接,对于DNS的UDP不需要考虑非活动连接,而httpd的处于保持状态的服务就需要考虑非活动连接给服务器的压力。假如有两台RS,从vs过来两个请求,第一个给权重大的那个RS,第二个给空闲的哪个,后面的再根据负载计算进行分配,这样就保证了即使权重小也不会一直控线啦。⑤.LBLC:基于局部性的最少链接(locality-Based Least Connections)
基于局部性的最少链接”调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用“最少链接”的原则选出一个可用的服务器,将请求发送到该服务器。不过依然有个问题,假如有两台机器,一台权重为1,另一台权重为10,当地一个请求进来时,经过计算第一台为256,第二个为25.6,然后就把第一个请求给第二台服务器,第二请求过来,经过计算依然给第2台服务器,如果一次过来9个请求,都会全部给第二台主机,那么第一台就一直处于等待状态,就算能力再差也至少得处理一个请求把~所以有下面这种调度方法。⑥. LBLCR:带复制的基于局部性最少连接(Locality-Based Least Connections with Replication)
带复制的基于局部性最少链接”调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按”最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。
LVS的八种调度方法
静态方法:仅依据算法本身进行轮询调度
- RR:Round Robin,轮调
一个接一个,自上而下
- WRR:Weighted RR,加权论调
加权,手动让能者多劳。
- SH:SourceIP Hash
来自同一个IP地址的请求都将调度到同一个RealServer
- DH:Destination Hash
不管IP,请求特定的东西,都定义到同一个RS上。
动态方法:根据算法及RS的当前负载状态进行调度
LC:least connections(最小链接数)
链接最少,也就是Overhead最小就调度给谁。
假如都一样,就根据配置的RS自上而下调度。
WLC:Weighted Least Connection (加权最小连接数)
这个是LVS的默认算法。
SED:Shortest Expection Delay(最小期望延迟)
WLC算法的改进。
NQ:Never Queue
SED算法的改进。
LBLC:Locality-Based Least-Connection,基于局部的的LC算法
正向代理缓存机制。访问缓存服务器,调高缓存的命中率。
和传统DH算法比较,考虑缓存服务器负载。可以看做是DH+LC如果有两个缓存服务器 1.只要调度到其中的一个缓存服务器,那缓存服务器内就会记录下来。下一次访问同一个资源的时候也就是这个服务器了。 (DH) 2.有一个用户从来没有访问过这两个缓存服务器,那就分配到负载较小的服务器。
LBLCR:Locality-Based Least-Connection with Replication(带复制的lblc算法) 缓存服务器中的缓存可以互相复制。因为即使没有,也能立即从另外一个服务器内复制一份,并且均衡负载ipvsadm命令的用法:由于此命令的选项很多,可归纳为两类,
①管理集群服务:
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] /* -A:添加 -E:修改 -t:TCP -u:UDP -f:firewall mark service-address: -t,tcp,vip:port -u,udp,vip:port -f,fwm,mark -s scheduler:调度方法,默认是wlc */ ipvsadm -D -t|u|f service-address // -D:删除②管理集群上的RS:
ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight] /* -a:增加 -e:修改 -r server-address:RS的地址,rip[:port] -g:gateway,dr(默认) -i:ipip,tun -m:masquerade,nat */③查看
ipvsadm -L|l [options] /* -n,--numeric:数字格式显示IP和PORT --exact:精确值 -c,--connection:显示IPVS连接 --stats:统计数据 --rate:速率 */④保存和重载
#保存 ipvsadm -S > /PATH/TO/SOME_RULE_FILE ipvsadm-save > /PATH/TO/SOME_RULE_FILE #重载 ipvsadm -R < /PATH/TO/SOME_RULE_FILE ipvsadm-restore < /PATH/TO/SOME_RULE_FILE⑤清空
ipvsadm -C 清空规则 ipvsadm -Z [-t|u|f service-address] 清空计数器