LVS三种模式

LVS

一、LVS简介

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

二、LVS的分类

LVS-NAT:地址转换

LVS-DR: 直接路由

LVS-TUN:隧道

三、ipvsadm用法

其实LVS的本身跟iptables很相似,而且连命令的使用格式都很相似,其实LVS是根据iptables的框架开发的,那么LVS的本身分成了两个部分,第一部分是工作在内核空间的一个IPVS的模块,其实LVS的功能都是IPVS模块实现的,,第二部分是工作在用户空间的一个用来定义集群服务的一个工具ipvsadm, 这个工具的主要作用是将管理员定义的集群服务列表传送给工作在内核空间中的IPVS模块,下面来简单的介绍下ipvsadm命令的用法

ipvsadm组件定义规则的格式:

1.定义集群服务格式:

(1).添加集群服务:

ipvsadm -A|E -t|u|f service-address [-s scheduler]

[-p [timeout]] [-M netmask]

-A: 表示添加一个新的集群服务

-E: 编辑一个集群服务

-t: 表示tcp协议

-u: 表示udp协议

-f: 表示firewall-Mark,防火墙标记

service-address: 集群服务的IP地址,即VIP

-s 指定调度算法

-p 持久连接时长,如#ipvsadm -Lcn ,查看持久连接状态

-M 定义掩码

ipvsadm -D -t|u|f service-address 删除一个集群服务

ipvsadm -C 清空所有的规则

ipvsadm -R 重新载入规则

ipvsadm -S [-n] 保存规则

2.向集群服务添加RealServer规则:

(1).添加RealServer规则

ipvsadm -a|e -t|u|f service-address -r server-address

[-g|i|m] [-w weight]

-a 添加一个新的realserver规则

-e 编辑realserver规则

-t tcp协议

-u udp协议

-f firewall-Mark,防火墙标记

service-address realserver的IP地址

-g 表示定义为LVS-DR模型

-i 表示定义为LVS-TUN模型

-m 表示定义为LVS-NAT模型

-w 定义权重,后面跟具体的权值

ipvsadm -d -t|u|f service-address -r server-address –删除一个realserver

ipvsadm -L|l [options] –查看定义的规则

如:#ipvsadm -L -n

ipvsadm -Z [-t|u|f service-address] –清空计数器

四、lvs的10种调度算法

可以分为两大类

LVS Scheduling Method LVS的调度方法:

1.Fixed Scheduling Method 静态调服方法

(1).RR 轮询

(2).WRR 加权轮询

(3).DH 目标地址hash

(4).SH 源地址hash

2.Dynamic Scheduling Method 动态调服方法

(1).LC 最少连接

(2).WLC 加权最少连接

(3).SED 最少期望延迟

(4).NQ 从不排队调度方法

(5).LBLC 基于本地的最少连接

(6).LBLCR 带复制的基于本地的最少连接

五、相关服务和专有名词定义

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地址。

LVS-NAT

  1. 架构平台环境

系统平台:CentOS 6.4 64bit 内核:2.6.32

二、LVS-NAT架构

http://s3.51cto.com/wyfs02/M01/48/BA/wKioL1QLF4zxkkT8AAXJtlkKfIc596.jpg

三、LVS-NAT模型实现负载均衡的工作方式

NAT模型其实就是通过网络地址转换来实现负载均衡的,它的工作方式几乎跟DNAT一模一样的,目前的DNAT只能转发到一个目标地址,早期的DNAT是可以将请求转发到多个目标的,在LVS出现之后就将此功能从DNAT种去掉了,下面来说说NAT模型的工作方式或者说NAT模型是怎么实现负载均衡的,根据上图,

1.用户请求VIP(也可以说是CIP请求VIP)

2,Director Server 收到用户的请求后,发现源地址为CIP请求的目标地址为VIP,那么Director Server会认为用户请求的是一个集群服务,那么Director Server 会根据此前设定好的调度算法将用户请求负载给某台Real Server ;假如说此时Director Server 根据调度算法的结果会将请求分摊到RealServer1上去,那么Director Server 会将用户的请求报文中的目标地址,从原来的VIP改为RealServer1的IP,然后再转发给RealServer1

