LVS工作原理浅析

一、什么是LVS

        LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。

        LVS集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。

        为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性。

二、LVS的结构

    LVS由前端的负载均衡器(Load Balancer,LB)和后端的真实服务器(Real Server,RS)群组成。RS间可通过局域网或广域网连接。LVS的这种结构对用户是透明的,用户只能看见一台作为LB的虚拟服务器(Virtual Server),而看不到提供服务的RS群。当用户的请求发往虚拟服务器,LB根据设定的包转发策略和负载均衡调度算法将用户请求转发给RS。RS再将用户请求结果返回给用户。

LVS结构.jpg

  负载均衡器一般存在单点故障,所以我们需要在LB节点上做HA。 实现的方法有:heartbeat,keepalived


三、LVS的内核模型

        LVS由前端的负载均衡器(Load Balancer,LB)和后端的真实服务器(Real Server,RS)群组成。RS间可通过局域网或广域网连接。LVS的这种结构对用户是透明的,用户只能看见一台作为LB的虚拟服务器(Virtual Server),而看不到提供服务的RS群。当用户的请求发往虚拟服务器,LB根据设定的包转发策略和负载均衡调度算法将用户请求转发给RS。RS再将用户请求结果返回给用户。

LVS内核模型.jpg

如上图所示,客户请求报文的走向路径

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

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

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

4:如果数据包里面的目标地址及端口在规则里面,那么这条数据报文的目标地址为将被修改为事先定义的后端服务器地址,

并送往POSTROUTING链。

5:最后经由POSTROUTING链发往后端服务器


四、LVS集群的类型


Ⅰ:LVS-NAT 模型:多目标的DNAT,通过将请求报文中的目标地址和目标端口修改为挑选出的某RS的RIP和PORT实现转发;

NAT模型的特点:

(1)RIP和DIP必须在同一IP网段,且应该使用私有地址,RS的网关必须要指向DIP(保证响应报文必须经由VS)

    (2)请求报文和响应报文都经由Director转发,较高负载下,Director易于成为系统性能瓶颈。

    (3)支持端口映射;

    (4)VS必须是Linux,RS可以是任意OS;


LVS-NAT.jpg


如上图所示,客户端报文请求和响应报文走向路径;


1:客户端client将请求发往前段的负责均衡器,请求报文源IPCIP(客户端IP),目标IPVIP(负载均衡器前端地址)

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

3:报文送达Real Server后,由于报文的目标IP是自己,所以会响应请求,并讲响应报文返还给LVS

4:然后LVS将此报文的源IP修改为本机并发送给客户端。


优点:集群中的物理服务器可以使用任何支持TCP/IP操作系统,只有负载均衡器需要一个合法的IP地址。

缺点:扩展性有限。当服务器节点(普通PC服务器)增长过多时,负载均衡器将成为整个系统的瓶颈,因为所有的请求包和应答包的流向都经过负载均衡器。当服务器节点过多时,大量的数据包都交汇在负载均衡器那,速度就会变慢!




Ⅱ:LVS-DR模型

LVS-DR.jpg

1:客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。

2:负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将客户端请求报文的源MAC地址改为自己DIPMAC地址,目标MAC改为RIPMAC地址,并将此包发送给RS

3RS发现请求报文中的目标MAC是自己,就会将此次报文接收下来,处理完请求报文后,将响应报文通过lo:1接口送给eth0网卡直接发送给客户端


优点:和TUN(隧道模式)一样,负载均衡器也只是分发请求,应答包通过单独的路由方法返回给客户端。与VS-TUN相比,VS-DR这种实现方式不需要隧道结构,因此可以使用大多数操作系统做为物理服务器。

缺点:(不能说缺点,只能说是不足)要求负载均衡器的网卡必须与物理网卡在一个物理段上。



Ⅲ:LVS-TUN模型


LVS-TUN.jpg

1:客户端将请求发往前端的负载均衡器,请求报文源地址为CIP,目标地址为VIP

2:负载均衡器收到报文后,发现请求是规则里面存在的地址,那么它将在客户端请求报文的首部再封装一层IP报文,将源地址改为DIP,目标地址改为RIP,并将此包发送给RS

3RS收到请求包文后,首先会拆开第一层封装,然后发现里面还有一层IP首部的目标地址是自己的lo:1接口上的VIP ,所以会处理此请求报文,并将响应报文通过lo:1接口送给eth0网卡直接送给客户端;


优点:负载均衡器只负责将请求包分发给后端节点服务器,而RS将应答包直接发给用户。所以,减少了负载均衡器的大量数据流动,负载均衡器不再是系统的瓶颈,就能处理很巨大的请求量,这种方式,一台负载均衡器能够为很多RS进行分发。而且跑在公网上就能进行不同地域的分发。

