LVS

LVS负载均衡_第1张图片

1.PREROUTIN

2.INOUT

3.FORWARD

4.OUTPUT

5.POSTRROUTING

LVS的工作机制类似Iptables,他借用了netfilter的部分代码,不过他与netfilter不同的是,netfilter的数据流进入INPOUT的链,接着就会进入用户空间,但是LVS不是,LVS就工作在内核空间的INPUT链上,一旦LVS的数据量进入INPUT,INPUT发现该数据请求的是集群服务,就会匹配自己设定的集群规则,一旦匹配到,就不会把这些数据转发给用户空间,而是直接转发给POSTROUTING,而后转到RS去了,这正好与netfilter相悖,所以,一般来说,LVS不应该与netfilter的过滤机制nat一起使用.LVS与DNAT不同的地方在于,LVS转发时的目标地址不一定会改

如本机的172.16.1.10:80定义为集群服务,而后172.16.1.11和172.16.1.12为真正的后端服务器,当数据请求过来时,INPUT链上的LVS判断该请求是请求集群服务的,就会把源IP直接强制转发至后端的服务器,而不一定会改变目标IP,ipvs是他的服务,而ipvsadm是他的使用工具,他两结合ipvsadm+ipvs=LVS

Virtualerver,实际上他并没有响应用户的请求,响应用户请求的是后端的主机,他将用户的请求转发至其他服务器上,有点类似路由(ip转发)或交换(mac转发),但他是根据套接字转发的,有时又叫四层交换(路由).能根据用户请求的端口和IP判断是否转发以及转发到哪里,LVS工作在第四层,并且用户请求的报文无法到达用户空间,所以无法根据应用层转发,

要说清楚LVS的概念,首先要了解LVS的基本术语,如下图

LVS负载均衡_第2张图片

CIP:客户端(用户)请求服务的IP:Client IP,用来与VIP通信的

VIP:Director(负载均衡器)的入口IP,Virtual server的IP地址简称VIP (可以把Director等同于Virtual server)

DIP:Director(负载均衡器)的入口IP,简称DIP,用来与RIP通信的

RIP:真正提供服务的服务器(real server:RS)的IP


LVS 的类型

从图1-2可以看到,后端服务器有台,那LVS如何挑选使用哪台服务器呢?下面来看LVS的类型

NAT(DNAT):LVS NAT相当于多目标的DNAT,他可以从后端服务器挑选一个,然后把目标IP转换成那个

LVS负载均衡_第3张图片

        1、RS应该使用私有地址;
        2、RS的网关的必须指向DIP;
        3、RIP和DIP必须在同一网段内;
        4、请求和响应的报文都得经过Director;在高负载场景中,Director很可能成为系统性能瓶颈;
        5、支持端口映射;
        6、RS可以使用任意支持集群服务的OS;


DR:

NAT中的Director负责进出的报文的转发,如果让进来的报文经过Director,而出去的报文不经过Director,就可以大大的提高性能,这就是DR.DR一般有三个地址:自己的真实地址,VIP(一般配为真实地址的别名),DIP.RS也有两个地址,一个RIP,作用是与DIP通信,一个VIP,LVS上和后端各个服务器上都有相同的VIP,但是请求进来的时候只能让LVS上的VIP响应.

LVS负载均衡_第4张图片

首先,报文的目标IP是LVS的VIP,当报文到交换机时,就会把报文发给LVS服务器,LVS服务器接受后,通过某种机制改变交换机传送过来的报文的MAC地址为下面三台的某台后端服务器的MAC地址,然后通过DIP返回给交换机,交换机拆包后看到MAC地址为后端服务器1,于是就把报文发给后端服务器1,那么后端服务器要响应这个报文,并且保证客户端能接收到该报文,他必须要有一个VIP,并且此VIP要与LVS服务器的VIP地址是一样的,此VIP还不能与其他主机的IP通信,否则在一个网段会产生ip冲突,并且也不能广播,所以此VIP只能设置为本机的lo地址,并且关掉广播.后端服务器接受到报文后,必须通过自己的lo的地址封装后通过自己的RIP传送到路由器上,最终响应给用户.此种情况路由,VIP,RIP必须都为公网IP

1、RS可以使用私有地址;但也可以使用公网地址,此时可以直接通过互联网连入RS以实现配置、监控等;
        2、RS的网关一定不能指向DIP;
        3、RS跟Dirctory要在同一物理网络内(不能由路由器分隔);
        4、请求报文经过Directory,但响应报文一定不经过Director
        5、不支持端口映射;
        6、RS可以使用大多数的操作系统;

