Linux学习114 LVS实现企业负载均衡高级应用配置

一、回顾

  1、lvs:四层路由器,四层交换机;

  2、lvs-type:

    a、nat/dr/tun/fullnat

    b、nat/fullnat:请求和响应报文都经由Director;

      (1)、nat:仅修改请求报文的目标IP,和端口

      (2)、fullnat:修改请求报文的源和目标IP,和目标端口

    c、dr/tun:仅请求报文经由Director;

      (1)、dr:DIP所属的网络接口与RS的RIP所属的网络接口要在同一个物理网络;

      (2)、tun:

  3、lvs scheduler:

    a、静态算法:适用于短连接,rr/wrr/sh/dh

    b、动态算法:lc/wlc/sed/nq

二、高级调度

  1、我们在前面介绍的后面的两个RS都是分开调度的,那么我们如何实现统一调度呢?即假如我们后端的web服务即监听了80又监听了443,如果我们是分开调度的情况会导致80端口的调度第一个节点压力很大,对于443端口的调度也是第一个节点压力很大,这样很容易扛不住,因此我们需要来做统一资源调度,即把RS1和RS2识别成同一个集群,比如第一个请求80的按照轮询的算法来讲我调度到RS1,第二个请求80或者443的都可以调度到RS2,相当于他们都是使用同一套逻辑而不是说80和443分别是另外一套逻辑。像这种情况要怎么实现呢?或者另一个例子,我们在nginx中可以把80请求重写为443请求,一重写就相当于是一个新的服务了,这就意味着客户端要对一个新端口发起请求了。因此如果是两个集群的话很有可能你的这一次重新被调度的请求又被分发到其它主机上去了,这虽然没什么问题但是你需要考虑一个情形,比如我们的网站访问大多数路径时你访问http或者https都可以,但是如果你要访问特定路径时必须使用https,比如/login目录,这个时候你发现一跳转你就跳转到另外一台主机上去了,因为他已经转成443了,如果我们此时要使用会话保持功能的话,假如我们使用的sh算法,此时假如我们对http和https分别做了两个不同的集群,比如用户都是做的明文的http协议被分发到第一个http server,那么所有的用户请求就都会被分发到第一个http server了,即他的会话都在这个主机上,那么他一登陆的时候被调度到443,而碰巧443把它分发到第二台主机上去了,因为我们前面说过,443又是新的集群,即使用的是sh算法,那么他也会重新进行我们443请求的调度,有可能将443请求调度到第二个主机上去,这样用户在第一个主机上的会话就没有了,所以在这种情况下我们更需要把两个集群服务绑定成一个进行使用一个算法进行调度,即把两个服务绑定成一个进行使用同一个算法进行调度,他们两个使用同一个集群服务,这样的话无论是你的80还是443都被识别成同一个集群上的sh的会话表中内容,所以你的请求只要通过80来过通过443访问他会依然在的。

  2、综上所述,即我们的目标是将两个服务请求归并成一个集群服务,即归并成一种请求被LVS来识别。要想达成此目的,我们要有一个前提,得靠iptables的防火墙机制将两种或者多种的请求归并成一种并由LVS识别成一种。即我们使用iptables把多个不同端口上的请求给其打上不同的标记,我们称之为防火墙标记,并且我们在定义集群服务时,不再基于目标端口来定义,而是基于防火墙标记来定义,这样他就能被识别成同一种服务了。

  3、我们报文达到主机的时候首先到达的是防火墙的PREROUTING链,你可以访问80的,443的,甚至是其它服务的,在PREROUTING链上都可以做统一标记,比如目标端口是TCP协议80的你可以打一个标记是10,访问443端口也打成标记10,而后我们这个请求不管怎么讲不管标记是几只要目标地址是自己很显然就要交给INPUT链,到达INPUT链后,我们在ipvs这儿定义一个规则,这个规则不再是目标地址和端口而是说如果你的防火墙标记是1的话那么我们怎么怎么调度,防火墙标记是10的话我们怎么怎么调度。当我们集群两个标记都为10的话就被当做同一个服务了。即我们先利用iptables将集群归类,然后将归好的类定义成一个集群于是就能被统一对待了。

  4、FWM:FireWall Mark

    a、netfilter:

      target:MARK,This target is used to set the Netfilter mark value associated with the packet

        --set-mark value

    b、借助于防火墙标记来分类报文,而后基于标记定义集群服务,可将多个不同的应用使用同一个集群服务进行调度

    c、打标记方法(在Director主机)

      iptables -t mangle -A PREROUTING -d $vip -p $proto --dport $port -j MARK --set-mark NUMBER

    d、基于标记定义集群服务:

      ipvsadm -A -f NUMBER [options]

  5、lvs persistence:持久连接

    a、持久连接模板:实现无论使用任何调度算法,在同一段时间内,能够实现将来自同一个地址的请求始终发往同一个RS

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

    b、port Affinity:

      (1)、每端口持久:每个端口对应定义为一个集群服务,每集群服务单独调度

      (2)、每防火墙标记持久:基于防火墙标记定义集群服务,可实现将多个端口上的应用同一调度,即所谓的port Affinity

      (3)、每客户端持久:基于0端口定义集群服务,即将客户端对所有应用的请求统统调度至后端主机,必须定义为持久模式

  6、保存及重载规则

    a、保存:建议保存至/etc/sysconfig/ipvsadm

      ipvsadm-save > /PATH/TO/IPVSADM_FILE

      ipvsadm -S > /PATH/TO/IPVSADM_FILE

      systemctl stop ipvsadm.service

    b、重载:

      ipvsadm-restore < /PATH/FROM/IPVSADM_FILE

      ipvsadm -R <  /PATH/FROM/IPVSADM_FILE

      systemctl restart ipvsadm.service

  7、考虑

    a、Director不可用,整个系统将不可用;SPoF

      (1)、解决方案:高可用

        keepalived

        heartbeat/corosync

    b、某RS不可用时,Director依然会调度请求至此RS

      (1)、解决方案:对各RS的健康状态做检查,失败时禁用,成功时启用

        keepalived

        heartbeat/corosync,ldlrectord

