Linux Virtual Server概述:体系结构/负载均衡/负载调度/集群模式
Author:zhoulujun Date:
Internet的快速增长使多媒体网络服务器面对的访问数量快速增加,服务器需要具备提供大量并发访问服务的能力,因此对于大负载的服务器来讲, CPU、I/O处理能力很快会成为瓶颈。由于单台服务器的性能总是有限的,简单的提高硬件性能并不能真正解决这个问题。为此,必须采用多服务器和负载均衡技术才能满足大量并发访问的需要。Linux 虚拟服务器(Linux Virtual Servers,LVS) 使用负载均衡技术将多台服务器组成一个虚拟服务器。它为适应快速增长的网络访问需求提供了一个负载能力易于扩展,而价格低廉的解决方案 。
LVS简介
LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器,准确来说是一个虚拟的服务器集群系统。可以利用LVS技术实现高可伸缩的、高可用的网络服务,例如WWW服务、Cache服务、DNS服务、FTP服务、MAIL服务、视频/音频点播服务等等,有许多比较著名网站和组织都在使用LVS架设的集群系统
LVS自从1998年开始,发展到现在已经是一个比较成熟的技术项目了。现在LVS已经是 Linux标准内核的一部分,在Linux2.4内核以前,使用LVS时必须要重新编译内核以支持LVS功能模块,但是从Linux2.4内核以后,已经完全内置了LVS的各个功能模块,无需给内核打任何补丁,可以直接使用LVS提供的各种功能。
使用LVS技术要达到的目标是:通过LVS提供的负载均衡技术和Linux操作系统实现一个高性能、高可用的服务器群集,它具有良好可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的服务性能。
为什么是LVS
高可用性:LVS是一个基于内核级别的应用软件,因此具有很高的处理性能,用LVS构架的负载均衡集群系统具有优秀的处理能力,每个服务节点的故障不会影响整个系统的正常使用,同时又实现负载的合理均衡,使应用具有超高负荷的服务能力,可支持上百万个并发连接请求。如配置百兆网卡,采用VS/TUN或VS/DR调度技术,整个集群系统的吞吐量可高达1Gbits/s;如配置千兆网卡,则系统的最大吞吐量可接近10Gbits/s。
高可靠性:LVS负载均衡集群软件已经在企业、学校等行业得到了很好的普及应用,国内外很多大型的、关键性的web站点也都采用了LVS集群软件,所以它的可靠性在实践中得到了很好的证实。有很多以LVS做的负载均衡系统,运行很长时间,从未做过重新启动。这些都说明了LVS的高稳定性和高可靠性。
适用环境:LVS对前端Director Server目前仅支持Linux和FreeBSD系统,但是支持大多数的TCP和UDP协议,支持TCP协议的应用有:HTTP,HTTPS ,FTP,SMTP,,POP3,IMAP4,PROXY,LDAP,SSMTP等等。支持UDP协议的应用有:DNS,NTP,ICP,视频、音频流播放协议等。LVS对Real Server的操作系统没有任何限制,Real Server可运行在任何支持TCP/IP的操作系统上,包括Linux,各种Unix(如FreeBSD、Sun Solaris、HP Unix等),Mac/OS和Windows等。
开源软件:LVS集群软件是由章文嵩博士发起的开源项目,按GPL(GNU Public License)许可证发行的自由软件,因此,使用者可以得到软件的源代码,并且可以根据自己的需要进行各种修改,但是修改必须是以GPL方式发行。它的官方站点是www.linuxvirtualserver.org。
LVS集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。
LVS相比于haproxy和nginx等的区别在于
LVS是传输层(OSI 7层中模型中的第4层)的负载均衡, 也就是ip和端口的负载均衡,所以性能更好,当然,也有自己的弊端,对一些应用层上的更细颗粒度的过滤就相对弱一点。
Nginx是应用层(7层中第7层) http协议的负载均衡 ,比如http协议中中的url ,浏览器缓存,cookie一些设置都可以在应用层,在第4层就无法做到。
四层和七层上的负载均衡区别:4层是在IP和端口上做负载均衡,7层是在特定的应用层协议上做负载均衡。
LVS不能和iptables一起使用,LVS是工作在内核区域的。
LVS
ipvsadm:用户区。管理集群服务的命令行工具
ipvs:在内核区
IP地址的名词解释:
CIP:客户端的IP
VIP:负载均衡机器(director)的公网IP,也就是客户端发送请求里的目标IP。
DIP:转发请求时,使用的IP
RIP:集群节点机器的IP
LVS体系结构
使用LVS架设的服务器集群系统有三个部分组成:
最前端的负载均衡层,用Load Balancer表示
中间的服务器群组层,用Server Array表示
最底端的数据共享存储层,用Shared Storage表示
在用户看来,所有的内部应用都是透明的,用户只是在使用一个虚拟服务器提供的高性能服务。
LVS体系结构如图1所示:
LVS的各个组成部分进行详细介绍:
Load Balancer层:位于整个集群系统的最前端,有一台或者多台负载调度器(Director Server)组成,LVS模块就安装在Director Server上,而Director的主要作用类似于一个路由器,它含有完成LVS功能所设定的路由表,通过这些路由表把用户的请求分发给Server Array层的应用服务器(Real Server)上。同时,在Director Server上还要安装对Real Server服务的监控模块Ldirectord,此模块用于监测各个Real Server服务的健康状况。在Real Server不可用时把它从LVS路由表中剔除,恢复时重新加入。
Server Array层:由一组实际运行应用服务的机器组成,Real Server可以是WEB服务器、MAIL服务器、FTP服务器、DNS服务器、视频服务器中的一个或者多个,每个Real Server之间通过高速的LAN或分布在各地的WAN相连接。在实际的应用中,Director Server也可以同时兼任Real Server的角色。
Shared Storage层:是为所有Real Server提供共享存储空间和内容一致性的存储区域,在物理上,一般有磁盘阵列设备组成,为了提供内容的一致性,一般可以通过NFS网络文件系统共享数据,但是NFS在繁忙的业务系统中,性能并不是很好,此时可以采用集群文件系统,例如Red hat的GFS文件系统,oracle提供的OCFS2文件系统等。
从整个LVS结构可以看出,Director Server是整个LVS的核心,目前,用于Director Server的操作系统只能是Linux和FreeBSD,linux2.6内核不用任何设置就可以支持LVS功能,而FreeBSD作为Director Server的应用还不是很多,性能也不是很好。
对于Real Server,几乎可以是所有的系统平台,Linux、windows、Solaris、AIX、BSD系列都能很好的支持。
LVS内核模型
lvs工作的内核模式中,lvs借助iptable的钩子函数。
当客户端的请求到达负载均衡器的内核空间时,首先会到达PREROUTING链。
当内核发现请求数据包的目的地址是本机时,将数据包送往INPUT链。
LVS由用户空间的ipvsadm和内核空间的IPVS组成,ipvsadm用来定义规则,IPVS利用ipvsadm定义的规则工作,IPVS工作在INPUT链上,当数据包到达INPUT链时,首先会被IPVS检查,如果数据包里面的目的地址及端口没有在规则里面,那么这条数据包将被放行至用户空间。
如果数据包里面的目的地址及端口在规则里面,那么这条数据报文将被修改目的地址为事先定义好的后端服务器,并送往POSTROUTING链。
最后经由POSTROUTING链发往后端服务器。
LVS负载均衡
负载均衡技术有很多实现方案,有基于DNS域名轮流解析的方法、有基于客户端调度访问的方法、有基于应用层系统负载的调度方法,还有基于IP地址的调度方法,在这些负载调度算法中,执行效率最高的是IP负载均衡技术。
LVS会话保持
负载均衡器上的一种机制:可以识别Client与Server之间交互过程关联性,在做负载均衡的同时,还能保证一系列相关联的访问请求被分配到同一台服务器上。
LVS在linux集群中是利用persistent(单位为秒)来设定会话保持时间,以实现持久连接。
LVS持久连接
无论在使用任何调度算法,LVS持久连接都能实现在一定时间内,将来自同一个客户端请求派发至此前选定的服务器;当一个新的客户端请求连接时,LVS就会在内存的缓冲区内记录客户端的IP以及所选的服务器,在一定时间内用户再次访问时,LVS会通过内存缓冲区来查找是否有此用户记录,如果有将直接连接到已选定的服务器上,否则记录IP及连接的服务器;这个内存缓冲区称之为持久连接模板,它存储了每一个客户端,及分配给它的RS的映射关系。
持久连接对于电子商务网站来说尤其有用,例如在SSL会话中,用户和服务器建立了SSL回话,看到一个登陆界面,第一次访问完成,接着他在登录框里填写用户名和密码,然后提交,问题可能就出现了——登陆不成功,由于没有会话保持Director又给用户分发了一个新的服务器,浏览器又会提醒用户再次输入用户名和密码。
IP负载均衡技术
LVS的IP负载均衡技术是通过IPVS模块来实现的,IPVS是LVS集群系统的核心软件,它的主要作用是:安装在Director Server上,同时在Director Server上虚拟出一个IP地址,用户必须通过这个虚拟的IP地址访问服务。这个虚拟IP一般称为LVS的VIP,即Virtual IP。访问的请求首先经过VIP到达负载调度器,然后由负载调度器从Real Server列表中选取一个服务节点响应用户的请求。
当用户的请求到达负载调度器后,调度器如何将请求发送到提供服务的Real Server节点,而Real Server节点如何返回数据给用户,是IPVS实现的重点技术,IPVS实现负载均衡机制有三种,分别是NAT、TUN和DR
LVS集群模式
LVS(linux virtual server)提供了三种集群方式(working principle and configuration instructions)
The LVS/NAT
即Virtual Server via Network Address Translation,也就是网络地址翻译技术实现虚拟服务器
当用户请求到达调度器时,调度器将请求报文的目标地址(即虚拟IP地址)改写成选定的Real Server地址,同时报文的目标端口也改成选定的Real Server的相应端口,最后将报文请求发送到选定的Real Server。在服务器端得到数据后,Real Server返回数据给用户时,需要再次经过负载调度器将报文的源地址和源端口改成虚拟IP地址和相应端口,然后把数据发送给用户,完成整个负载调度过程。
可以看出,在NAT方式下,用户请求和响应报文都必须经过Director Server地址重写,当用户请求越来越多时,调度器的处理能力将称为瓶颈。
这里的NAT(network address Translate)模式,相当于iptables中的NAT模式,就是在director server中修改了ip包中的地址信息。
客户端将请求发往前端的负载均衡器,请求报文源地址是CIP(客户端IP),后面统称为CIP),目标地址为VIP(负载均衡器前端地址,后面统称为VIP)。
负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将客户端请求报文的目标地址改为了后端服务器的RIP地址并将报文根据算法发送出去。
报文送到Real Server后,由于报文的目标地址是自己,所以会响应该请求,并将响应报文返还给LVS。
然后lvs将此报文的源地址修改为本机并发送给客户端。注意:在NAT模式中,Real Server的网关必须指向LVS,否则报文无法送达客户端。
NAT特征
集群主机必须和负载均衡主机在同一个内网了,而且DIP必须是RIP们的网关
RIP是私有IP
DIP位于CIP和RIP之间,即负责CIP过来接收请求,然后把目标IP从VIP修改为RIP,然后RIP机器处理完成后,把相应再发回DIP机器(director),然后DIP再把目标IP从RIP修改回VIP。所以director的负载很重
支持端口映射,RIP的服务的端口可以是任意的
real server可以是任意操作系统,但是director必须是Linux系统
确定director是最容易形成性能瓶颈的。最多挂10 real server
NAT的优缺点
优点 :
RS不需要公网ip,RS与外界公网是分开的
请求进出都是通过Director Server,进行地址转换,对数据统计,审计过滤等。
缺点:
数据进出都是经过DS,对DS的压力很大
The LVS/DR
即Virtual Server via Direct Routing,也就是用直接路由技术实现虚拟服务器。直接路由。被使用最多。
理由:只负责接收请求,而不负责响应,解决NAT中DS负载压力大的问题;请求报文很小,响应报文很大,director不处理响应报文了,所以性能提高很大。
它的连接调度和管理与VS/NAT和VS/TUN中的一样,但它的报文转发方法又有不同,VS/DR通过改写请求报文的MAC地址,将请求发送到Real Server,而Real Server将响应直接返回给客户,免去了VS/TUN中的IP隧道开销。这种方式是三种负载调度机制中性能最高最好的,但是必须要求Director Server与Real Server都有一块网卡连在同一物理网段上。
DR特诊
集群节点必须和director在同一个物理网络中(同一个物理网络是什么意思???)
director只负责接收请求,而不负责响应;相应报文直接发给CIP
实际过来的是,请求端IP为CIP,目标端IP为VIP。
每台RIP机器配2个IP,一个是VIP但必须是隐藏的,负责IP就会冲突了;另一个是RIP
当CIP的请求发送到了VIP,然后director不修改目标IP,所以目标IP还是VIP,它修改MAC地址,把目标IP携带的MAC地址修改为RIP的,real server处理完后,把相应报文用隐藏的VIP发送给CIP,这样一来就不用经过director了。
VIP是配置到网卡别名上,并且是隐藏的,不用于接受请求,只用于发送相应。
RIP可以使用公网IP,实现便捷的远程管理。也可以是私有IP
集群节点一定不能将网关指向DIP
director不支持端口映射
RIP机器上可以使用大多数操作系统,前提是支持IP隐藏功能。
DR模式可以带动更多的real server,至少100以上。
NAT模型所有的请求和响应都必须经过负载均衡服务器 一般响应的流量较大 请求的参数小 需要负载均衡器下载带宽无限大 负载均衡的目的在于均衡的将请求分发给目标RealServer不能因为下载的流量导致服务器带宽被占用完 。
DR模型(Direct Routing)直接路由 用户负载均衡分发到RealServer NAT也是用于该目标
DR模型 负载均衡器只需要将请求转发 RealServer响应不再经过均衡器直接由RealServer响应给客户端 由于socket长连接 客户端与负载均衡器发送的请求和响应必须是相对的 如果实现RealServer直接响应 必须在RealServer响应时将源ip修改为负载均衡器ip 同时RealServer可连接客户端 可以给RealServer一个虚拟ip 该ip和负载均衡器的外网ip一致 同时 ip不对外发送arp
DR优缺点
优点: 一个DS可以负载更多的RS
缺点:RS需要公网ip和内网ip
The LVS/TUN
即Virtual Server via IP Tunneling,也就是IP隧道技术实现虚拟服务器。可解决real server 分布在不同的国家,不同的城市的问题。
它的连接调度和管理与VS/NAT方式一样,只是它的报文转发方法不同,VS/TUN方式中,调度器采用IP隧道技术将用户请求转发到某个Real Server,而这个Real Server将直接响应用户的请求,不再经过前端调度器,此外,对Real Server的地域位置没有要求,可以和Director Server位于同一个网段,也可以是独立的一个网络。因此,在TUN方式中,调度器将只处理用户的报文请求,集群系统的吞吐量大大提高。
TUN特征
director通过隧道协议把原CIP和目标VIP作为报文发给realserver,发的时候,使用DIR-》RIP
RIP要有公网IP,realserver的OS必须支持隧道协议
其余的和DR模式一样
LVS负载调度算法
负载调度器是根据各个服务器的负载情况,动态地选择一台Real Server响应用户请求,那么动态选择是如何实现呢,其实也就是我们这里要说的负载调度算法,根据不同的网络服务需求和服务器配置。
静态调度与动态调度
LVS的调度算法分为静态与动态两类。处理活动连接与非活动连接
活动连接数(active):正在传输数据
非活动连接数(inactive):传输数据完成了,但是连接还没有断开。
静态调度(固定调度)算法:
只根据算法进行调度 而不考虑后端服务器的实际连接情况和负载情况。
调度器不管realserver的活动连接数和非活动连接数,按照事先指定好的算法调度。所以就有可能把某个realserver累死了,有的闲死了。
RR:轮叫(Round Robin):即轮询(平均呼叫)调度,也叫1:1调度,即调度算法将外部用户请求按顺序1:1的分配到集群中的每个Real Server上,这种算法平等地对待每一台Real Server,而不管服务器上实际的负载状况和连接状态。
调度器通过”轮叫”调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。轮流分配请求。
WRR:加权轮叫(Weight RR):即性能好的realserver多叫,不好的少叫。
调度器通过“加权轮叫”调度算法根据真实服务器的不同处理能力来调度访问请求。可以对每台Real Server设置不同的调度权值,对于性能相对较好的Real Server可以设置较高的权值,而对于处理能力较弱的Real Server,可以设置较低的权值。这样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
SH:源地址 hash(Source Hash):只要是同一个CIP来的请求,都给固定的realserver
源地址散列”调度算法根据请求的源IP地址,作为散列键(HashKey)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
DH:目标地址hash(Destination Hash ):和sh算法类似。用于缓存服务器集群。保证缓存命中率的提高
根据请求的目标IP地址,作为散列键(HashKey)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
SH与DH中,只要是同一个CIP来的请求,都给固定的realserver。这不就破坏了负载均衡的机制了吗,为什么会有这样的算法?
http协议是无状态的短链接,所以server处理完会给浏览器发送一个身份信息,来标识这个client,浏览器会把这个信息保存在本地的cookie中。早期cookie里有太多的敏感信息,会泄露用户的信息,所以浏览器保存了最少量的信息,变成了轻cookie,原来的信息放到了server端,存到了server的内存中,叫session。就是为了找到原来的session,才需要把同一个CIP导向到原来的real server。
如果各个节点的real server可以同步session的话,sh调度算法就没有使用的必要了。
动态调度算法:
调度器要考虑realserver的活动连接数和非活动连接数
LC(Least Connections),最少链接:计算:active × 256 + inactive,结果最小的realserver,作为这次的目标realserver
调度器通过”最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用”最小连接”调度算法可以较好地均衡负载。
WLC(Weighted Least Connections),加权LC:计算:(active × 256 + inactive)/weight,结果最小的realserver,作为这次的目标realserver。wlc被使用最多,默默认采用的就是这种。
在集群系统中的服务器性能差异较大的情况下,调度器采用“加权最少链接”调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
SED(Shortest Expected Delay ),最短期望延迟:(active+1)×256/weight,结果最小的realserver,作为这次的目标realserver
在WLC基础上改进,Overhead = (ACTIVE+1)*256/加权,不再考虑非活动状态,把当前处于活动状态的数目+1来实现,数目最小的,接受下次请求,+1的目的是为了考虑加权的时候,非活动连接过多缺陷:当权限过大的时候,会倒置空闲服务器一直处于无连接状态。
NQ(Never Queue Scheduling NQ),永不排队/最少队列调度:只要有个realsever没有被分到,就分给它一个再说。
无需队列。如果有台 realserver的连接数=0就直接分配过去,不需要再进行sed运算,保证不会有一个主机很空间。在SED基础上无论+几,第二次一定给下一个,保证不会有一个主机不会很空闲着,不考虑非活动连接,才用NQ,SED要考虑活动状态连接,对于DNS的UDP不需要考虑非活动连接,而httpd的处于保持状态的服务就需要考虑非活动连接给服务器的压力。
LBLC(locality-Based Least Connections),基于局部性的最少链接:相当于动态的dh,不考虑active数
基于局部性的最少链接”调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用“最少链接”的原则选出一个可用的服务器,将请求发送到该服务器。
LBLCR(Locality-Based Least Connections with Replication),带复制的基于局部性最少连接:考虑active数
带复制的基于局部性最少链接”调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按”最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。
LVS缺点
LVS使用负载算法 平均发布请求到realserver 但是不能进行健康检查 比如 rs1出现故障 director仍然会转发到rs1 所以必须结合keepalived,需使用keepalived结合lvs检查rs故障,如果网站应用比较庞大,LVS/DR+Keepalived就比较复杂了,特别是后面有WindowsServer应用的机器,实施及配置还有维护过程就比较麻烦,相对而言Nginx/HAProxy+Keepalived就简单多了。
软件本身不支持正则处理,不能做动静分离,这就凸显了Nginx/HAProxy+Keepalived的优势。
参考文章:
Linux负载均衡软件LVS之一(概念篇) https://blog.51cto.com/ixdba/552947
虚拟机搭建LVS-DR集群 https://blog.csdn.net/liaomin416100569/article/details/73472400
cluster集群基本概念 https://www.cnblogs.com/xiaoshiwang/p/11592248.html
转载本站文章《Linux Virtual Server概述:体系结构/负载均衡/负载调度/集群模式》,
请注明出处:https://www.zhoulujun.cn/html/tools/Virtual/LVS/8360.html