深入理解Linux负载均衡LVS

一、LVS负载均衡

负载均衡集群是Load Balance 集群的缩写,翻译成中文就是负载均衡集群。常用的负载均衡开源软件有Nginx、LVS、Haproxy,商业的硬件负载均衡设备有F5、Netscale等。

二、负载均衡LVS基本介绍

LB集群的架构和原理很简单,就是当用户的请求过来时,会直接分发到Director Server上,然后它把用户的请求根据设置好的调度算法,智能均衡的分发后端真正服务器(real server)上。为了避免不同机器上用户请求的数据不一样,需要用到了共享存储,这样保证所有用户请求的数据是一样的。

这是由章文嵩博士发起的一个开源项目,官网:http://www.linuxvirtualserver.org现在LVS已经是 Linux 内核标准的一部分。使用 LVS 可以达到的技术目标是:通过 LVS 达到的负载均衡技术和 Linux 操作系统实现一个高性能高可用的 Linux 服务集群,它具有良好的可靠性、可扩展性和可操作性。从而以廉价的成本实现最优的性能。 

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

三、LVS的体系架构

负载均衡的原理很简单,就是当客户端发起请求时,请求直接发给Director Server(调度器),这时会根据设定的调度算法,将请求按照算法的规定智能的分发到真正的后台服务器。以达到将压力均摊。但是我们知道,http的连接时无状态的,假设这样一个场景,我登录某宝买东西,当我看上某款商品时,我将它加入购物车,但是我刷新了一下页面,这时由于负载均衡的原因,调度器又选了新的一台服务器为我提供服务,我刚才的购物车内容全都不见了,这样就会有十分差的用户体验。所以就还需要一个存储共享,这样就保证了用户请求的数据是一样的。所以LVS负载均衡分为三层架构(也就是LVS负载均衡主要组成部分):

如图:

LVS的各个层次的详细介绍:

3.1、Load Balancer层

位于整个集群系统的最前端,有一台或者多台负载调度器(Director Server)组成,LVS模块就是安装在Director Server上,而Director的主要作用类似于一个路由器,它含有完成LVS功能所设定的路由表,通过这些路由表把用户的请求分发给Server Array层的应用服务器(Real Server)上。同时,在Director Server上还要安装队Real Server服务的监控模块Ldirectord,此模块用于检测各个Real Server服务的健康状况。在Real Server不可用时把它从 LVS 路由表中剔除,恢复时重新加入。

3.2、Server Arrary层

由一组实际运行应用服务的机器组成,Real Server可以是WEB 服务器、MALL服务器、FTP服务器、DNS服务器、等等,每个Real Server 之间通过高速的LAN或分布在各地的WAN相连接,在实际的应用中,Director Server也可以同时兼任Real Server的角色。

3.3、Shared Storage层

是为所有Real Server提供共享存储空间和内容一致性的存储区域,在物理上,一般有磁盘阵列设备组成,为了提供内容的一致性,一般可以通过NFS网络文件系统共享数据,但是NFS在繁忙的业务系统中,性能并不是很好,此时可以采用集群文件系统,列如Red hat的GFS文件系统等等。一个公司得有一个后台账目吧,这才能协调。不然客户把钱付给了A,而换B接待客户,因为没有相同的账目。B说客户没付钱,那这样就不是客户体验度的问题了。

四、LVS的实现原理

(1)当用户负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间

(2)PREROUTING 链首先会接受到用户请求,判断目标IP确实是本地IP,将数据包发往 INPUT 链

(3)IPVS 是工作在 INPUT 链上的,当用户请求到达INPUT时,IPVS 会将用户请求和自己定义好的集群服务进行比对,如果用户请求的就是集群服务,那么此时 IPVS 会强行修改数据包里的目标IP地址和端口,并将新的数据包发往 POSTROUTING 链

(4)POSTROUTING 链将收到数据包后发现目标IP地址刚好是自己的后端服务器,那么此时通过选路,将数据包最终发送给后端的服务器

五、LVS的工作原理

LVS 的工作模式分为4中分别是 NAT,DR,TUN,FULL-NAT。其中做个比较,由于工作原理的关系的,NAT的配置最为简单,但是NAT对调度器的压力太大了,导致其效率最低,DR和TUN的工作原理差不多,但是DR中,所有主机必须处于同一个物理环境中,而在TUN中,所有主机可以分布在不同的位置,服务器一个在纽约,一个在深圳。最多应用的是FULL-NAT。

六、LVS相关术语