三、相应配置

  1、我们配置RS1 192.168.10.14和RS2 192.168.10.15

    a、配置RS1

[root@rs1 ~]# cat setparam.sh 
#!/bin/bash
#
vip='192.168.10.100'
mask='255.255.255.255'
iface='lo:0'

case $1 in
start)
    echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
    
    ifconfig $iface    $vip netmask $mask broadcast $vip up
    route add -host $vip dev $iface
    ;;
stop)
    ifconfig $iface down

    echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
    ;;
*)
    echo "Usage: $(basename $0) start|stop"
    exit 1
    ;;
esac
[root@rs1 ~]# bash -x setparam.sh start
+ vip=192.168.10.100
+ mask=255.255.255.255
+ iface=lo:0
+ case $1 in
+ echo 1
+ echo 1
+ echo 2
+ echo 2
+ ifconfig lo:0 192.168.10.100 netmask 255.255.255.255 broadcast 192.168.10.100 up
+ route add -host 192.168.10.100 dev lo:0

    b、配置RS2

[root@rs2 ~]# cat setparam.sh 
#!/bin/bash
#
vip='192.168.10.100'
mask='255.255.255.255'
iface='lo:0'

case $1 in
start)
        echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
        echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
        echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
        echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

        ifconfig $iface $vip netmask $mask broadcast $vip up
        route add -host $vip dev $iface
        ;;
stop)
        ifconfig $iface down

        echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
        echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
        echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
        echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
        ;;
*)
        echo "Usage: $(basename $0) start|stop"
        exit 1
        ;;
esac
[root@rs2 ~]# bash -x setparam.sh start
+ vip=192.168.10.100
+ mask=255.255.255.255
+ iface=lo:0
+ case $1 in
+ echo 1
+ echo 1
+ echo 2
+ echo 2
+ ifconfig lo:0 192.168.10.100 netmask 255.255.255.255 broadcast 192.168.10.100 up
+ route add -host 192.168.10.100 dev lo:0

  2、我们配置Director

    a、配置相应的VIP

