我用前端两台服务器做一个lvs+keepalived访问到后端的两台nginx服务器,做一个简单的小测试,这里就不用ipvsadm,直接在keepalived里面配置lvs;首先简单介绍一下lvs-DR模式的工作情况吧,客户端访问到lvs,lvs会根据后端的负载情况,更改目标mac,然后直接发给一台后端服务器,后端服务器接到后会根据本地的route表将包发出去,直接以vip为source发送给客户端,而不经过lvs,所以DR要在本地配置一个vip并将该vip作为广播地址,然后将出口指向这个vip所在接口。
lvs(DR)+keepalived做一个小的负载均衡+高可用_第1张图片

lvs01: 192.168.40.10
lvs02: 192.168.40.11
nginx01:192.168.40.12
nginx02:192.168.40.13
vip: 192.168.40.100

首先所有的服务器都开启路由转发功能:

[root@lvs01 ~]# cat /etc/sysctl.conf
net.ipv4.ip_forward = 1

把前端两台安装keepalived。

[root@lvs01 ~]# yum install -y keepalived
[root@lvs02 ~]# yum install -y keepalived

后端的两台nginx服务器做一个简单的处理,就把nginx服务开起来,确保网页能被访问到。
接下来直接配置keepalived文件。
1、备份keepalived配置文件:

[root@lvs01 ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
[root@lvs02 ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak

2、修改keepalived配置文件:

[root@lvs01 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     [email protected]
   }
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.40.100
    }
}

virtual_server 192.168.40.100 80 {
    delay_loop 3
    lb_algo rr                  ##使用rr算法
    lb_kind DR               ##使用DR模式
    protocol TCP

    real_server 192.168.40.12 80 {
            weight 1
        HTTP_GET {                  ##设置后端服务器的健康检查
            url {
              path / 
          status_code 200            ##检查返回值  
            }
            connect_timeout 1
            nb_get_retry 3
            delay_before_retry 1
        }
    }
    real_server 192.168.40.13 80 {
            weight 1
        HTTP_GET {
            url {
              path /
          status_code 200
            }
            connect_timeout 1
            nb_get_retry 3
            delay_before_retry 1
        }
    }
}

这里要注意的就是健康检查的方式,有多种检查方式,其中我用的是检查网页返回状态码,相应的健康检查要对应检查的内容,否则会容易出错。
3、做好配置文件后将它scp到另一台lvs,也就是备份,然后要把备份的配置文件内容改一下:

state BACKUP             ##状态设置为backup
    interface ens33
    virtual_router_id 51
    priority 90                ##优先等级比master低

4、启动keepalived,查看vip。

[root@lvs01 ~]# ip addr sh ens33
2: ens33:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:49:e5:44 brd ff:ff:ff:ff:ff:ff
    inet 192.168.40.10/24 brd 192.168.40.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.40.100/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe49:e544/64 scope link 
       valid_lft forever preferred_lft forever

现在第一台lvs也就是master拥有了vip。
5、把后端的两台web服务器配置一下,可以直接写一个快速配置的脚本:

[root@nginx02 ~]# cat 2.sh
#!/bin/bash
Vip1=192.168.40.100
source /etc/rc.d/init.d/functions
case $1 in
start)
        echo "config vip route arp" > /tmp/lvs1.txt
        /sbin/ifconfig lo:0 $Vip1 broadcast $Vip1 netmask 255.255.255.255 up

        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
       route add -host $Vip1 dev lo:0
;;
stop)
        echo "deletevip route arp" > /tmp/lvs2.txt
       /sbin/ifconfig lo:0 down
        echo "0" > /proc/sys/net/ipv4/conf/lo/arp_ignore
        echo "0" > /proc/sys/net/ipv4/conf/lo/arp_announce
        echo "0" > /proc/sys/net/ipv4/conf/all/arp_ignore
        echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce
       route del -host $Vip1 dev lo:0

;;
*)
        echo"Usage: $0 (start | stop)"
exit 1
esac

两台后端服务器运行这个脚本:
[root@nginx02 ~]# bash 2.sh start
这里执行start会给本地lo添加一个vip,将禁止arp广播回应,添加一个路由出口指向lo口。

[root@nginx02 ~]# ip addr sh lo
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.40.100/32 brd 192.168.40.100 scope global lo:0
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
[root@nginx02 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.40.2    0.0.0.0         UG    100    0        0 ens33
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 ens37
192.168.40.0    0.0.0.0         255.255.255.0   U     100    0        0 ens33
192.168.40.100  0.0.0.0         255.255.255.255 UH    0      0        0 lo

然后直接开另一台访问一下:

[root@centos ~]# curl http://192.168.40.100
nginx01
[root@centos ~]# curl http://192.168.40.100
nginx02
[root@centos ~]# curl http://192.168.40.100
nginx01
[root@centos ~]# curl http://192.168.40.100
nginx02

6、如果停止主的keepalived,那么vip会飘到备份上面。

[root@lvs01 ~]# systemctl stop keepalived

[root@lvs02 ~]# ip addr sh ens33
2: ens33:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:38:e6:4e brd ff:ff:ff:ff:ff:ff
    inet 192.168.40.11/24 brd 192.168.40.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.40.100/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe38:e64e/64 scope link 
       valid_lft forever preferred_lft forever

这时候我将主的服务再次开启那么他会抢占vip,这样可能会导致数据的丢失:

[root@lvs01 ~]# systemctl start keepalived
[root@lvs01 ~]# ip addr sh ens33
2: ens33:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:49:e5:44 brd ff:ff:ff:ff:ff:ff
    inet 192.168.40.10/24 brd 192.168.40.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.40.100/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe49:e544/64 scope link 
       valid_lft forever preferred_lft foreve

7、设置不抢占模式:

vrrp_instance VI_1 {
    state BACKUP              ##设置两台keepalived都为backup或者是master
    nopreempt                     ##只需要在主备的配置文件都添加,就不会抢占资源。
    interface ens33
    virtual_router_id 51
    priority 100

然后重启keepalived。这样就可以了。