LVS-DR模型:
        Director两个地址:VIP, DIP
        RS有两个地址:VIP, RIP

        禁止RS响应对VIP的ARP广播请求:
            1、在前端路由上实现静态MAC地址VIP的绑定;
                前提:得有路由器的配置权限;
                缺点:Directory故障转时,无法更新此绑定;
            2、arptables
                前提:在各RS在安装arptables程序,并编写arptables规则
                缺点:依赖于独特功能的应用程序
           3、修改Linux内核参数(用的比较多)
                前提:RS必须是Linux;
                缺点:适用性差;

                                Linux的工作特性:IP地址是属于主机,而非某特定网卡;Linux的通告机制

对于Linux来说,IP是属于主机的,而不是属于特定网卡的,如下图所示,当这台Linux主机要接入某一物理网络,会把自己三块网卡的mac地址都通告出去.这是Linux的通告模式.

当外部主机发起一个ARP请求,求情连接Linux主机的网卡2,虽然外部主机和网卡2不在同一个物理网段内,但是网卡2可以响应给外部主机,这就是Linux的请求响应模式

LVS负载均衡_第5张图片

两个参数:
                    arp_announce:定义通告模式,
一个主机刚介入网络,便会通告给同意网段内的各主机,

                       0:默认值,只要把Linux主机接入与外部主机的同一个物理网段,Linux主机就会把自己的所有IP和MAC通告给外部主机

                        1:只要把Linux主机接入与外部主机的同一个物理网段,Linux主机就会把自己的网卡1IP和MAC通告给外部主机,可能会把网卡2和网卡3的Ip和MAC通告

                        2:只要把Linux主机接入与外部主机的同一个物理网段,Linux主机只会把自己的网卡1和网卡1的MAC通告给外部主机
                   arp_ignore:定义收到其他主机的arp请求的时响应模式

                          0:默认值,只要有主机请求,就把自己的所有IP和MAC响应出去

                          1:只有请求的是特定的网卡才用对应的网卡响应,比如,外部主机连的是网卡1,只有外部主机请求网卡1时才响应,外部主机如果请求网卡2就不予响应

                          2:同上,不过限定需要在同一个子网,如外部主机必须和网卡1是同一个子网,否则不予响应
                配置专用路由,以使得响应报文首先通过vip所配置的lo上的别名接口

                          3:看不太懂了....有空在看,,也不太需要了解,用到时在看呗...

                          4-7:reserved

                          8:任何请求都不予响应

而我们需要的模式如下图:

LVS负载均衡_第6张图片

当外部主机请求网卡1时,仅用网卡1响应,所以arp_ignore需要设置为1.而lo网卡也不需要向外通告,所以arp_announce需要设置为2.这两个参数的位置非常独特,要配置在所有的接口,所有接口的arp_ignore都是1,arp_announce都是2,再单独限定其中任何一个(仅针对上图)的arp_ignore=1,arp_announce=2.这里要注意,需要首先配置参数才设定IP,否则以设定IP,IP就会通告出去了,参数配置就没用了.还有一点,在Linux上,从哪块网卡出去的就使用哪块网卡的IP,但是这不符合我们的需求,我们需要的是源IP是lo(lo别名)网卡上的VIP,所以得先构建一个响应报文,并让报文先经过lo,lo在路由给网卡1,从网卡1出去.只需添加一条路由,要响应某某IP就必须由lo上的别名做为第一个出口设备.

        LVS-DR配置架构根据其VIP与RIP是否在同一样网络上有两种模型:

RIP,IIP,VIP都在同一网段内,都是公网地址,RIP和VIP的网关都指向IIP

LVS负载均衡_第7张图片

IIP,VIP都在同一网段内,都是公网地址,RIP和DIP为私网地址,RIP的网关不能指向IIP

LVS负载均衡_第8张图片

偷懒

LVS负载均衡_第9张图片

 


TUN:

机制与RS很类似,如下图,RS是通过MAC转发,而TUN是通过Ip隧道,其他都差不多,lvs服务器和后端服务器1,2,3都不在一个网络,所以需要通过ip隧道进行与RS的交换机实现的MAC转发机制类似

LVS负载均衡_第10张图片

