18.11 LVS DR模式搭建


1 准备三台机器

 分发器(也叫调度器,简写为dir)192.168.189.128

 rs1 192.168.189.129

 rs2 192.168.189.130

 每台机器上(包括dir,所有rs)都设置vip 192.168.189.200


2 dir上编写脚本

#vim /usr/local/sbin/lvs_dr.sh
#! /bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
ipv=/usr/sbin/ipvsadm
vip=192.168.189.200
rs1=192.168.189.129
rs2=192.168.189.130
#注意这里的网卡名字
ifdown ens33
ifup ens33
ifconfig ens33:2 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip dev ens33:2
$ipv -C
$ipv -A -t $vip:80 -s wrr
$ipv -a -t $vip:80 -r $rs1:80 -g -w 1
$ipv -a -t $vip:80 -r $rs2:80 -g -w 1


参数解释:

echo 1 > /proc/sys/net/ipv4/ip_forward 打开端口转发


ipv=/usr/sbin/ipvsadm

vip=192.168.189.200

rs1=192.168.189.129

rs2=192.168.189.130

设置各参数的变量,变量代替ip


ifconfig ens33:2 $vip broadcast $vip netmask 255.255.255.255 up

ifconfig设置一个网卡的虚拟网卡

绑定vip的命令配置,ens33:2


route add -host $vip dev ens33:2

设置网关


3 dir上启动脚本

[root@centos7-01 ~]# sh !$

sh /usr/local/sbin/lvs_dr.sh

成功断开设备 'ens33'。

连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/17)


4 编写rs上的脚本

两台rs上也编写脚本 vim /usr/local/sbin/lvs_rs.sh//内容如下

注意rs1上的脚本名是lvs_rs1.sh,rs2上的脚本名是lvs_rs2.sh

rs1上,

[root@centos7-02 ~]# vim /usr/local/sbin/lvs_rs.sh
#/bin/bash
vip=192.168.189.200
#把vip绑定在lo上,是为了实现rs直接把结果返回给客户端
ifdown lo
ifup lo
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
#以下操作为更改arp内核参数,目的是为了让rs顺利发送mac地址给客户端
#参考文档www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce


rs2上,

[root@centos7-03 ~]# vim /usr/local/sbin/lvs_rs2.sh
#/bin/bash
vip=192.168.189.200
#把vip绑定在lo上,是为了实现rs直接把结果返回给客户端
ifdown lo
ifup lo
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
#以下操作为更改arp内核参数,目的是为了让rs顺利发送mac地址给客户端
#参考文档www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce


参数解释:

以下是更改arp内核参数,目的是为了让rs顺利发送mac地址给客户端

echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore

echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce

echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore

echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce


5 检查vip是否绑定了在rs1,rs2,dir上

dir,

[root@centos7-01 ~]# ip add
1: lo:  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:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:15:53:53 brd ff:ff:ff:ff:ff:ff
    inet 192.168.189.128/24 brd 192.168.189.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.189.200/32 brd 192.168.189.200 scope global ens33:2
       valid_lft forever preferred_lft forever
    inet 192.168.189.150/24 brd 192.168.189.255 scope global secondary ens33:0
       valid_lft forever preferred_lft forever
    inet6 fe80::243c:86d7:d85e:224d/64 scope link 
       valid_lft forever preferred_lft forever
3: ens37:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:15:53:5d brd ff:ff:ff:ff:ff:ff
    inet 192.168.149.128/24 brd 192.168.149.255 scope global dynamic ens37
       valid_lft 1464sec preferred_lft 1464sec
    inet 192.168.149.147/24 brd 192.168.149.255 scope global secondary ens37
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe15:535d/64 scope link 
       valid_lft forever preferred_lft forever


rs1,

[root@centos7-02 sbin]# ip add
1: lo:  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
    inet 192.168.189.200/32 brd 192.168.189.200 scope global lo:0
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:73:7c:4c brd ff:ff:ff:ff:ff:ff
    inet 192.168.189.129/24 brd 192.168.189.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::165b:9d77:48be:464c/64 scope link 
       valid_lft forever preferred_lft forever
    inet6 fe80::b485:96d0:c537:251e/64 scope link tentative dadfailed 
       valid_lft forever preferred_lft forever
3: ens37:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:73:7c:56 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::db6f:ae30:c2f3:81c5/64 scope link 
       valid_lft forever preferred_lft forever



rs2,

[root@centos7-03 ~]# ip add
1: lo:  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
    inet 192.168.189.200/32 brd 192.168.189.200 scope global lo:0
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:46:b2:9c brd ff:ff:ff:ff:ff:ff
    inet 192.168.189.130/24 brd 192.168.189.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::b485:96d0:c537:251e/64 scope link 
       valid_lft forever preferred_lft forever
3: ens37:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:46:b2:a6 brd ff:ff:ff:ff:ff:ff


6 准备工作完成,进行访问vip测试。

在windows浏览器上进行访问测试

由于windows有缓存的问题存在,在实验上可能会影响实验结果,所以只能尝试在不同浏览器上进行访问测试

6.1 在google chrome浏览器上访问vip

18.11-12 LVS DR模式搭建,Keepalived+LVS DR_第1张图片

转到rs1上

6.2 在360浏览器上访问vip