3,此时RealServer1收到一个源地址为CIP目标地址为自己的请求,那么RealServer1处理好请求后会将一个源地址为自己目标地址为CIP的数据包通过Director Server 发出去,

4.当Driector Server收到一个源地址为RealServer1 的IP 目标地址为CIP的数据包,此时Driector Server 会将源地址修改为VIP,然后再将数据包发送给用户,

四、LVS-NAT的性能瓶颈

在LVS/NAT的集群系统中,请求和响应的数据报文都需要通过负载调度器(Director),当真实服务器(RealServer)的数目在10台和20台之间时,负载调度器(Director)将成为整个集群系统的新瓶颈。大多数Internet服务都有这样的特点:请求报文较短而响应报文往往包含大量的数据。如果能将请求和响应分开处理,即在负载调度器(Director)中只负责调度请求而响应直接(RealServer)返回给客户,将极大地提高整个集群系统的吞吐量。

简单说明:

lvs-nat:

多目标的DNAT:通过将请求报文的目标地址和目标端口修改为挑选出某RS的RIP和PORT来实现;

(1) RIP和DIP应该使用私网地址,RS的网状应该指向DIP;

(2) 请求和响应报文都要经由director转发;极高负载的场景中,Director可能会成为系统瓶颈;

(3) 支持端口映射;

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

(5) RS的RIP与Director的DIP必须在同一IP网络;

 

 

LVS-DR

一、LVS-DR架构

http://s3.51cto.com/wyfs02/M02/48/BE/wKioL1QLQFziBAF-AAYp7vxkqd0554.jpg

二、DR模型实现负载均衡的工作方式,

上面说了NAT模型的实现方式,那么NAT模型有个缺陷,因为进出的每个数据包都要经过Director Server,当集群系统负载过大的时候Director Server将会成为整个集群系统的瓶颈,那么DR模型就避免了这样的情况发生,DR模型在只有请求的时候才会经过Director Server, 回应的数据包由Real Server 直接响应用户不需要经过Director Server,其实三种模型中最常用的也就是DR模型了,下面来说DR模型具体是怎么实现负载均衡的,根据上图,

1, 首先用户用CIP请求VIP,

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

3,当Director Server收到用户的请求后根据此前设定好的调度算法结果来确定将请求负载到某台Real Server上去,假如说此时根据调度算法的结果,会将请求负载到Real Server 1上面去,此时Director Server 会将数据帧中的目标MAC地址修改为Real Server1的MAC地址,然后再将数据帧发送出去,

4,当Real Server1 收到一个源地址为CIP目标地址为VIP的数据包时,Real Server1发现目标地址为VIP,而VIP是自己,于是接受数据包并给予处理,当Real Server1处理完请求后,会将一个源地址为VIP目标地址为CIP的数据包发出去,此时的响应请求就不会再经过Director Server了,而是直接响应给用户

编辑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:仅在请求的目标地址配置请求到达的接口上的时候,才给予响应

2:只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内

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

4-7:保留未使用

8:不回应所有(本地地址)的arp查询

 

arp_ignore

设置为1,当别人的arp请求过来的时候,如果接收的设备上面没有这个ip,就不响应,默认是0,只要这台机器上面任何一个设备上面有这个ip,就响应arp请求,并发送MAC地址应答。

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

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

1:试图仅想目标网络通告与其网络匹配的地址

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

 

补充LVS-DR原理……

所有的Director和RealServer都在同一个物理网络中(交换机)并且都只有一块网卡,交换机前面有个路由器,这个路由器可能是我们机房内部的,也有可能是网络运行商的。

 

当客户端的请求被送到R2和Switch之间的时候,这个时候源ip是cip,目标地址是vip。vip一定在Director上是毋庸置疑的,所以这个报文就背送到Director的vip网卡上。

当客户端的请求被送到Switch和Director之间的时候,这个时候源ip仍然是cip,目标地址是vip。Director发现当前本机配置的有vip地址,所以请求的一定是当前主机

所以报文经过Prerouting链到达Input链,而监控在Input链上的ipvs规则发现请求的是一个集群服务,比如监听在80端口的web集群服务。这个时候lvs要根据ipvs规则

等等要修改报文了,在LVS-DR模型下报文送到Director上的时候,Director不会拆它的IP首部,也不会拆它的TCP首部,Director只要将MAC地址或者帧首部拆掉了。

