• home > tools > Virtual > LVS >

    Linux Virtual Server概述:体系结构/负载均衡/负载调度/集群模式

    Author:zhoulujun Date:

    Linux Virtual Server可实现一个高性能、高可用的服务器群集,它具有良好可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的服务性能。LVS使用负载算法 平均发布请求到realserver 但是不能进行健康

    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架构说明

    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的钩子函数。

    1. 当客户端的请求到达负载均衡器的内核空间时,首先会到达PREROUTING链。

    2. 当内核发现请求数据包的目的地址是本机时,将数据包送往INPUT链。

    3. LVS由用户空间的ipvsadm和内核空间的IPVS组成,ipvsadm用来定义规则,IPVS利用ipvsadm定义的规则工作,IPVS工作在INPUT链上,当数据包到达INPUT链时,首先会被IPVS检查,如果数据包里面的目的地址及端口没有在规则里面,那么这条数据包将被放行至用户空间。

    4. 如果数据包里面的目的地址及端口在规则里面,那么这条数据报文将被修改目的地址为事先定义好的后端服务器,并送往POSTROUTING链。

    5. 最后经由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模型图示

    这里的NAT(network address Translate)模式,相当于iptables中的NAT模式,就是在director server中修改了ip包中的地址信息。

    1. 客户端将请求发往前端的负载均衡器,请求报文源地址是CIP(客户端IP),后面统称为CIP),目标地址为VIP(负载均衡器前端地址,后面统称为VIP)。

    2. 负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将客户端请求报文的目标地址改为了后端服务器的RIP地址并将报文根据算法发送出去。

    3. 报文送到Real Server后,由于报文的目标地址是自己,所以会响应该请求,并将响应报文返还给LVS。

    4. 然后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不处理响应报文了,所以性能提高很大。

    LVS DR 模式架构图

    它的连接调度和管理与VS/NAT和VS/TUN中的一样,但它的报文转发方法又有不同,VS/DR通过改写请求报文的MAC地址,将请求发送到Real Server,而Real Server将响应直接返回给客户,免去了VS/TUN中的IP隧道开销。这种方式是三种负载调度机制中性能最高最好的,但是必须要求Director Server与Real Server都有一块网卡连在同一物理网段上。

    LVS DR模型 流程图

    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累死了,有的闲死了。

    1. RR:轮叫(Round Robin):即轮询(平均呼叫)调度,也叫1:1调度,即调度算法将外部用户请求按顺序1:1的分配到集群中的每个Real Server上,这种算法平等地对待每一台Real Server,而不管服务器上实际的负载状况和连接状态。

      调度器通过”轮叫”调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。轮流分配请求。

    2. WRR:加权轮叫(Weight RR):即性能好的realserver多叫,不好的少叫。

      调度器通过“加权轮叫”调度算法根据真实服务器的不同处理能力来调度访问请求。可以对每台Real Server设置不同的调度权值,对于性能相对较好的Real Server可以设置较高的权值,而对于处理能力较弱的Real Server,可以设置较低的权值。这样可以保证处理能力强的服务器处理更多的访问流量调度器可以自动问询真实服务器的负载情况,并动态地调整其权值

    3. SH:源地址 hash(Source Hash)只要是同一个CIP来的请求,都给固定的realserver

      源地址散列”调度算法根据请求的源IP地址,作为散列键(HashKey)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

    4. 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的活动连接数和非活动连接数

    1. LC(Least Connections),最少链接:计算:active × 256 + inactive,结果最小的realserver,作为这次的目标realserver

      调度器通过”最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上如果集群系统的真实服务器具有相近的系统性能,采用”最小连接”调度算法可以较好地均衡负载

    2. WLC(Weighted Least Connections)加权LC:计算:(active × 256 + inactive)/weight,结果最小的realserver,作为这次的目标realserver。wlc被使用最多,默默认采用的就是这种

      在集群系统中的服务器性能差异较大的情况下,调度器采用“加权最少链接”调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值

    3. SED(Shortest Expected Delay ),最短期望延迟:(active+1)×256/weight,结果最小的realserver,作为这次的目标realserver

      在WLC基础上改进,Overhead = (ACTIVE+1)*256/加权,不再考虑非活动状态,把当前处于活动状态的数目+1来实现,数目最小的,接受下次请求,+1的目的是为了考虑加权的时候,非活动连接过多缺陷:当权限过大的时候,会倒置空闲服务器一直处于无连接状态。

    4. NQ(Never Queue Scheduling NQ),永不排队/最少队列调度:只要有个realsever没有被分到,就分给它一个再说。

      无需队列。如果有台 realserver的连接数=0就直接分配过去,不需要再进行sed运算,保证不会有一个主机很空间。在SED基础上无论+几,第二次一定给下一个,保证不会有一个主机不会很空闲着,不考虑非活动连接,才用NQ,SED要考虑活动状态连接,对于DNS的UDP不需要考虑非活动连接,而httpd的处于保持状态的服务就需要考虑非活动连接给服务器的压力。

    5. LBLC(locality-Based Least Connections),基于局部性的最少链接:相当于动态的dh,不考虑active数

      基于局部性的最少链接”调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用“最少链接”的原则选出一个可用的服务器,将请求发送到该服务器。

    6. 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

    上一篇:First page
    下一篇:Last page