18.11-12 LVS DR模式搭建,Keepalived+LVS DR_第2张图片

转到rs2上

上面也实现了负载均衡的作用。



18.12 Keepalived+LVS DR


Keepalvied加入LVS的原因是:

  1. 如果LVS的分发器(dir)宕机,所有的访问都会被终止,因为全部入口都在dir上。但是在dir上搭建高可用功能的话,可以起到高可用和负载均衡的作用,可以是宕机了的dir起到高可用作用。

  2. LVS后端的其中一台rs(例如rs2)宕机后,请求最终还是会被dir分发到rs2上,这样的话最终会造成访问失败。但是keepalived可以解决到这种问题,当keepalived检测到rs2出现问题之后,不会将请求发送给rs2,此时LVS的检测功能会被认定rs2不存在,然后dir会继续分发请求到正常的rs上,这样的话能保证业务能正常运作。


  • 完整架构需要两台服务器(角色为dir)分别安装keepalived软件,目的是实现高可用,但keepalived本身也有负载均衡的功能,所以本次实验可以只安装一台keepalived

  • keepalived内置了ipvsadm的功能,所以不需要再安装ipvsadm包,也不用编写和执行那个lvs_dir的脚本


1 准备工作:

 三台机器分别为:

 dir(安装keepalived)192.168.189.128

 rs1 192.168.189.129

 rs2 192.168.189.130

 vip 192.168.189.200


2 编辑keepalived配置文件 vim /etc/keepalived/keepalived.conf

内容请到https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/lvs_keepalived.conf   获取

vrrp_instance VI_1 {
    #备用服务器上为 BACKUP
    state MASTER
    #绑定vip的网卡为ens33,根据实际情况修改
    interface ens33
    virtual_router_id 51
    #备用服务器上为90
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass aminglinux
    }
    virtual_ipaddress {
        192.168.188.110
    }
}
virtual_server 192.168.188.110 80 {
    #(每隔10秒查询realserver状态)
    delay_loop 10
    #(lvs 算法)
    lb_algo wlc
    #(DR模式)
    lb_kind DR
    #(同一IP的连接60秒内被分配到同一台realserver)
    persistence_timeout 60
    #(用TCP协议检查realserver状态)
    protocol TCP
    real_server 192.168.188.129 80 {
        #(权重)
        weight 100
        TCP_CHECK {
        #(10秒无响应超时)
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
    real_server 192.168.188.127 80 {
        weight 100
        TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
     }
}

参数解释:

查看上面带#注释的解释。


 

3 需要更改里面的ip信息(修改vip,rs1,rs2的ip地址)

4 启动keepalived服务

[root@centos7-01 keepalived]# systemctl start keepalived

[root@centos7-01 keepalived]# ps aux |grep keepalived

root      1774  0.0  0.1 118608  1384 ?        Ss   12:01   0:00 /usr/sbin/keepalived -D

root      1775  0.0  0.3 127472  3348 ?        S    12:01   0:00 /usr/sbin/keepalived -D

root      1776  0.0  0.2 127340  2616 ?        S    12:01   0:00 /usr/sbin/keepalived -D

root      1787  0.0  0.0 112676   984 pts/0    S+   12:01   0:00 grep --color=auto keepalived

5 执行ipvsadm -C  把之前的ipvsadm规则清空掉(根据实际情况操作,此处是因为LVS设置了vip,所以当keepalived也建立vip的时候会有发生冲突的机会,所以需要把lvs的规则清理一遍)

查看ipvsadm的状态(可以看到rs1,rs2的宕机情况,如果其中一方不在,即表示宕机状态)

[root@centos7-01 keepalived]# 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.189.200:80 wlc persistent 60
  -> 192.168.189.129:80           Route   100    0          0         
  -> 192.168.189.130:80           Route   100    0          0

6 systemctl restart network 可以把之前的vip清空掉


7 两台rs上,依然要执行/usr/local/sbin/lvs_rs.sh脚本

[root@centos7-02 ~]# sh /usr/local/sbin/lvs_rs1.sh 

[root@centos7-03 ~]# sh /usr/local/sbin/lvs_rs2.sh 


8 keepalived有一个比较好的功能,可以在一台rs宕机时,不再把请求转发过去测试

进行第一次测试,

rs1与rs2的架构是一样的,

当把其中一台rs(例如rs2)的与keepalived关联的核心服务(nginx)关闭掉的时候,访问vip的时候会跳转到rs1上。

[root@centos7-03 ~]# systemctl stop nginx.service 
[root@centos7-01 keepalived]# systemctl restart keepalived
[root@centos7-01 keepalived]# 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.189.200:80 wlc persistent 60
  -> 192.168.189.129:80           Route   100    0          0

   

浏览器访问,跳转到rs1上

18.11-12 LVS DR模式搭建,Keepalived+LVS DR_第3张图片


进行第二次测试

rs1与rs2的架构是一样的,

把rs2的nginx服务恢复正常,把rs1的nginx关掉,

[root@centos7-02 ~]# systemctl stop nginx

[root@centos7-01 keepalived]# 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.189.200:80 wlc persistent 60

  -> 192.168.189.130:80           Route   100    0          0   

浏览器访问,跳转到rs2上

18.11-12 LVS DR模式搭建,Keepalived+LVS DR_第4张图片

9 测试成功,搭建成功。