缺点:隧道模式的RS节点需要合法IP,这种方式需要所有的服务器支持”IP Tunneling”(IP Encapsulation)协议,服务器可能只局限在部分Linux系统上。


Ⅳ:LVS-FULLNAT模型:通过同时修改请求报文的源IP地址(CIP–>DIP)和目标IP地址(VIP–>RIP)进行转发;

特点:

(1)VIP是公网地址,RIP和DIP是私网地址,且通常不在同一网络中,但需要经由路由器互通;

(2)RS收到的请求报文源IP为DIP,因此响应报文将直接响应给DIP;

(3)请求和响应报文都经由Director

(4)支持端口映射; 

五:LVS集群调度算法

    根据其调度时是否考虑后端主机的当前负载,可分为静态和动态方法两类

静态方法:只根据算法进行调度,而不考虑后端主机的实际连接情况和负载情况

(1) RR : Round Robin,  轮询/轮叫/轮调

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

    

(2) WRR:Weight RR, 加权轮询

  调度器通过“加权轮叫”调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

(3) DH: Destination Hashing, 目标地址哈希,一般应用在正向web代理(缓存), 负载均能内网用户对外部服务器的请求;

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

(4) SH:Source Hash, 源地址哈希

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

动态方法:根据算法及各RS当前的负载状态进行调度

(1).LC:最少链接(Least Connections)

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

(2).WLC:加权最少连接(默认采用的就是这种)(Weighted Least Connections)

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

(3).SED:最短延迟调度(Shortest Expected Delay )

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

(4).NQ永不排队/最少队列调度(Never Queue Scheduling NQ)

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

(5).LBLC:基于局部性的最少链接(locality-Based Least Connections)

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

(6). LBLCR:带复制的基于局部性最少连接(Locality-Based Least Connections with Replication)

  带复制的基于局部性最少链接”调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按”最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。

原创文章,作者:N25_木头钟,如若转载,请注明出处:http://www.178linux.com/61462

(1)
N25_木头钟N25_木头钟
上一篇 2016-11-29
下一篇 2016-11-29

相关推荐

  • 创建私有CA及dropbear的编译安装

    使用openssl创建私有CA 配置文件/etc/pki/tls/openssl.cnf certs           = $dir/certs         &nb…

    Linux干货 2016-09-26
  • 位置变量在Shell脚本编程中的作用

    位置变量:         如果要向一个shell脚本传递信息,可以使用位置参数完成此功能;参数相关数目传入脚本,此数目可以任意多,但只有前9个可以被访问,使用shift命令可以改变这个限制;参数从第一个开始,在第九个结束;每个访问参数前要加$符号;第一个参数为0,表示预留保存实…

    Linux干货 2016-08-15
  • 网络基础知识子网划分

    一、某公司申请到一个C 类IP 地址,但要连接6 个的子公司,最大的一个子 公司有26 台计算机,每个子公司在一个网段中,则子网掩码应设为?  根据要划分的子网数量来算子网掩码的。2的M次方大于等于N。其中M是划分子网时要借的位数。N是要划分的子网数。 将需求代入公式,M=3,C类IP默认的掩码为24位,再从主机位中借来3位,就是27位。二进制表示…

    Linux干货 2016-09-06
  • 千万不要把 bool 设计成函数参数

    我们有很多Coding Style 或 代码规范。但这一条可能会经常被我们所遗忘,就是我们经常会在函数的参数里使用bool参数,这会大大地降低代码的可读性。不信?我们先来看看下面的代码。 当你读到下面的代码,你会觉得这个代码是什么意思? widget->repaint(false); 是不要repaint吗?还是别的什么意思?看了文档后,我们才知道这个…

    Linux干货 2016-07-10
  • Linux系统压缩和解压缩工具gzip、bzip2、xz以及tar打包工具总结

    在Linux系统使用过程中,对于一些不是常用的文件,利用cpu的时间资源对文件进行压缩可以节省一定的磁盘空间,对系统中某个目录经常会有备份的需求,可以使用Linux系统中的tar打包工具实现,文件的压缩对于大量的网络文件传输可以节约带宽,同时也能降低服务器的负载,我们经常需要从网站下载软件包到本地主机,这些包基本都是打包压缩的,要想使用安装,需要我们解压缩他…

    Linux干货 2016-08-18
  • (总结)RHEL/CentOS 7.x的几点新改变

    PS:RHEL7和CentOS7出来有一段时间了,拿出点时间研究下,有几个地方跟6和5系列相比改变比较大,估计不少童鞋有点不太习惯。下面简要举例说明改变比较大的要点: 一、CentOS的Services使用了systemd来代替sysvinit管理 1、systemd的服务管理程序:systemctl是主要的工具,它融合之前service和chkconfig…

    Linux干货 2015-02-10

评论列表(1条)

  • 马哥教育
    马哥教育 2016-12-09 20:51

    最好列出一些应用的时注意 的关键点就更好了