(1)DS:Director Server  指的是前端负载均衡器节点。

(2)RS:Real Server  后端真实的工作服务器。

(3)VIP:向外部直接面向用户请求,作为用户请求的目标的ip地址。

(4)DIP:Director Server IP  主要用于和内部服务器通讯的ip地址。

(5)RIP:Real Server IP  后端服务器的ip地址。

(6)CIP:Client IP    访问客户端的IP地址。

七、NAT 模式-网络地址转换

这个是通过网络地址转换的方法来实现调度的。首先调度器(LB)接收到客户的请求数据包时(请求的目的IP为VIP),根据调度算法决定将请求发送给哪个后端的真实服务器(RS)。然后调度就把客户端发送的请求数据包的目标IP地址及端口改成后端真实服务器的IP地址(RIP),这样真实服务器(RS)就能够接收到客户的请求数据包了。真实服务器响应完请求后,查看默认路由(NAT模式下我们需要把RS的默认路由设置为LB服务器。)把响应后的数据包发送给LB,LB再接收到响应包后,把包的源地址改成虚拟地址(VIP)然后发送回给客户端。

VS/NAT是一种最简单的方式,所有的RealServer只需要将自己的网关指向Director即可。客户端可以是任意操作系统,但此方式下,一个Director能够带动的RealServer比较有限。在VS/NAT的方式下,Director也可以兼为一台RealServer。VS/NAT的体系结构如图所示。

八、NAT 模式工作原理

(1)当用户请求到达Director Server,此时的请求数据报文会先到内核空间的PREROUTING链。此时报文的源IP为 CIP,目标IP为 VIP。

(2)PREROUTING检查发现数据包的目标IP 是本机,将数据包发送至INPUT链。

(3)IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,然后将数据包发送至POSTROUTING链。此时报文的源IP为 CIP,目标IP为RIP。

(4)POSTROUTING链通过选路,将数据包发送给Real Server。

(5)Real Server对比发现目标为自己的IP,开始构建响应报文发回给Director Server。此时报文的源IP为 RIP,目标IP为 CIP。

(6)Director Server在响应客户端前,此时会将源IP地址修改为自己的VIP地址,然后响应给客户端。此时报文的源IP为 VIP,目标IP为CIP。

九、DR 模式-直接路由模式

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

Director和RealServer必需在物理上有一个网卡通过不间断的局域网相连。 RealServer上绑定的VIP配置在各自Non-ARP的网络设备上(如lo或tunl),Director的VIP地址对外可见,而RealServer的VIP对外是不可见的。RealServer的地址即可以是内部地址,也可以是真实地址。

DR模式是通过改写请求报文的目标MAC地址,将请求发给真实服务器的,而真实服务器响应后的处理结果直接返回给客户端用户。同TUN模式一样,DR模式可以极大的提高集群系统的伸缩性。而且DR模式没有IP隧道的开销,对集群中的真实服务器也没有必要必须支持IP隧道协议的要求。但是要求调度器LB与真实服务器RS都有一块网卡连接到同一物理网段上,必须在同一个局域网环境。

9.1、DR 模式工作原理图

(1)首先用户用CIP请求VIP。

(2)根据上图可以看到,不管是Director Server 还是Real Server 上都需要配置相同的VIP,那么当用户请求到达我们的集群网络的前端路由器的时候,请求数据包的源地址为CIP,目标地址为VIP;此时路由器还会发广播问谁是VIP,那么我们集群中所有的节点都配置有VIP,此时谁先响应路由器那么路由器就会将用户请求发给谁,这样一来我们的集群系统是不是没有意义了,那我们可以在网关路由器上配置静态路由指定VIP就是Director Server,或者使用一种机制不让Real Server 接受来自网络中的ARP 地址解析请求,这样一来用户的请求包都会经过Director Server。

(3)当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链,此时报文的源IP为CIP,目标IP为VIP。

(4)PREROUTING检查发现数据包的目标IP为本机,将数据包发送至INPUT链。

(5)IPVS对比数据包请求的服务是否为集群服务,若是,将请求报文中的源MAC地址修改DIP的MAC地址,将目标MAC地址修改为RIP的MAC地址,然后将数据包发至POSTROUTING链,此时的源IP和目标IP均未修改,仅修改了源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址。

(6)由于DS和RS在同一个网络中,所以是通过二层来传输,POSTROUTING链检查目标MAC地址为RIP的MAC地址,那么此时数据包将会发至Real Server。