LVS TUN类型:IP隧道
        1、RIP、DIP、VIP都得是公网地址;
        2、RS的网关不会指向也不可能指向DIP;
        3、请求报文经过Directory,但响应报文一定不经过Director;
        4、不支持端口映射;
        5、RS的OS必须得支持隧道功能;

FULLNAT:

能实现各主机跨WLAN,采用的是NAT模型,当CIP请求数据时,把源IP和目标IP 都改了,如图1-6所示:

要想使用FULLNAT,需要重新编译内核.

LVS负载均衡_第11张图片


LVS的调度方法:Scheduling,LVS不能监测后端RS的健康状况

静态方法:Director不考虑后端服务器的负载情况,仅根据算本身调度

    rr:Round Robin,轮询,轮流调度后端服务器,无法session绑定

    Wrr:Weighted Round Robin加权重的轮询,根据权重的比例进行调度,无法session绑定

    sh: source hashing,源地址hash,根据源地址绑定session,只要来至同一个IP的就定向至同一个RS

    dh: destination hashing,目标地址hash,根据目标地址做hash,有多个防火墙时,保证从哪个防火墙进来就从哪个防火墙出去

动态方法:Director考虑后端服务器的负载情况,根据算法及后端服务器的负载情况调度

            lc: Least Connection,连接时选择连接数最少的,考虑活动连接和非活动连接,依然不考虑权重,当连接进入时,每台主机轮询一遍,才开始使用负载计算的算法.
                Overhead=Active*256+Inactive  负载=活动连接数*256+非活动连接数,所以一个活动连接数相当于256个非活动连接数,计算每个RS的负载情况,结果中,最小者胜出;
            wlc: Weighted LC,加权重的lc,如果每台RS的性能表现差异很大,就需要权重
                Overhead=(Active*256+Inactive)/weight 负载=(活动连接数*256+非活动连接数)/权重,得到的结果,任然是最小者胜出,如果结果一样,就至上而下的轮询
            sed: Shortest Expect Delay 最少期望延迟,不考虑非活动连接数,改进版的wlc,但是数据一来就计算,不考虑高性能的RS的请求有多个,而低性能的RS无请求的情况.
                Overhead=(Active+1)*256/weight 负载=(活动连接数+1)*256/权重
            nq: Nerver Queue永不排队,数据一来,每个RS先轮询一次,然后再使用sed算法,这样就不会有空的RS服务器了,也根据权重计算
            lblc: Locality-based Least Connection,基于本地的最少连接,用的少
                dh+lc
            lblcr: Replicated and Locality-based Least Connection,用在后端服务器是缓存服务器时,用的少

查看系统LVS的情况和方法

LVS负载均衡_第12张图片

图1位置:LVS被编译成内核模块了;图2位置:LVS支持IPV6;图3位置:LVS支持的协议;图4位置:LVS支持的调度方法;图5位置:LVS支持FTP



Session持久机制:
    1、session绑定:始终将同一个请求者的连接定向至同一个RS(第一次请求时仍由调度方法选择);没有容错能力,有损均衡效果;
    2、session复制:在RS之间同步session,因此,每个RS持集群中所有的session;对于大规模集群环境不适用;
    3、session服务器:利用单独部署的服务器来统一管理session;最好多台,否则会成为单点故障所在;


LVS的集群服务:
    四层交换,四层路由
        根据请求目标套接字(包括端口的协议类型tcp, udp)来实现转发
        如果请求的地址是172.16.100.7:80集群服务
        ipvs为集群服务定义一个或多个后端服务器,目标地址未必会改,而是被强行截走送往内部某以网络


ipvsadm命令:

  1: ipvsadm
  2:         ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask]
  3:            ipvsadm -D -t|u|f service-address
  4:            ipvsadm -C
  5:            ipvsadm -R
  6:            ipvsadm -S [-n]
  7:            ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight] [-x upper] [-y lower]
  8:            ipvsadm -d -t|u|f service-address -r server-address
  9:            ipvsadm -L|l [options]
 10:            ipvsadm -Z [-t|u|f service-address]

    集群服务相关

        -A: 添加一个集群服务
            -t: tcp,tcp协议的服务
            -u: udp,udp协议的服务
            -f: firewall mark,通常用于将两个或以上的服务绑定为一个服务进行处理时使用;结合Iptables的mangle链为数据报文打标的

            service-address:根据不同的选项service-address不同,-t和-u需要写,而-f后不需要指定service-address
                -t IP:port
                -u IP:port
                -f firewall_mark;# (0-99)

            -s 指定调度方法,默认为wlc,wlc调度方法较优

            -p timeout: persistent connection, 持久连接的超时时间

        -E:修改定义过的集群服务,方法同 -A

        -D -t|u|f service-address:删除指定的集群服务

    RS相关

        -a:向指定的CS(Cluster Service)中添加RS
            -t|-u|-f service-address:指明将RS添加至哪个集群服务中

            -r: 指定RS,可包含{IP[:port]},只有支持端口映射的(只有NAT支持端口映射)LVS类型才允许此处使用跟集群服务中不同的端口

            LVS类型:
                -g: Gateway, DR,LVS的调度类型,默认是DR
                -i: ipip, TUN,IP隧道
                -m: masquerade(地址伪装), NAT,

            指定RS权重:
                -w #,#为数字,可省略,省略则为1,对于rr来说,权重无意义

        -e: 修改指定的RS属性

        -d -t|u|f service-address -r server-address:从指定的集群服务中删除某RS

