• Linux学习113 基于LVS实现四层负载均衡配置和DR模型实战


    一、概述

      1、DR模型中,Director用于承载请求报文,而响应报文用来承载各RS直接响应给请求服务器。即请求报文给到Director,然后Director将请求响应给某一主机,然后由主机直接将响应报文返回给客户端。

        

    二、lvs-dr

      1、dr模型中,备主机上均需要配置VIP,解决地址冲突的方式有三种

        a、在前端网关做静态绑定

        b、在各RS使用arptables

        c、在各RS修改内核参数,来限制arp响应和通告的级别

          (1)、限制响应级别:arp_ignoe(对arp广播进行应答配置)

            1)、0:默认值,表示可使用本地任意接口上配置的任意地址进行响应

            2)、1:仅在请求的目标IP配置在本地主机的接收到请求报文接口上时,才给与响应

            

          (2)、限制通告级别:arp_announce(向接口通告自身的mac信息配置)

            1)、0:默认值,把本机上的所有接口的所有信息向每个接口上的网络进行通告

            2)、1:尽量避免向非直接连接网络进行通告

            3)、2:必须避免向非本网络通告。我们dr中RS上就配置成此值,因为我们将VIP配置在lo:0上的,因此只要不是从lo:0接口上的地址就都不通告。也不应答。

          

      2、实践作业(博客):负载均衡两个php应用(wordpress,discuzx)

        测试:(1)、是否需要会话保持;(2)、是否需要共享存储

      3、RS的预配置脚本

    [root@rs1 ~]# cat config.sh 
    #!/bin/bash
    vip='192.168.10.100'
    mask='255.255.255.255'
    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 lo:0 $vip netmask $mask broadcast $vip up
        route add -host $vip dev lo:0
        ;;
    stop)
        ifconfig lo:0 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 

    三、配置实践

      1、标准top图

        

      2、规划:

        Director:192.168.10.13

        RS1:192.168.10.14

        RS2:192.168.10.15

      3、配置RS1和RS2

        a、在RS1和RS2上配置相应的通告和应答开关脚本

          (1)、脚本内容

    [root@rs1 ~]# cat setparam.sh 
    #!/bin/bash
    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
        ;;
    stop)
        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

          (2)、在RS1上配置

            1)、脚本配置

    [root@rs1 ~]# bash -x setparam.sh start
    + case $1 in
    + echo 1
    + echo 1
    + echo 2
    + echo 2
    [root@rs1 ~]#

            2)、配置VIP(broadcast 192.168.10.100表示只广播给自己)

    [root@rs1 ~]# ifconfig lo:0 192.168.10.100 netmask 255.255.255.255 broadcast 192.168.10.100 up
    [root@rs1 ~]# ifconfig 
    docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
            inet 172.17.0.1  netmask 255.255.0.0  broadcast 0.0.0.0
            ether 02:42:d4:23:e6:78  txqueuelen 0  (Ethernet)
            RX packets 0  bytes 0 (0.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 0  bytes 0 (0.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 192.168.10.14  netmask 255.255.255.0  broadcast 192.168.10.255
            inet6 fe80::d827:3867:4a18:c5b9  prefixlen 64  scopeid 0x20<link>
            ether 00:0c:29:c3:dd:9a  txqueuelen 1000  (Ethernet)
            RX packets 79905  bytes 7436281 (7.0 MiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 8444  bytes 1156729 (1.1 MiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
            inet 127.0.0.1  netmask 255.0.0.0
            inet6 ::1  prefixlen 128  scopeid 0x10<host>
            loop  txqueuelen 1  (Local Loopback)
            RX packets 134  bytes 27429 (26.7 KiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 134  bytes 27429 (26.7 KiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    lo:0: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
            inet 192.168.10.100  netmask 255.255.255.255
            loop  txqueuelen 1  (Local Loopback)

            3)、我们说过对于RS而言他的响应报文直接是应答给客户端的,并且我们为了确保响应报文源地址一定是VIP我们需要确保入栈时到达VIP的时候要经由lo:0这个接口来实现,出去的时候他也会经由他来实现,而不是说到达物理网卡以后就直接到达本机了,而是需要到达物理网卡以后再将其转换给lo:0,这样就能确保出栈的时候经过lo:0,所以我们需要在RS上加一个路由条目

    [root@rs1 ~]# route add -host 192.168.10.100 dev lo:0
    [root@rs1 ~]# route -n
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    0.0.0.0         192.168.10.254  0.0.0.0         UG    100    0        0 ens33
    172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
    192.168.10.0    0.0.0.0         255.255.255.0   U     100    0        0 ens33
    192.168.10.100  0.0.0.0         255.255.255.255 UH    0      0        0 lo

          (3)、在RS2上配置

            1)、脚本配置

    [root@rs2 ~]# bash -x setparam.sh start
    + case $1 in
    + echo 1
    + echo 1
    + echo 2
    + echo 2

            2)、配置VIP

    [root@rs2 ~]# ifconfig lo:0 192.168.10.100 netmask 255.255.255.255 broadcast 192.168.10.100 up
    [root@rs2 ~]# ifconfig 
    ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 192.168.10.15  netmask 255.255.255.0  broadcast 192.168.10.255
            inet6 fe80::5418:2d26:cf07:11c9  prefixlen 64  scopeid 0x20<link>
            inet6 fe80::d827:3867:4a18:c5b9  prefixlen 64  scopeid 0x20<link>
            ether 00:0c:29:fd:7d:b6  txqueuelen 1000  (Ethernet)
            RX packets 80950  bytes 15496587 (14.7 MiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 11929  bytes 1306980 (1.2 MiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
            inet 127.0.0.1  netmask 255.0.0.0
            inet6 ::1  prefixlen 128  scopeid 0x10<host>
            loop  txqueuelen 1  (Local Loopback)
            RX packets 152  bytes 24258 (23.6 KiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 152  bytes 24258 (23.6 KiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    lo:0: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
            inet 192.168.10.100  netmask 255.255.255.255
            loop  txqueuelen 1  (Local Loopback)

            3)、添加路由

    [root@rs2 ~]# route add -host 192.168.10.100 dev lo:0
    [root@rs2 ~]# route -n
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    0.0.0.0         192.168.10.254  0.0.0.0         UG    100    0        0 ens33
    192.168.10.0    0.0.0.0         255.255.255.0   U     100    0        0 ens33
    192.168.10.100  0.0.0.0         255.255.255.255 UH    0      0        0 lo

          (4)、在Director上配置

            1)、首先在Director上配置VIP,此处我们需要配置在我们的物理网卡上,因为他需要通过物理网卡接进来报文,而且要转发出去,所以要配置在物理网卡的别名上

    [root@www ~]# ifconfig ens33:0 192.168.10.100 netmask 255.255.255.255 broadcast 192.168.10.100
    [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

            2)、添加规则

    [root@www ~]# ipvsadm -A -t 192.168.10.100:80 -s rr
    [root@www ~]# ipvsadm -a -t 192.168.10.100:80 -r 192.168.10.14 -g 
    [root@www ~]# ipvsadm -a -t 192.168.10.100:80 -r 192.168.10.15 -g 
    [root@www ~]# ipvsadm -ln
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    TCP  192.168.10.100:80 rr
      -> 192.168.10.14:80             Route   1      0          0         
      -> 192.168.10.15:80             Route   1      0          0

            3)、 然后在我们的浏览器上访问192.168.10.100/test1.html即可看到会进行轮询。

  • 相关阅读:
    volatile关键字
    线程的状态
    java中的匿名内部类
    java高精度实数和小数
    JS、JSP、ASP、CGI
    论文结构要求
    java中的标识符、关键字、保留字
    java IODemo
    Bagging和Boosting的区别
    由Memcached升级到 Couchbase的 Java 客户端的过程记录(一)
  • 原文地址:https://www.cnblogs.com/Presley-lpc/p/13206245.html
Copyright © 2020-2023  润新知