(7)RS发现请求报文的MAC地址是自己的MAC地址,就接收报文。处理完成之后,将相应报文通过lo接口传送给eth0网卡然后向外发出。此时的源IP地址为VIP,目标IP为CIP。

(8)响应报文最终送达至客户端。

配置DR的三种方式:

  • 第一种:在路由器上明显说明vip对应的地址一定是Director上的MAC,只要绑定,以后再跟vip通信也不用再请求了,这个绑定是静态的,所以它也不会失效,也不会再次发起请求,但是有个前提,我们的路由设备必须有操作权限才能够绑定MAC地址,万一这个路由器是运营商操作的,我们没法操作怎么办?第一种方式固然很简单,但未必可行。
  • 第二种:在个别主机上(列如:红帽)它们引进的有一种程序arptables,它有点类似iptables,它肯定是基于arp或者MAC做访问控制的,很显然我们只需要在每一个Real Server上定义arptables规则,如果用户arp广播请求的目标地址是本机的vip则不予响应,或者说响应的报文不让出去,很显然(gateway)是接收不到的,也就是director响应的报文才能到达gateway,这个也行。第二种方式我们可以基于arptables。
  • 第三种:在相对较新的版本中新增了两个内核参数(kernelparameter),第一个是arp_ignore定义接受到ARP请求时的响应级别;第二个是arp_announce定义将自己地址向外通告时的通告级别。[提示:很显然我们现在的系统一般在内核中都是支持这些参数的,我们用参数的方式进行调整更具有朴实性,它还不依赖额外的条件,像arptables,也不依赖外在路由配置的设置,反而通常我们使用的是第三种配置方式

arp_ignore:定义接收到ARP请求时的响应级别

0:只要本地设置的有相应的地址,就给予响应。(默认)

1:仅回应目标IP地址是本地的入网地址的arp请求。

2:仅回应目标IP地址是本地的入网地址,而且源IP和目标IP在同一个子网的arp请求。

3:不回应网络界面的arp请求,而只对设置的唯一和连接地址做出回应。

4-7:保留未使用。

8:不回应所有的arp请求。

arp_announce:定义将自己地址向外通告的通告级别:

0:将本地任何接口上的任何地址向外通告。

1:视图仅向目标网络通告与其网络匹配的地址。

2:仅向与本地接口上地址匹配的网络进行通告。

9.2、DR模式的特性

  • 保证前端路由将目标地址为VIP报文统统发给Director Server,而不是RS。
  • Director和RS的VIP为同一个VIP。
  • RS可以使用私有地址,也可以是公网地址,如果使用公网地址,此时可以通过互联网对RIP进行直接访问。
  • RS跟Director Server必须在同一个物理网络中。
  • 所有的请求报文经由Director Server,但响应报文必须不能经过Director Server。
  • 不支持地址转换,也不支持端口转换。
  • RS 可以是大多数常见的操作系统。
  • RS 的网关绝不允许指向DIP(因为我们不允许它经过Director)
  • RS上的lo接口配置VIP的ip地址
  • DR模式是市面上用得最广的。
  • 缺陷:RS和DS必须在同一机房。

十、Tunnel 模式

10.1、Tunnel 模式工作原理

(1)当用户请求到达Director Server,此时请求的数据报文会先拿到内核空间的PREROUTING链,此时报文的源IP为CIP,目标IP为VIP。

(2)PREROUTING检查发现数据包的目标IP是本机,将数据包发送至INPUT链。

(3)IPVS对比数据包请求的服务是否为集群服务,若是,在请求报文的首部再次封装一层IP报文,封装源IP为DIP,目标IP为RIP。然后发至POSTROUTING链,此时源IP为DIP,目标IP为RIP。

(4)POSTROUTING链根据最新封装的IP报文,将数据包发送至RS(因为在外层多封装了一层IP首部,所以可以理解为 此时通过隧道传输)。此时源IP为DIP,目标IP为RIP。

(5)RS接收到报文后发现是自己的IP地址,就将报文接收下来,拆除掉最外层的IP后,会发现里面还有一层IP首部,而且目标是自己的lo接口VIP,那么此时RS开始处理请求,处理完成之后,通过lo接口发送给eth0网卡,然后向外传递。此时源IP为VIP,目标IP为CIP。

(6)响应报文最终送达至客户端。

10.2、Tunnel模式的特性

  • RIP、VIP、DIP全是公网地址。
  • RS的网关不会也不可能指向DIP。
  • 所有的请求报文经由Director Server,但响应报文必须不能经过Director Server。
  • 不支持端口映射。
  • RS的系统必须支持隧道。

十一、LVS 的调度算法

固定调度算法:rr,wrr,dh,sh

动态调度算法:wlc,lc,lblc,lblcr

固定调度算法:即调度器不会去判断后端服务器的繁忙与否,一如既往得将请求派发下去。

动态调度算法:调度器会去判断后端服务器的繁忙程度,然后依据调度算法动态得派发请求。

11.1、rr:轮询(round robin)

这种算法是最简单的,就是按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是简单。轮询算法假设所有的服务器处理请求的能力都是一样的,调度器会将所有的请求平均分配给每个真实服务器,不管后端 RS 配置和处理能力,非常均衡地分发下去。这个调度的缺点是,不管后端服务器的繁忙程度是怎样的,调度器都会讲请求依次发下去。如果A服务器上的请求很快请求完了,而B服务器的请求一直持续着,将会导致B服务器一直很忙,而A很闲,这样便没起到均衡的左右。

11.2、wrr:加权轮询(weight round robin)

这种算法比 rr 的算法多了一个权重的概念,可以给 RS 设置权重,权重越高,那么分发的请求数越多,权重的取值范围 0 – 100。主要是对rr算法的一种优化和补充, LVS 会考虑每台服务器的性能,并给每台服务器添加要给权值,如果服务器A的权值为1,服务器B的权值为2,则调度到服务器B的请求会是服务器A的2倍。权值越高的服务器,处理的请求越多。

11.3、dh:目标地址散列调度算法 (destination hash)

简单的说,即将同一类型的请求分配给同一个后端服务器,例如将以 .jgp、.jpg等结尾的请求转发到同一个节点。这种算法其实不是为了真正意义的负载均衡,而是为了资源的分类管理。这种调度算法主要应用在使用了缓存节点的系统中,提高缓存的命中率。

11.4、sh:源地址散列调度算法(source hash)

即将来自同一个ip的请求发给后端的同一个服务器,如果后端服务器工作正常没有超负荷的话。这可以解决session共享的问题,但是这里有个问题,很多企业、社区、学校都是共用的一个IP,这将导致请求分配的不均衡。

11.5、lc:最少连接数(least-connection)

这个算法会根据后端 RS 的连接数来决定把请求分发给谁,比如 RS1 连接数比 RS2 连接数少,那么请求就优先发给 RS1。这里问题是无法做到会话保持,即session共享。

11.6、wlc:加权最少连接数(weight least-connection)

这个比最少连接数多了一个加权的概念,即在最少连接数的基础上加一个权重值,当连接数相近,权重值越大,越优先被分派请求。

11.7、lblc:基于局部性的最少连接调度算法(locality-based least-connection)

将来自同一目的地址的请求分配给同一台RS如果这台服务器尚未满负荷,否则分配给连接数最小的RS,并以它为下一次分配的首先考虑。

以上就是深入理解Linux负载均衡LVS的详细内容,更多关于Linux 负载均衡 LVS的资料请关注我们其它相关文章!

(0)

相关推荐

  • LVS(Linux Virtual Server)Linux 虚拟服务器介绍及配置(负载均衡系统)

    一,简介 LVS(Linux Virtual Server) 是Unix-like系统中的一个虚拟服务器,是国内贡献给开源组织的一个最优秀的项目之一.LVS在Unix-like系统中 是作为一个前端(Director)存在的,又称为调度器,它本身不提供任何的服务,只是将通过互联网进来的请求接受后再转发给后台运行的真正的 服务器(RealServer)进行处理,然后响应给客户端. LVS有两个重要的组件:一个是IPVS,一个是IPVSADM.ipvs是LVS的核心组件,它本身只是一个框架,类似于i

  • LVS+Keepalived构建高可用负载均衡配置方法(配置篇)

    一. LVS简介    LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,它的官方站点是www.linuxvirtualserver.org.现在LVS已经是 Linux标准内核的一部分,在Linux2.4内核以前,使用LVS时必须要重新编译内核以支持LVS功能模块,但是从Linux2.4内核以后,已经完全内置了LVS的各个功能模块,无需给内核打任何补丁,可以直接使用LVS提供的各种功能.使用LVS技术要达到的目标是:通过

  • Red Hat Linux,Apache2.0+Weblogic9.2负载均衡集群安装配置

    ************************************************************************************************************************ JDK安装步骤 1. 以root身份登录系统 2. 到java.sun.com去下载JDK1.5 for LINUX的rpm,是个jdk-1_5_0_11-linux-i586-rpm.bin的文件. 3. 通过chmod +x jdk-1_5_x-rc-l

  • linux服务器之LVS、Nginx和HAProxy负载均衡器对比总结

    LVS特点: 1.抗负载能力强,使用IP负载均衡技术,只做分发,所以LVS本身并没有多少流量产生: 2.稳定性.可靠性好,自身有完美的热备方案:(如:LVS+Keepalived) 3.应用范围比较广,可以对所有应用做负载均衡: 4.不支持正则处理,不能做动静分离. 常用四种算法: 1.rr:轮叫,轮流分配到后端服务器: 2.wrr:权重轮叫,根据后端服务器负载情况来分配: 3.lc:最小连接,分配已建立连接最少的服务器上: 4.wlc:权重最小连接,根据后端服务器处理能力来分配. 可以采用ip

  • Linux 系统 nginx 服务器安装及负载均衡配置详解

    nginx(engine x) 是一个 高性能 的 HTTP 和 反向代理 服务器.邮件代理服务器以及通用的 TCP/UDP 代理服务器.其特点为轻量级(占用系统资源少).稳定性好.可扩展性(模块化结构).并发能力强.配置简单等. 本文主要介绍在测试环境中通过 nginx 实现基本的 负载均衡 功能. nginx 可以提供 HTTP 服务,包括处理静态文件,支持 SSL 和 TLS SNI.GZIP 网页压缩.虚拟主机.URL 重写等功能,可以搭配 FastCGI.uwsgi 等程序处理动态请求

  • linux负载均衡总结性说明 四层负载和七层负载有什么区别

    在常规运维工作中,经常会运用到负载均衡服务.负载均衡分为四层负载和七层负载,那么这两者之间有什么不同? 废话不多说,详解如下: 一.什么是负载均衡 1)负载均衡(Load Balance)建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽.增加吞吐量.加强网络数据处理能力.提高网络的灵活性和可用性.负载均衡有两方面的含义:首先,大量的并发访问或数据流量分担到多台节点设备上分别处理,减少用户等待响应的时间:其次,单个重负载的运算分担到多台节点设备上做并行处理,每个节点

  • linux下nginx负载均衡搭建的方法步骤

    首先先了解下负载均衡,假设一个场景,如果有1000个客户同时访问你服务器时,而你只有一台服务器的Nginx,且只有一个MySQL服务器,那么这些请求 可能会高出你的的服务器承受能力,就会down掉: 解决方法: 1.垂直升级:就是增加服务器的配置,CPU,内存等 2.水平升级:添加多台服务器来分担服务器压力 常见的负载均衡器 根据工作在的协议层划分可划分为: 四层负载均衡:根据请求报文中的目标地址和端口进行调度 七层负载均衡:根据请求报文的内容进行调度,这种调度属于「代理」的方式 根据软硬件划分

  • LVS+Keepalived构建高可用负载均衡(测试篇)

    一. 启动LVS高可用集群服务 首先,启动每个real server节点的服务: [root@localhost ~]# /etc/init.d/lvsrs start start LVS of REALServer 然后,分别在主备Director Server启动Keepalived服务: [root@DR1 ~]#/etc/init.d/Keepalived start [root@DR1 ~]#/ ipvsadm -L IP Virtual Server version 1.2.1 (s

  • linux下Nginx+Tomcat负载均衡配置方法

    Nginx+tomcat是目前主流的java web架构,如何让nginx+tomcat同时工作呢,也可以说如何使用nginx来反向代理tomcat后端均衡呢?直接安装配置如下: 1.JAVA JDK安装: #下载相应的jdk软件包,然后解压安装,我这里包名称为:jdk-7u25-linux-x64.tar.gz tar -xzf jdk-7u25-linux-x64.tar.gz ;mkdir -p /usr/java/ ;mv jdk1.7.0_25/ /usr/java/ 下. #然后配置

  • 使用nginx来负载均衡 本文在window与linux下配置nginx实现负载

    实现网站负载有两种办法,一种是购买硬件来实现,比如是硬件F5再到Citrix Netscalar,这些设备都几十万,不是一般人玩的,另一种是使用软件来实现,比如nginx,squid这类有反向代理功能的软件,本文就nginx安装实现负载. 首先是windows系统,这里建议使用window 2003企业版,而不要作用win7(太新了,我遇到无法启动nginx的问题).要说的是,在windows下配置安装nginx还是很容易的,少了 linux下下载tar再配置编译参数等等步骤,我们只要从下面的地

随机推荐