管理相关

    清空所有的集群服务:
        -C

    保存规则:(使用输出重定向)
        ipvsadm -save 保存集群配置信息,默认保存在 /etc/sysconfig/ipvsadm-config
        ipvsadm –S  同上

    载入指定的规则:(使用输入重定向)
        ipvsadm-restore  导出集群配置信息
        ipvsadm –R 同上

    查看ipvs规则等:
        -L [options]
            -n: 数字格式显示IP地址
            -c: 显示连接数相关信息
            --stats: 显示统计数据
            --rate: 速率
            --exact:显示统计数据的精确值

    -Z: 计数器清零;


LVS的NAT模型

1.拓扑图:RIP1和RIP2的网关都指向172.16.21.1

LVS负载均衡_第13张图片

2.添加LVS服务器的规则(LVS服务器需要打开ipforward功能),并添加两台服务器

LVS负载均衡_第14张图片

3.查看匹配规则

LVS负载均衡_第15张图片

4.启动两台后端服务器的httpd服务,并尝试访问.这里就不实验了,

 


配置DIP和RIP在同一网络中的DR模式

网络拓扑如下,前提:Director的路由转发功能要打开,后端的两台服务器网关不能指向Director

LVS负载均衡_第16张图片

1.配置Director的Ip地址以及两台后端服务器的地址

LVS负载均衡_第17张图片

LVS负载均衡_第18张图片

LVS负载均衡_第19张图片

注意:先限定all,再限定eth0或lo

配置RIP1

image

image

LVS负载均衡_第20张图片

配置RIP2

image

image

LVS负载均衡_第21张图片

添加一条路由规则,如果目标地址是192.168.1.125,就通过lo:0返回报文

配置Director

image

LVS负载均衡_第22张图片

启动两天RS的http服务,这里不演示了

添加LVS规则

LVS负载均衡_第23张图片

访问

LVS负载均衡_第24张图片

查看

LVS负载均衡_第25张图片


配置VIP与RIP不在同一网络的DR模式:注:集群中的服务器时间一定要一样,需要事件服务器

LVS负载均衡_第26张图片

image

VIP是配置别名(eth0:0)上的,VIP又是公网IP,VIP又添加了route –add –host 172.16.100.8 dev eth0:0

dip是私网IP,赔在eth0真实网卡上

网络拓扑图如下

LVS负载均衡_第27张图片

1.配置Director的VIP和DIP

LVS负载均衡_第28张图片

image

2.配置RS的RIP1

LVS负载均衡_第29张图片

添加RS1的关默认网关

image

配置RS1的内核参数,并添加路由,重要步骤

image

启动httpd服务...

3.配置RS2的RIP2

LVS负载均衡_第30张图片

添加RS2的默认网关

image

配置RS2的内核参数和IP,重要步骤

LVS负载均衡_第31张图片

启动httpd服务...

在Director上添加ipvs规则

LVS负载均衡_第32张图片

使用192.168.1.10的主机访问172.16.21.1,成功

LVS负载均衡_第33张图片

查看Director的状态信息

LVS负载均衡_第34张图片


LVS配置的提醒事项:

RS上需要添加 ifconfig lo:0 VIP netmask 255.255.255.255 broadcast VIP up (广播域限制为本机)

Director上不需要添加上面那句

Director和RS上都需要添加 route add –host VIP dev lo:0 (只要目标地址是VIP的.都通过lo:0接口响应)

在Director上最好开启路由转发功能

在Director最好不要filter表和LVS同时启用

LVS负载均衡_第35张图片