为什么Director要拆开帧首部MAC地址呢?因为报文的目的地址就是Director本地主机,只要到达目的主机,网卡就会拆开帧首部的。因为目标MAC就是本地主机。

拆掉帧首部以后,查看IP首部和TCP首部,它发现请求的报文访问的是一个集群服务。

因此为了实现LVS-DR模型的效果,在源有的IP首部之上(切记源IP、目标IP、源端口、目标端口等等没有动),仅仅是在原有的报文外面又重新封装了一个MAC地址帧首部

帧首部有源MAC和目标MAC,这个时候发送的主机是Director。于是Director把本地网卡的MAC地址作为整个报文的源MAC地址,而目的MAC就是选择的后端某台RealServer

[选择后端的某台RealServe是Director根据它的一些调度算法(rr,wrr…)选择的]。假如选择的是RealServer2,那么会找到RealServer2 IP对应的MAC地址,于是找到了

RealServer2网卡对应的MAC地址,它是通过ARP地址解析找到的RealServer2对应的MAC地址。

那么Director到RealServer2之间的报文传送是源MAC地址是Director网卡对应的MAC地址,目标MAC地址是RealServer2网卡对应的MAC地址。

RealServer2接收到报文以后,发现请求的报文真的是自已,于是拆掉了MAC的帧首部,拆掉后发现请求的报文源地址是cip,目标地址是VIP。如果RealServer2上没有VIP

,那么RealServer2是不会接受这个报文的,因此必须在每个RealServer上配置VIP地址。因为RealServer2上有VIP地址,报文被接收下来,拆掉了IP首部,发现了报文

请求的是一个服务,比如80 因为传输层没有做任何修改,用户请求的是80服务,那么RealServer2接收到的报文也是请求的80服务。如果RealServer2上有80服务,于是

RealServer2把这个请求转交给用户空间的进程,由用户空间处理完成后,向外响应的。而请求报文的源地址是CIP,目标地址是VIP。那么尽可能让它使用CIP是目标地址

VIP是源地址,于是这个响应报文直接被发送到了交换机上。

 

当RealServer2响应报文到达Switch的时候,这个时候源地址是VIP,目标地址是CIP。

因为目标地址是CIP,假如VIP和CIP不在同一个网段当中,这个时候要根据目标地址CIP做路由选择,比如默认路由,网关才能响应CIP的报文请求

大家都知道目标地址CIP是互联网地址,那么每个RealServer的网关要指向哪呢??????

要指向能够访问互联网的设备,不应该指向Director的DIP地址。而是直接指向了能够访问互联网的路由设备。所有(很有可能)指向的是R2路由的私有地址做网关。

为什么是很有可能而不是说一定呢????

 

 

当报文被送到Switch和R2的时候,这个时候的源地址是VIP,目标地址是CIP。那么这个时候报文被送到R2网关的时候,R2发现目标地址是互联网的地址CIP,它会通过

路由NAT然后被送到CIP上的。

 

 

 

这里要考虑一个问题,为了实现每台RealServer在向外发送响应报文的时候,可以把VIP作为源地址,因此我们在每台RealServer上配置了VIP地址。

 

假如客户端发送请求报文被送到R2路由器的时候,那么R2路由器会拆开客户端的请求报文发现源地址是CIP,目标地址是VIP;无论是将请求送给Director还是RealServer,必须要根据

MAC地址向内转发,因为在同一网段,那么它怎么知道VIP对应的MAC地址是什么呢????

那么将进行广播说:‘我知道有一个家伙的VIP地址,那么请告诉我它对应的MAC地址’,那么它发送的广播请求,同一网段的所有主机都能收到,于是配置有VIP地址的所有主机都进行相应并告诉自已的MAC地址,那么如果所有的主机都进行相应,那么前端的路由设备就混乱了,它就无法分辨谁才是VIP对应的MAC地址。

默认情况下,谁相应的快,就会把客户端的请求报文发送给那台主机,如果被送到RealServer2 那么就不符合我们负载均衡的条件了。

那么我们在这里需要做一个非常重要的事情,就是每台配置有RealServer的VIP地址不给予ARP响应。那么我们如果屏蔽它不能响应呢?

