zoukankan      html  css  js  c++  java
  • 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已经可以做路由地址转发了。

    关注我

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

  • 相关阅读:
    mac 系统安装selenium注意事项
    (mac系统下)mysql 入门
    Mac系统下配置JAVA Maven Ant 环境变量
    解决mac 下mysql安装后root用户登录密码错误问题
    关于使用eclipse maven UpdateProject时报错,无法更新本地仓库的问题解决方案
    201920201学期20192403《网络空间安全专业导论》第一周学习总结
    与数值相关的全局方法 菜鸟
    Jquery插件开发 菜鸟
    Jquery对象和DOM对象Jquery API (1) 菜鸟
    新的一年,新的生活
  • 原文地址:https://www.cnblogs.com/atcloud/p/11281982.html
Copyright © 2011-2022 走看看