linux中级之lvs概念

一、lvs介绍

LVS的英文全称是Linux Virtual Server,即Linux虚拟服务器。它是我们国家的章文嵩博士的一个开源项目。在linux内存2.6中,它已经成为内核的一部分,在此之前的内核版本则需要重新编译内核。

使用 LVS 可以达到的技术目标是:通过 LVS 达到的负载均衡技术和 Linux 操作系统实现一个高性能高可用的 Linux 服务器集群,它具有良好的可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的性能LVS 是一个实现负载均衡集群的开源软件项目,LVS架构从逻辑上可分为调度层、Server集群层和共享存储。

LVS主要用于多服务器的负载均衡。它工作在网络层,可以实现高性能,高可用的服务器集群技术。它廉价,可把许多低性能的服务器组合在一起形成一个超级服务器。它易用,配置非常简单,且有多种负载均衡的方法。它稳定可靠,即使在集群的服务器中某台服务器无法正常工作,也不影响整体效果。另外可扩展性也非常好。

LVS 2部分程序组成,包括 ipvs ipvsadm

1. ipvs(ip virtual server):一段代码工作在内核空间,叫ipvs,是真正生效实现调度的代码。

2. ipvsadm:另外一段是工作在用户空间,叫ipvsadm,负责为ipvs内核框架编写规则,定义谁是集群服务,而谁是后端真实的服务器(Real Server)

工作在input链上,lvs接收报文转发的流程:PREROUTING-->INPUT-->POSTROUTING

用户空间:ipvsadm:定义转发规则通过系统调用把规则发送给内核中的ipvs

lvs术语:

调度器:director server

RS: Real Server

Client IP: CIP

Director Virtual IP:VIP

Director IP: DIP

Real Server IP: RIP

二、lvs的三种模式

1lvs type: lvs-nat

                    lvs-dr(direct routing)

                    lvs-tun(ip tunneling)

2lvs-nat

多目标的DNAT(IPTABLES):它通过修改请求报文的目标ip地址(同时可能修改目标端口)至挑选出来的某个RSRIP地址实现转发(通过网络地址转换来实现负载均衡)

特点:

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

             (2)请求和响应报文都要经过director server,因此在并发量较高的情况下,director server有可能成为瓶颈

             (3)支持端口映射

             (4)RS可以使用任意OSOperating System操作系统)

             (5)RSRIPdirectorDIP必须同一网络中

注意:在NAT模式中,Real Server的网关必须指向LVS,否则报文无法送达客户端

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

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

3lvs-dr: direct routing

它通过修改请求报文的目标mac地址进行转发

特点:

             (1)保证前段路由器将目标ipvip的请求发送给director server

                           解决方案:

                                  静态绑定

                                  arptables

                                  修改RS主机内核的参数

             (2)RSDS必须在同一个物理网络中

             (3)请求报文经由Director调度,但响应报文一定不能经过director

             (4)不支持端口映射

             (5)RS可以是大多数的OS(Unix内核)

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

注意: 需要设置lo接口的VIP不能响应本地网络内的arp请求。

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

DR模式的效率很高,但是配置稍微复杂一点,因此对于访问量不是特别大的公司可以用haproxy/nginx取代。日1000-2000W PV或者并发请求1万以下都可以考虑用haproxy/nginx

缺点:所有 RS 节点和调度器 LB 只能在一个局域网里面。

4lvs-tun(ip tunneling)

特点:

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

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

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

注意:需要设置lo接口的VIP不能在公网上出现。

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

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

三、lvs支持的算法(不区分大小写)

1. 轮叫调度 rr

这种算法是最简单的,就是按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是简单。轮询算法假设所有的服务器处理请求的能力都是一样的,调度器会将所有的请求平均分配给每个真实服务器,不管后端 RS 配置和处理能力,非常均衡地分发下去。

2. 加权轮叫 wrr

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

3. 最少链接 lc

这个算法会根据后端 RS 的连接数来决定把请求分发给谁,比如 RS1 连接数比 RS2 连接数少,那么请求就优先发给 RS1

4. 加权最少链接 wlc

这个算法比 lc 多了一个权重的概念。

5. 基于局部性的最少连接调度算法 lblc

这个算法是请求数据包的目标 IP 地址的一种调度算法,该算法先根据请求的目标 IP 地址寻找最近的该目标 IP 地址所有使用的服务器,如果这台服务器依然可用,并且有能力处理该请求,调度器会尽量选择相同的服务器,否则会继续选择其它可行的服务器

6. 复杂的基于局部性最少的连接算法 lblcr

记录的不是要给目标 IP 与一台服务器之间的连接记录,它会维护一个目标 IP 到一组服务器之间的映射关系,防止单点服务器负载过高。

7. 目标地址散列调度算法 dh

该算法是根据目标 IP 地址通过散列函数将目标 IP 与服务器建立映射关系,出现服务器不可用或负载过高的情况下,发往该目标 IP 的请求会固定发给该服务器。

8. 源地址散列调度算法 sh

与目标地址散列调度算法类似,但它是根据源地址散列算法进行静态分配固定的服务器资源。

grep -i -A 10 'IPVS' /boot/config-3.10.0-957.el7.x86_64

      # IPVS scheduler

      CONFIG_IP_VS_RR=m

              CONFIG_IP_VS_WRR=m

      CONFIG_IP_VS_LC=m

      CONFIG_IP_VS_WLC=m

      CONFIG_IP_VS_LBLC=m

      CONFIG_IP_VS_LBLCR=m

      CONFIG_IP_VS_DH=m

      CONFIG_IP_VS_SH=m

      CONFIG_IP_VS_SED=m

静态方法:仅根据算法本身进行调度

      RR:round robin,轮调

      WRR:weighted RR

      SH:source hash,实现session保持的机制

      DH:destination hash,将同一个目标的请求始终发往同一个RS

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

      LC:Least Connection

             Overhead=Active*256 + Inactive

      WLCWeighted LC

             Overhead=(Active*256 + Inactive)/weighted

             overhead较小的即被挑选的主机

      SED:

      LBLC:

      LBLCR:

posted @ 2019-08-20 17:58  Wolf_Coder  阅读(559)  评论(0编辑  收藏  举报