LVS + Keepalived + Nginx基于DR模式构建高可用方案

在大型网站中一般服务端会做集群,同时利用负载均衡器做负载均衡。这样有利于将大量的请求分散到各个服务器上,提升网站的响应速度。当然为了解决单点故障的问题,还会做热备份方案。这里演示利用LVS做负载均衡器,同时利用Keepalived保证其高可用,基于LVS的DR模式构建Nginx集群。

1、环境准备

各个软件及其版本信息如下:

软件 版本
Centos系统 Linux release 7.3.1611 (Core)
Nginx 1.16.0
LVS ipvsadm-1.27-7.el7.x86_64
Keepalived keepalived.x86_64 0:1.3.5-8.el7_6

节点分配及角色如下:

节点 角色
192.168.208.154 lvs master
192.168.208.155 lvs slave
192.168.208.150 nginx1
192.168.208.151 nginx2

同时特别注意这里设置的VIP地址为:192.168.208.100,VIP也即虚拟的IP地址,即当外部请求所访问的IP地址。

2、部署架构

基于上述的环境,部署的架构如下:

特别注意:

由于是采用DR模式,也即当用户请求发送到VIP时,LVS会根据所设置的负载均衡算法将请求转发到具体的Nginx服务器(Real Server)上,而当具体的Nginx服务器处理完后是直接将结果返回给用户。所以在具体的Nginx服务器是要设置回环的IP,即在lo网卡上设置VIP的地址。

3、部署程序

(1)、首先在lvs master节点和slave节点安装lvs和keepalived:

yum install ipvsadm
yum install keepalived

(2)、在nginx1和nginx2节点上安装nginx:

# 添加nginx的yum源
rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

# 安装
yum install nginx

安装完成nginx后,编辑其默认页面,加上特定的信息,这样才能判断请求到底是哪个nginx处理的,即:

vi /usr/share/nginx/html/index.html

对于nginx1加上150字样,nginx2加上151字样,即:

当直接访问nginx1时,效果为:

当直接访问nginx2时,效果为:

(3)、在lvs master节点和lvs slave节点配置keepalived信息:

首先配置lvs master节点:

编辑如下文件:

vi /etc/keepalived/keepalived.conf

内容为:

! Configuration File for keepalived

global_defs {
# 这里将这些邮件设置的相关信息都注释掉了
#   notification_email {
#     acassen@firewall.loc
#     failover@firewall.loc
#     sysadmin@firewall.loc
#   }
#   notification_email_from Alexandre.Cassen@firewall.loc
#   smtp_server 192.168.200.1
#   smtp_connect_timeout 30
# router_id是keepalived的一个标识,最好不同的keepalived配置成不一样
   router_id LVS_DEVEL
#   vrrp_skip_check_adv_addr
#   vrrp_strict
#   vrrp_garp_interval 0
#   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    # MASTER表示是主节点,备份节点是BACKUP
    state MASTER
    # 网卡名称,这个不同的服务器,可能有所不同
    interface ens33
    # 路由标识,MASTER和BACKUP节点的该值要保持一致
    virtual_router_id 51
    # 优先级,MASTER节点的值必须大于BACKUP的值
    priority 100
    # MASTER与BACKUP同步的时间间隔,单位为秒
    advert_int 1
    # lvs对应的真实IP
    mcast_src_ip=192.168.208.154
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 虚拟IP的址
    virtual_ipaddress {
        192.168.208.100
    }
}

virtual_server 192.168.208.100 80 {
    # 健康检查的时间,单位为秒
    delay_loop 6
    # 负载调度算法,这里设置为rr,即轮询算法
    lb_algo rr
    # 设置DR模式
    lb_kind DR
    # 虚拟地址的子网掩码
    nat_mask 255.255.255.0
    # 会话保持时间,单位为秒
    persistence_timeout 50
    protocol TCP

    # 配置真实服务器信息
    real_server 192.168.208.150 80 {
        # 节点的权值
        weight 1
        TCP_CHECK {
            # 超时时间
            connect_timeout 3
            # 重试次数
            nb_get_retry 3
            # 重试间隔
            delay_before_retry 3
        }
    }

    real_server 192.168.208.151 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

基于上述的配置,那么lvs slave的配置如下:

! Configuration File for keepalived

global_defs {
#   notification_email {
#     acassen@firewall.loc
#     failover@firewall.loc
#     sysadmin@firewall.loc
#   }
#   notification_email_from Alexandre.Cassen@firewall.loc
#   smtp_server 192.168.200.1
#   smtp_connect_timeout 30
   router_id LVS_DEVEL_SLAVE
#   vrrp_skip_check_adv_addr
#   vrrp_strict
#   vrrp_garp_interval 0
#   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 99
    advert_int 1
    mcast_src_ip=192.168.208.155
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.208.100
    }
}

virtual_server 192.168.208.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP

    real_server 192.168.208.150 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.208.151 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

分别启动lvs master和slave的keepalived,并且设置为开机自启动:

systemctl start keepalived
systemctl enable keepalived

此时在lvs master节点查看IP地址情况:

ip a

结果为:

说明此时VIP在master节点上的ens33网卡上生成好了。

在lvs master节点查看路由转发情况:

ipvsadm -Ln

结果为:

这个结果跟预期的是一样的。

(4)、关闭lvs master和slave节点上的访火墙:

systemctl stop firewalld
systemctl disable firewalld

(5)、在nginx服务器上设置回环IP:

由于服务器重启后设置的回环IP会失效,所以将设置的内容放在脚本lvs-rs.sh中,内容如下:

#!/bin/bash
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

sysctl -w net.ipv4.ip_forward=1
ifconfig lo:0 192.168.208.100 broadcast 192.168.208.100 netmask 255.255.255.255 up
route add -host 192.168.208.100 dev lo:0

执行后,查看IP信息,可以在lo网卡中看到VIP的信息,即:

4、测试

分别打开Chrome、IE浏览器,同时输入http://192.168.208.100,结果如下:

结果也达到预期的效果的。

现在测试将lvs master节点关闭掉,然后查看lvs slave节点的IP路由情况:

ip a

结果为:

此时VIP漂移到了lvs slave节点上了。

ipvsadm -Ln

结果为:

此时lvs slave已经可以做路由地址转发了。

关注我

以你最方便的方式关注我:
微信公众号:
架构与我

posted @ 2019-08-01 13:44  架构与我  阅读(2557)  评论(3编辑  收藏  举报