那么所有的RealServer上都要关闭对ARP广播的响应。

要达到的目的:让我们的前端路由或者网关,实现报文发送的时候,仅仅能够将报文对目标IP为VIP发送给Director?

实现的方式有以下三种:

1、在R2路由器的内部接口上手动绑定一个静态的解析地址,明确指明目标是VIP的MAC一定是Director的MAC

那么以后发送报文的时候就不用再次请求了,可以由指定的静态解析地址直接发送给Director

这个绑定是静态的也不会失效

缺点:

R2路由是内部路由器,那么VIP是私有地址;如果R2是网络运营商提供的路由设备,也就是VIP是公网地址,我们就无法再R2上进行静态绑定了。

2、arptables:

基于MAC地址做访问控制的,我们只需要在每台RealServer上定义arptables规则,如果用户的arp广播请求的目标地址是本机的VIP则不给予响应或者响应的报文不出去。

那么这个情况所有的RealServer上不响应arp广播请求,只有Director响应给路由则报文就必然被发送给Director。

3、kernel paramter:

arp_ignore

arp_announce

作用:限定我们的Linux主机对arp广播请求的响应级别,以及向外通告自已ip地址的通告级别的。

 

简单说明:

lvs-dr:direct routing

通过修改请求报文的MAC地址进行转发;IP首部不会发生变化(源IP为CIP,目标IP始终为VIP);

Director:VIP,DIP

RSs:RIP,VIP

(1) 确保前端路由器将目标IP为VIP的请求报文一定会发送给Director;

解决方案:

静态绑定;

禁止RS响应VIP的ARP请求;

(a) arptables;

(b) 修改各RS的内核参数,并把VIP配置在特定的接口上实现禁止其响应;

(2) RS的RIP可以使用私有地址,也可以使用公网地址;

(3) RS跟Director必须在同一物理网络中;

(4) 请求报文必须由Director调度,但响应报文必须不能经由Director;

(5) 不支持端口映射;

(6) 各RS可以使用大多数的OS;

(7) RS的网关不能指向DIP

 

 

LVS-TUN

TUN的工作机制跟DR一样,只不过在转发的时候,它需要重新包装IP报文。这里的real server(图中为RIP)离得都比较远。用户请求以后,到director上的VIP上,它跟DR模型一样,每个realserver上既有RIP又有VIP,Director就挑选一个real server进行响应,但是director和real server并不在同一个网络上,这时候就用到隧道了,director进行转发的时候,一定要记得CIP和VIP不能动。我们转发是这样的,让它的CIP和VIP不动,在它上面再加一个IP首部,再加的IP首部源地址是DIP,目标地址的RIP的IP地址。收到报文的RIP,拆掉报文以后发现了里面还有一个封装,它就知道了,这就是隧道。

其实数据转发原理和DR是一样的,不过这个我个人认为主要是位于不同位置(不同机房);LB是通过隧道进行了信息传输,虽然增加了负载,可是因为地理位置不同的优势,还是可以参考的一种方案;

优点:负载均衡器只负责将请求包分发给物理服务器,而物理服务器将应答包直接发给用户。所以,负载均衡器能处理很巨大的请求量,这种方式,一台负载均衡能为超过100台的物理服务器服务,负载均衡器不再是系统的瓶颈。使用VS-TUN方式,如果你的负载均衡器拥有100M的全双工网卡的话,就能使得整个Virtual Server能达到1G的吞吐量。

不足:但是,这种方式需要所有的服务器支持”IP Tunneling”(IP Encapsulation)协议;

http://s3.51cto.com/wyfs02/M00/48/C2/wKioL1QLYJng9g4IAAC1EkyzQjk896.jpg

简单说明:

lvs-tun:ip tunneling,ip隧道;

转发方式:,不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而是在原有的IP首部这外再次封装一个IP首部(源IP为DIP,目标IP为RIP);

(1) RIP,DIP,VIP全得是公网地址;

(2) RS的网关不能也不可能指向DIP;

(3) 请求报文经由Director调度,但响应报文将直接发给CIP;

(4) 不支持端口映射;

(5) RS的OS必须支持IP隧道功能;

 

参考资料:http://www.cnblogs.com/lixigang/p/5371815.html