美文网首页web
3. LVS实验案例

3. LVS实验案例

作者: 随便写写咯 | 来源:发表于2021-03-14 16:42 被阅读0次

    4. LVS实验

    4.1 LVS-NAT模式

    NAT模式实验拓扑

    实验环境

    共四台主机
    一台: 模拟互联网客户端: 192.168.10.6/24; GW: 无, 因为在本实验里, 模拟的互联网客户端和LVS上的VIP在同一个网段; 使用仅主机模式; CentOS - 7 
    一台: LVS - CentOS-8
    eth1: 仅主机模式, VIP, 192.168.10.100/24
    eth0: NAT模式, DIP, 10.0.0.8/24
    两台:RS - CentOS-7
    RS1: 10.0.0.7/24 GW: 10.0.0.8 NAT
    RS1: 10.0.0.17/24 GW: 10.0.0.8 NAT
    
    先在RS上安装apache服务器, 否则修改了网关后, 就无法上网了
    
    yum -y install httpd; systemctl enable --now httpd; echo 'Website on RS-1:10.0.0.7' > /var/www/html/index.html
    yum -y install httpd; systemctl enable --now httpd; echo 'Website on RS-1:10.0.0.17' > /var/www/html/index.html
    

    客户端网络配置: 用CentOS 7

    [root@client ~]# cat  /etc/sysconfig/network-scripts/ifcfg-eth0
    NAME="eth0"
    DEVICE="eth0"
    ONBOOT=yes
    BOOTPROTO=static
    IPADDR=192.168.10.6
    NETMASK=255.255.255.0
    
    

    LVS网络配置: 用CentOS 8

    eth1:

    BOOTPROTO=static
    NAME=eth1
    DEVICE=eth1                                                                                                                                         
    ONBOOT=yes
    IPADDR=192.168.10.100
    NETMASK=255.255.255.0
    
    

    eth0:

    BOOTPROTO=static                                                                                                                                    
    NAME=eth0
    DEVICE=eth0
    ONBOOT=yes
    IPADDR=10.0.0.8
    NETMASK=255.255.255.0
    GATEWAY=10.0.0.2
    DNS1=223.5.5.5
    DNS2=223.6.6.6
    

    RS1的网络配置: 用CentOS 7

    BOOTPROTO=static
    NAME=eth0
    DEVICE=eth0
    ONBOOT=yes
    IPADDR=10.0.0.7
    NETMASK=255.255.255.0
    GATEWAY=10.0.0.8 
    

    RS2的网络配置: 用CentOS 7

    BOOTPROTO=static
    NAME=eth0
    DEVICE=eth0
    ONBOOT=yes
    IPADDR=10.0.0.17
    NETMASK=255.255.255.0
    GATEWAY=10.0.0.8                                                                                                                                                      
    

    验证LVS可以访问后端Web服务

    [15:30:45 root@LVS ~]#curl 10.0.0.7
    Website on RS-1:10.0.0.7
    [15:31:13 root@LVS ~]#curl 10.0.0.17
    Website on RS-2:10.0.0.17
    

    此时Client是无法和RS通信的, 因为没有配置网关, 并且LVS没有开启路由转发

    [root@client ~]# ping 10.0.0.7
    connect: Network is unreachable
    

    实验步骤

    1. LVS安装ipvsadm工具
    [15:37:11 root@LVS ~]#yum -y install ipvsadm
    
    1. 客户端,开启while循环, 持续访问VIP, 监控是否能访问成功
    [15:34:27 root@client~]#while true;do curl 192.168.10.100; sleep 1 ;done
    curl: (7) Failed connect to 192.168.10.100:80; Connection refused
    curl: (7) Failed connect to 192.168.10.100:80; Connection refused
    curl: (7) Failed connect to 192.168.10.100:80; Connection refused
    curl: (7) Failed connect to 192.168.10.100:80; Connection refused
    curl: (7) Failed connect to 192.168.10.100:80; Connection refused
    
    

    实现LVS-NAT模式, wrr权重轮训算法

    1. 先设定RS权重相同, 默认为1
    [15:40:28 root@LVS ~]#ipvsadm -A -t 192.168.10.100:80 -s wrr
    [15:40:38 root@LVS ~]#ipvsadm -a -t 192.168.10.100:80 -r 10.0.0.7:80 -m
    [15:40:53 root@LVS ~]#ipvsadm -a -t 192.168.10.100:80 -r 10.0.0.17:80 -m
    
    1. 查看规则
    [15:40:55 root@LVS ~]#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 wrr
      -> 10.0.0.7:80                  Masq    1      1          0         
      -> 10.0.0.17:80                 Masq    1      0          0  
    
    1. 观察链接

    此时由于客户端一直在尝试curl VIP, 因此LVS上可以看到活动链接, 来自192.168.10.6

    [15:43:33 root@LVS ~]#ipvsadm -L -c
    IPVS connection entries
    pro expire state       source             virtual            destination
    TCP 00:53  SYN_RECV    192.168.10.6:51704 vip-1.lvs:http     10.0.0.7:http
    
    1. 开启LVS服务的IP_FORWARD功能
    [15:43:39 root@LVS ~]#vim /etc/sysctl.conf 
    net.ipv4.ip_forward=1  
    [15:48:59 root@LVS ~]#sysctl -p
    net.ipv4.ip_forward = 1
    
    1. 验证客户端可以访问后端网站, 而且根据指定的wrr轮训, 每次都是调度到不同的服务器
    [15:54:05 root@client~]#while true;do curl 192.168.10.100; sleep 0.5 ;done
    Website on RS-2:10.0.0.17
    Website on RS-1:10.0.0.7
    Website on RS-2:10.0.0.17
    Website on RS-1:10.0.0.7
    
    1. 查看LVS统计值
    [15:57:51 root@LVS ~]#ipvsadm -L -c
    IPVS connection entries
    pro expire state       source             virtual            destination
    TCP 01:54  TIME_WAIT   192.168.10.6:51826 vip-1.lvs:http     10.0.0.17:http
    TCP 01:48  TIME_WAIT   192.168.10.6:51802 vip-1.lvs:http     10.0.0.17:http
    TCP 01:50  TIME_WAIT   192.168.10.6:51810 vip-1.lvs:http     10.0.0.17:http
    
    [15:58:01 root@LVS ~]#ipvsadm -L --stats
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes
      -> RemoteAddress:Port
    TCP  vip-1.lvs:http                     85      497      284    38837    34332
      -> 10.0.0.7:http                      43      240      128    18464    15456
      -> 10.0.0.17:http                     42      257      156    20373    18876
    
    [15:58:05 root@LVS ~]#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 wrr
      -> 10.0.0.7:80                  Masq    1      0          53        
      -> 10.0.0.17:80                 Masq    1      0          53  
    
    1. 内存中的连接状态
    [15:58:39 root@LVS ~]#cat /proc/net/ip_vs_conn
    Pro FromIP   FPrt ToIP     TPrt DestIP   DPrt State       Expires PEName PEData
    TCP C0A80A06 CB4C C0A80A64 0050 0A000007 0050 TIME_WAIT        20
    TCP C0A80A06 CB24 C0A80A64 0050 0A000007 0050 TIME_WAIT        10
    TCP C0A80A06 CB02 C0A80A64 0050 0A000011 0050 TIME_WAIT         1
    

    修改wrr权重

    将10.0.0.7的权重提高为3

    注意: 进行修改时, 一定要指定模式, 否则会默认使用DR模型, 造成错误

    [root@LVS ~]#ipvsadm -e -t 192.168.10.100:80 -r 10.0.0.7:80 -m -w3
    [root@LVS ~]# 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 wrr
      -> 10.0.0.7:80                  Masq    3      0          61        
      -> 10.0.0.17:80                 Masq    1      0          59 
    

    验证LVS会以1:3的比例进行调度

    [16:03:25 root@client ~]#while true;do curl 192.168.10.100; sleep 0.5 ;done
    Website on RS-2:10.0.0.17
    Website on RS-1:10.0.0.7
    Website on RS-1:10.0.0.7
    Website on RS-1:10.0.0.7
    Website on RS-2:10.0.0.17
    Website on RS-1:10.0.0.7
    Website on RS-1:10.0.0.7
    Website on RS-1:10.0.0.7
    Website on RS-2:10.0.0.17
    

    保存当前规则到/etc/sysconfig/ipvsadm

    [root@LVS ~]# ipvsadm-save -n  > /etc/sysconfig/ipvsadm
    [root@LVS ~]# cat /etc/sysconfig/ipvsadm
    -A -t 192.168.10.100:80 -s wrr
    -a -t 192.168.10.100:80 -r 10.0.0.7:80 -m -w 3
    -a -t 192.168.10.100:80 -r 10.0.0.17:80 -m -w 1
    
    

    清空当前规则, 验证可以加载该文件到内存

    [root@LVS ~]# ipvsadm -C
    [root@LVS ~]# ipvsadm -Ln
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    [root@LVS ~]# ipvsadm -R < /etc/sysconfig/ipvsadm
    [root@LVS ~]# 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 wrr
      -> 10.0.0.7:80                  Masq    3      0          71        
      -> 10.0.0.17:80                 Masq    1      0          24 
    

    将ipvsadm设为开机自启, 验证启动后可以加载规则

    [16:08:15 root@LVS ~]#systemctl enable --now ipvsadm
    Created symlink /etc/systemd/system/multi-user.target.wants/ipvsadm.service → /usr/lib/systemd/system/ipvsadm.service.
    [16:08:22 root@LVS ~]#reboot
    
    [root@LVS ~]# systemctl status ipvsadm
    ● ipvsadm.service - Initialise the Linux Virtual Server
       Loaded: loaded (/usr/lib/systemd/system/ipvsadm.service; enabled; vendor preset: disabled)
       Active: active (exited) since Sun 2021-03-14 21:51:16 CST; 1min 48s ago
      Process: 727 ExecStart=/bin/bash -c exec /sbin/ipvsadm-restore < /etc/sysconfig/ipvsadm (code=exited, status=0/SUCCESS)
     Main PID: 727 (code=exited, status=0/SUCCESS)
    
    Mar 14 21:51:15 CentOS-8 systemd[1]: Starting Initialise the Linux Virtual Server...
    Mar 14 21:51:16 CentOS-8 systemd[1]: Started Initialise the Linux Virtual Server.
    
    [root@LVS ~]# 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 wrr
      -> 10.0.0.7:80                  Masq    3      1          0         
      -> 10.0.0.17:80                 Masq    1      0          0   
    

    修改wrr算法, 改为实现LVS-NAT模式, 源地址哈希算法

    [root@LVS ~]# ipvsadm -E -t 192.168.10.100:80 -s sh
    
    [root@LVS ~]# 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 sh
      -> 10.0.0.7:80                  Masq    3      1          0         
      -> 10.0.0.17:80                 Masq    1      0          0      
    

    测试源地址哈希效果为永远向一个地址调度

    [root@client ~]# while true; do curl 192.168.10.100; sleep 1 ;  done 
    Website on RS-1:10.0.0.7
    Website on RS-1:10.0.0.7
    Website on RS-1:10.0.0.7
    
    
    

    修改sh算法, 改为实现LVS-NAT模式, 目标地址哈希算法

    [16:19:40 root@vip-1 ~]#ipvsadm -E -t 192.168.10.100:80 -s dh
    [16:24:20 root@vip-1 ~]#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 dh
      -> 10.0.0.7:80                  Masq    3      0          0         
      -> 10.0.0.17:80                 Masq    1      0          0   
    
    [16:20:50 root@Internet ~]#while true;do curl 192.168.10.100; sleep 0.5 ;done
    Website on RS-2:10.0.0.17
    Website on RS-2:10.0.0.17
    Website on RS-2:10.0.0.17
    Website on RS-2:10.0.0.17
    

    注意:

    • 基于NAT模型, 如果想修改后端服务器的监听端口, 需要先把后端服务器从LVS规则中删除, 再重新按照新的端口号添加, 不能直接修改, 会显示"'no such destination"
    • LVS不监听端口, 因为是内核功能, 和防火墙一样, 只有应用程序才会监听端口. LVS仅做调度

    三次握手抓包:

    NAT网络三次握手抓包
    • NAT模式下, 客户端是和后端服务器握手, LVS只是转发而已. 源ip是客户端, 目标ip经过lvs修改变成了服务器ip

    在Windows的VMnet8上抓包, 观察三次握手的源目ip和端口号

    在VMnet8上抓包, 其实就是抓的NAT网络里的包流量, 也就是抓经过DIP的流量, 因为DIP是在VMnet8上桥接的

    第一个包是client到后端服务器: 源ip是客户端ip, 目标ip是被调度到的后端服务的ip. 源mac是dip的mac, 目标mac是被调度到的后端服务的mac
    第二个包是后端服务器到client: 源ip是后端服务器ip, 目标ip是客户端ip. 源mac是客户端mac, 目标mac是dip的mac
    第三个包也是client到后端服务器, 源目ip以及mac是和第一个包一样的

    4.2 LVS-DR模型

    LVS-DR模型, 后端可以支持上百个服务器

    在防火墙上, 利用DNAT, 把访问公网出口ip:80的请求,转发到内部LVS的vip:80上

    4.2.1 LVS-DR模型,单网段案例

    单网段指的是, vip和rip在同一个网段

    无论单网段还是多网段, DR模型要求DIP和RIP必须在同一个网段

    DR模型-单网段案例

    DR模型中各主机上均要配置VIP, 会造成IP地址冲突, 导致路由器无法准确的将请求报文转发给LVS

    解决方案:

    1. 在前端路由器网关做静态绑定, 将将请求报文只给LVS转发
    2. 在每个RS上使用arptables配置规则
    3. 在各RS上配置内核参数, 来限制arp响应和通告级别

    限制响应级别: arp_ignore = 1

    0: 默认值, 表示可使用本地任意接口上配置的任意地址进行响应
    1: 仅在请求的目标ip地址配置在了本地主机的接收请求报文的接口上时, 才给予响应
    
    请求报文请求的ip地址是vip, 而vip一般都是配置在loopback接口, 同时请求报文的接收接口是RS的eth0物理接口, 其ip是RIP. 
    因此, 配置了arp_ignore后, RS不会回应请求目标ip为vip的arp广播
    而对于lvs, 因为没有限制arp通告 因此会给路由器回应自己的mac地址, 这样路由器就可以把请求报文转发给lvs
    

    限制通告级别: arp_announce = 2

    0: 默认值, 把本机所有接口的所有信息向每个接口所连接的网络进行通告
    1: 尽量避免将接口信息向非直接连接网络进行通告
    2: 必须避免将接口信息向非本网络进行通告
    

    实验环境

    5台主机

    一台: 模拟互联网客户端: 192.168.10.6/24; GW:192.168.10.200. 上个实验的CentOS-7主机
    
    一台Router: 开一个新的CentOS-7主机
    eth0: NAT 10.0.0.200/24
    eth1: 仅主机 192.168.0.200/24
    启用IP_FORWARD
    
    一台: LVS 上个实验的LVS, 删掉仅主机模式的eth1网卡, 只用NAT网络
    eth0: NAT:DIP: 10.0.0.8/24 GW:10.0.0.200
    
    两台RS: # 保留上个实验的两个RS
    RS1: eth0:NAT:10.0.0.7/24 GW: 10.0.0.200
    RS2: eth0:NAT:10.0.0.17/24 GW: 10.0.0.200
    
    对于lvs, vip可以配置在loopback口,  或者单独的物理网卡
    但是对于RS, vip必须配置在loopback口, 因为arp内核参数的配置会避免rs回应和通过loopback口的地址信息
    一旦把vip配置在了rs的物理网卡, 那么就会向外通过自己vip的地址, 并且会响应arp广播,造成ip地址冲突
    

    客户端网络配置

    DEVICE=eth0
    ONBOOT=yes
    BOOTPROTO=static
    IPADDR=192.168.10.6
    NETMASK=255.255.255.0
    GATEWAY=192.168.10.200  #这里客户端就要配网关了, 因为客户端IP和VIP不在同一个网络, 因此要指向路由器的接口ip
    客户端访问vip:10.0.0.100, 中间的路由器负责转发报文给LVS, 而实际工作中, 客户端一般访问的都是防火墙出口的公网ip地址, 再经过DNAT转给LVS,不会直接访问LVS的vip
    而且一旦关掉物理网卡的arp, 那么rs的rip网卡也不会通告和响应arp广播了, lvs就找不到rs服务器
    

    Router网络配置

    eth1

    BOOTPROTO=static
    NAME=eth1
    DEVICE=eth1
    ONBOOT=yes
    IPADDR=192.168.10.200                                                                                                                                
    NETMASK=255.255.255.0
    

    eth0

    BOOTPROTO=static
    NAME=eth0
    DEVICE=eth0
    ONBOOT=yes
    IPADDR=10.0.0.200                                                                                                                                   
    NETMASK=255.255.255.0
    
    启用路由转发
    
    vim /etc/sysctl.conf
    net.ipv4.ip_forward = 1
    sysctl -p
    

    IP_FORWARD: DR模型, LVS服务器无需开启IP转发

    LVS网络配置

    先把上一步实验的LVS规则清除,或者直接快照还原虚拟机

    ipvsadm -C
    rm -rf  /etc/sysconfig/ipvsadm
    
    

    eth0

    BOOTPROTO=static
    NAME=eth0
    DEVICE=eth0
    ONBOOT=yes
    IPADDR=10.0.0.8
    NETMASK=255.255.255.0
    GATEWAY=10.0.0.200  
    

    RS-1 网络配置

    BOOTPROTO=static
    NAME=eth0
    DEVICE=eth0
    ONBOOT=yes
    IPADDR=10.0.0.7
    NETMASK=255.255.255.0
    GATEWAY=10.0.0.200 
    

    RS-2 网络配置

    BOOTPROTO=static
    NAME=eth0
    DEVICE=eth0
    ONBOOT=yes
    IPADDR=10.0.0.17
    NETMASK=255.255.255.0
    GATEWAY=10.0.0.200 
    

    RS上修改内核参数, 禁止arp, 请求和应答, 同时添加vip地址

    #!/bin/bash
    vip=10.0.0.100
    mask=255.255.255.255
    dev=lo:1
    
    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 $dev $vip netmask $mask
        echo "RS server is ready!"
        ;;
    
    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 "RS service is cancelled"
        ;;
    
    *)
        echo "Usage: $(basename $0) start|stop"
    esac 
    
    [15:22:28 root@RS1 ~]#bash rs.sh start
    RS server is ready!
    [15:23:26 root@RS2 ~]#bash rs.sh start
    RS server is ready!
    
    
    
    图片.png 图片.png 图片.png 图片.png

    lvs的搭建

    vip="10.0.0.100"
    iface="lo:1"
    mask="255.255.255.255"
    port="80"
    rs1="10.0.0.7"
    rs2="10.0.0.17"
    scheduler="wrr"
    type="-g"
    
    #rpm -ql ipvsadm &> /dev/null || yum -y install ipvsadm &> /dev/null
    
    case $1 in
    start)
            ifconfig $iface $vip netmask $mask
            iptables -F
    
            ipvsadm -A -t ${vip}:${port} -s $scheduler
            ipvsadm -a -t ${vip}:${port} -r ${rs1} -w 1
            ipvsadm -a -t ${vip}:${port} -r ${rs2} -w 1
            echo "LVS server is ready!"
            ;;
    stop)
    
            ipvsadm -C
            ifconfig $iface down
            echo "LVS server is cancelled"
            ;;
        
    *)
    
            echo "Usage: $(basename $1) start|stop"
            exit 1
            ;;
    esac
    
    [root@LVS ~]# bash lvs.sh start
    LVS server is ready!
    

    到此lvs和rs都搭建完毕, 在客户端进行测试
    可以看到由于配置了wrr并且权重相同, 所以调度比例是1:1

    [root@client ~]# while :;do curl 10.0.0.100; sleep 1; done
    Website on RS-2:10.0.0.17
    Website on RS-1:10.0.0.7
    Website on RS-2:10.0.0.17
    Website on RS-1:10.0.0.7
    
    
    抓包检查是否给请求报文封装了新的目标MAC地址

    抓VMnet8上的包, 观察三次握手的源目ip和mac

    第一个握手包是从路由器到lvs: 源ip是客户端ip, 目标ip是vip; 源mac是路由器eth0的mac, 目标mac是lvs eth0的mac. 因为请求要发到lvs上做调度, 而且rs是不会回应对于vip的arp广播的
    第二个包是从lvs到后端服务器,会显示out of order SYN, 源ip是客户端ip, 目标ip是vip, 源mac是lvs eth0的mac, 目标mac是后端被调度的rs的eth0的mac
    第三个包是回应包, 由后端服务器发给路由器eth0, 源ip是vip,目标ip是客户端ip, 源mac是后端服务器的eth0mac, 目标mac是路由器eth0的mac
    第四个包是客户端发回来的确认包, 源ip是客户端ip,目标ip是vip,源mac是路由器eth0 mac, 目标mac是lvs eth0的mac
    第五个包是从lvs发给后端服务器, 源ip是客户端ip, 目标ip是vip, 源mac是lvs eth0的mac, 目标mac是后端服务的mac

    由于握手的请求包都要都经过lvs, 所有一共是五个包完成三次握手. 服务器的回应包是直接发给路由器的, 不经过lvs

    lvs的网关必须配置一个和rs在同一网段的ip, 可以不是路由器eth0的ip, 但是不能不配:

    因为客户端发来的数据包源地址和lvs不在同一个网段, 是跨网络的, lvs接收到后, 如果自己没有配网关,就会认为自己没有能力转发这个来自跨网段的数据包, 因此也就不转发了

    如果没有配网关, 客户端的SYN包不会被处理. 如图所示

    image.png

    只要配一个和路由器eth0在同一个网段的ip, 那么lvs就会转发.

    4.2.2 LVS-DR模型,多网段案例

    vip和dip不在同一个网段

    只需在路由器单独加一个网卡配置不同的ip即可

    多网段案例

    4.3 LVS其他配置

    4.3.1 lvs防火墙标签

    根据标签来判断lvs集群

    模拟后端服务器同时提供http和https服务, http和https端口不一样的, 因此相当于lvs调度了两个集群
    通过防火墙标签可以实现将http和https两个集群当做一个整体调度.

    现在先要将https 443端加入到DR模型中

    1. 在后端服务器apache上安装mod_ssl模块

    rs1:

    yum -y install mod_ssl
    systemctl restart httpd
    

    rs2: rs2上的操作和rs1一样

    1. 添加集群服务
    [root@LVS ~]# ipvsadm -A -t 10.0.0.100:443 -s wrr
    [root@LVS ~]# ipvsadm -a -t 10.0.0.100:443 -r 10.0.0.7:443 -w 1
    [root@LVS ~]# ipvsadm -a -t 10.0.0.100:443 -r 10.0.0.17:443 -w 1
    [root@LVS ~]# ipvsadm -Ln
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    TCP  10.0.0.100:80 wrr
      -> 10.0.0.7:80                  Route   1      0          0         
      -> 10.0.0.17:80                 Route   1      0          0         
    TCP  10.0.0.100:443 wrr
      -> 10.0.0.7:443                 Route   1      0          0         
      -> 10.0.0.17:443                Route   1      0          0
    

    测试分别访问80和443端口

    [21:51:39 root@client~]#curl http://10.0.0.100; curl -kL https://10.0.0.100
    Website on RS-2:10.0.0.17
    Website on RS-2:10.0.0.17
    

    有结果可知, 此时,lvs上的http和https两个集群会被当做不同的集群处理. 第一次curl http时, lvs将请求调度到了17上. 第二次curl https时,这时lvs会认为https和http是两个不同的集群, 因此就会正常进行轮训调度还是会调度到17上. 但是由于我们http和https都是配置在一个服务上, 所以应该让lvs把http和https两个集群当做一个整体来统一调度. 实现第一次访问http是调度到17, 第二次访问https时, 轮训到7上.

    • 解决方案: 利用lvs 防火墙标签, 给不同的集群打相同的标签, 这样lvs就会把不同的集群当成一个整体来调度
    1. 打标签
    # --set-mark 10 就是给目标端口80和443打标签, 当做同一个集群处理
    [21:46:41 root@LVS ~]#iptables -t mangle -A PREROUTING -d 10.0.0.100 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 10
    [22:09:24 root@LVS ~]#iptables -vnL -t mangle
    Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
     pkts bytes target     prot opt in     out     source               destination         
        0     0 MARK       tcp  --  *      *       0.0.0.0/0            10.0.0.100           multiport dports 80,443 MARK set 0xa
    
    1. 修改LVS规则
    [22:14:20 root@LVS ~]#ipvsadm -A -f 10 -s rr  #这时就不用-t指定协议了而是用-f指定标签, rr轮询
    [22:15:02 root@LVS ~]#ipvsadm -a -f 10 -r 10.0.0.7 -g #这时就不用指定vip了而是指定标签, rs也不用写端口了
    [22:15:26 root@LVS ~]#ipvsadm -a -f 10 -r 10.0.0.17 -g
    
    [22:15:28 root@LVS ~]#ipvsadm -Ln
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    FWM  10 rr
      -> 10.0.0.7:0                   Route   1      0          0         
      -> 10.0.0.17:0                  Route   1      0          0  
    

    测试:

    [22:09:55 root@client~]#curl http://10.0.0.100; curl -kL https://10.0.0.100
    Website on RS-2:10.0.0.17
    Website on RS-1:10.0.0.7
    [22:17:25 root@client ~]#curl http://10.0.0.100; curl -kL https://10.0.0.100
    Website on RS-2:10.0.0.17
    Website on RS-1:10.0.0.7
    

    4.3.2 lvs持久连接

    当前调度基于rr, 每次用户访问时都被调度到不同的服务器. session信息会丢失, 每次都要重新登录. 如果将调度算法改为源地址哈希, 每次都是调度到同一台服务器, 就达不到负载均衡,

    在轮训算法下, 实现在指定时间内将同一个用户的请求调度到同一个服务器上, 这就是lvs持久连接.

    持久连接和防火墙标签都是要配置在集群上

    案例: 配置持久连接

    [22:16:38 root@LVS~]#ipvsadm -C
    [22:26:27 root@LVS ~]#ipvsadm -Ln
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    
    [22:26:34 root@LVS ~]#ipvsadm -A -f 10 -s rr -p
    [22:27:23 root@LVS ~]#ipvsadm -a -f 10 -r 10.0.0.7 -g
    [22:27:27 root@LVS ~]#ipvsadm -a -f 10 -r 10.0.0.17 -g
    [22:27:31 root@LVS ~]#ipvsadm -Ln
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    FWM  10 rr persistent 360
      -> 10.0.0.7:0                   Route   1      0          0         
      -> 10.0.0.17:0                  Route   1      0          0  
    
    # 10就是防火墙标签, Persistent 360是持久连接, 默认360秒, 可以通过 -p + 时间 指定持久连接时间. 
    # 默认360秒, 可以实现, 在360秒内, 来自同一个用户的请求, 会被调度到同一台服务器上.
    FWM  10 rr persistent 360
    

    测试:

    [22:17:26 root@client~]#while :;do curl 10.0.0.100; sleep 1; done
    Website on RS-2:10.0.0.17
    Website on RS-2:10.0.0.17
    Website on RS-2:10.0.0.17
    Website on RS-2:10.0.0.17
    Website on RS-2:10.0.0.17
    

    但是, 过了持久连接的时候后, 可能还是一直往当前的机器调度.

    4.3.3 LVS的功能缺失

    1. LVS不会监控后端服务器的状态, 一旦后端某个服务器宕机了, lvs还会往down的服务器上调度

    测试;

    1. 停止rs1的httpd服务
    [21:43:27 root@RS-1]#systemctl stop httpd
    
    1. 客户端测试

    可以看到lvs还是正常轮训

    [22:33:47 root@client~]#while :;do curl 10.0.0.100; sleep 1; done
    curl: (7) couldn't connect to host
    Website on RS-2:10.0.0.17
    curl: (7) couldn't connect to host
    Website on RS-2:10.0.0.17
    

    解决方案: 通过计划任务, 定期检查后端服务器的状态, 一旦curl失败, 就把后端服务器从lvs中删除, 这样lvs就不会往down的服务器调度了

    案例:

    1. 停止rs1上的服务, 同时持续访问
    [22:36:06 root@client~]#while :;do curl 10.0.0.100; sleep 1; done
    curl: (7) couldn't connect to host
    Website on RS-2:10.0.0.17
    
    1. 检测rs1服务, 一旦失败, 就把rs1从lvs删除
    # 写到计划任务
    [22:33:41 root@LVS ~]#curl 10.0.0.7 &> /dev/null || ipvsadm -d -f 10 -r 10.0.0.7  # 这里删除rs1是基于此前配置的防火墙标签和持久连接删除
    
    1. 测试客户端访问

    可以看到在删除了rs1后, lvs只会往rs2上调度了

    [22:40:01 root@client~]#while :;do curl 10.0.0.100; sleep 1; done
    curl: (7) couldn't connect to host
    Website on RS-2:10.0.0.17
    curl: (7) couldn't connect to host
    Website on RS-2:10.0.0.17
    curl: (7) couldn't connect to host
    Website on RS-2:10.0.0.17
    Website on RS-2:10.0.0.17
    Website on RS-2:10.0.0.17
    

    2. LVS存在单点失败问题, 一台LVS服务器, 一旦down了, 整个集群就不会调度了

    总结:

    LVS 优点: 性能强大. 支持百万级别的调度, DR模型下后端可以接百台服务器
    LVS缺点: 只支持四层以下调度, 修改目标ip, 目标mac, 添加ip首部; 存在单点失败问题, 没有高可用集群; 无法主动监控后端服务器的状态. 需要配合keepalive解决lvs的单点故障和后端服务器无法监控的问题

    3. 因此lvs和rs的vip都是配置在lo网卡, 因此, 一旦服务器重启就会丢失, 所以可以把脚本放在rc.local里, 一旦rs服务器重启后, 会被自动加入到lvs中

    相关文章

      网友评论

        本文标题:3. LVS实验案例

        本文链接:https://www.haomeiwen.com/subject/tcixcltx.html