[root@www ~]# ifconfig ens33:0 192.168.10.100 netmask 255.255.255.255 broadcast 192.168.10.100 up
[root@www ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:24:c1:90 brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.13/24 brd 192.168.10.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.10.100/32 brd 192.168.10.100 scope global ens33:0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe24:c190/64 scope link 
       valid_lft forever preferred_lft forever

  3、配置规则

    a、我们配置http和https两个服务

    b、此处我们将LVS主机当做CA,然后我们来创建私钥和自签证书

    c、同样的我们在Director上配置私钥和证书签署请求并且进行签署

      

    d、然后我们将我们Director上的私钥和证书复制到我们的RS1和RS2上并配置成https服务。不过前提是需要在我们RS1和RS2上安装mod_ssl模块

      yum install -y mod_ssl

    e、我们将相应的私钥和证书配置到我们的RS1和RS2中的/etc/httpd/conf.d/ssl.conf中,然后重启httpd服务

       

      

    f、我们可以在客户端用curl命令进行单独访问RS1和RS2

      

      

    g、现在我们来Director上来配置将RS1和RS2中的两种服务打包成一个

      (1)、配置无论用户请求80端口还是443端口都给其打标记,比如3,这个标记他会自动转换成16进制,我们这个功能是需要mangle功能表的,我们此处需要在PREROUTING链上实现的。下面的意思是我们任何主机向我们的VIP 172.16.0.99发送请求的时候,目标端口只要是80或443,都会在防火墙上打一个标记0x3(即十六进制中的3)。

      (2)、现在我们通过ipvsadm工具配置规则。下面的-f选项表示使用防火墙标记,-f 3即使用我们上面所说的防火墙标记3。

        

 

      (3)、现在我们来请求VIP的80服务,因为我们用的sh算法因此我们所有的请求都会到同一个RS

        

      (4)、并且,我们去请求https也一样会被调度到RS1上,因为他两是同一个集群服务被统一调度了,受限于同一个算法。现在我们使用同一个客户端来请求https服务。

        

    h、现在我们来换一种调度算法,使用rr

      (1)、配置Director

      (2)、我们来访问http服务

      (3)、我们来访问https服务

    i、ipvs有一种持久连接功能,我们前面说过sh算法可以基于源地址进行哈希,把来自于同一个地址的请求始终发往同一个服务端,那么他这个绑定能绑定多长时间呢?我们前面也没提过,那么假如我不需要绑定太多时间,比如一个用户只需要绑上5分钟到10分钟就差不多了,或者一个用户到我们这儿浏览一个网站,加购物车之类的通常不会超过两小时,因此我们绑个两小时也就行了。他其实是根据sh整个记忆模板到底有多大空间以后根据自己的淘汰算法来进行淘汰这个链接。那么我们要定义我们的淘汰时间要怎么办呢?我们lvs就有这个功能,他实现的是无论你使用什么算法,就算是rr也能进行绑定,即只要来自于同一个地址的请求我始终都给你发往同一个服务器,并且超时时间你可以自己定。根据我们的认知rr不本来就是轮询的么?但是lvs却有另外一个功能,即第一次你请求的时候是轮询的这个没有问题,但是一旦你的请求来了我给你分了一个RS,然后接下来可以在你定义的时间内只要来自于同一个地址的请求始终发往同一个RS。这个和算法已经没有关系了,这个已经上升到ipvs级别自己脱离算法以后的一种绑定,这种绑定就叫做ipvs的持久连接功能,这种功能说到底就是它自己启动了一个连接追踪模板,来自于哪一个地址的客户端不管什么算法在ipvs自己的级别实现的而不是算法级别。因此只要一个请求我们根据算法调度以后被分到了一个RS上随后一定时间内这个连接记录内容就会一直在那儿记录着,然后这条记录会有个倒计时的时间戳,比如定义成7200秒那么一开始这个时间就是7200,然后就开始倒计时,直到0位置然后条目就删除,然后再来请求的时候就又重新调度了。

      (1)、我们前面讲ipvsadm命令的时候有一个 -p [timeout]选项就表示启用持久连接功能的。timeout表示指明持久多长时间,默认是300秒。

      (2)、我们来将我们前面配置的服务修改一下,修改保存时间为300秒。

        

 

      (3)、我们还可以定义服务0端口,这种时候必须要加-p才行,0端口表示通配,他就意味着把所有服务统统定义成集群服务了,只要你写成VIP就一定向后调度,后端主机上有就被调度,没有就不能调度,这种可以把所有端口都绑定起来

        

      (4)、然后我们访问我们的VIP可以发现无论我们使用什么算法只要是同一个客户端访问都会被调度至同一个RS

      (5)、

 

posted @ 2020-06-30 16:56  Presley  阅读(229)  评论(0编辑  收藏  举报