zoukankan      html  css  js  c++  java
  • 高并发系列【keepalived+nginx实现双机主备】

    双机主备:主机工作,备机备用,主机出现故障,自动切换到备机,由于用户访问的是vip,故不会感知到。
    1.两台机器nginx-master,nginx-backup
    2.在两台nginx服务期上分别安装keepalived

    yum install -y keepalived

    3.在nginx-master上修改keepalived.conf

    cd /etc/keepalived
    vi keepalived.conf
    
    #保留下面的内容
    ! Configuration File for keepalived
    
    global_defs {
       router_id nginx1
    }
    
    vrrp_instance VI_1 {
        state MASTER
        interface ens33
        virtual_router_id 61
    #注意,如果主机的优先级没有备机的大,则vip会绑定到优先级大的机器上,优先级相同时会先绑到主机上 priority 100 #主备之间同步检查的时间间隔,默认1s advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.26.102 } }

    4.在nginx-backup上修改keepalived.conf

    ! Configuration File for keepalived
    
    global_defs {
       router_id nginx2
    }
    
    vrrp_instance VI_1 {
        state BACKUP
        interface ens33
        virtual_router_id 61
        priority 50
        #主备之间同步检查的时间间隔,默认1s
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.26.102
        }
    }

    5.分别主机和备机的keepalived

    systemctl start keepalived

    6.用"ip addr"命令验证vip 192.168.26.102是否已绑到主机ens33网卡上

    存在的问题:

    keepalived只有在nginx-master这整个节点挂掉时才会自动切换到备用节点,如果只有主节点的ngixn挂掉了,keepalived是无法感知到的,这时候vip仍然绑定在master上,无法完成ip漂移,如果这时候客户访问vip的时候,会显示“无法访问此网站”,相当于服务整个就瘫痪了。

    解决方案:

    为了保证全天候的为用户提供不间断的服务,我们得让keepalived定时去检测nginx软件是否正常,如果nginx出现了问题,这时候,keepalived要尝试重启nginx,使得服务能够自动恢复到正常状态,如果说实在重启不了,那就切换到备用nginx服务器。

    1.在nginx-master服务器上编写脚本,手动停止master上的nginx

    #测试是否安装了killall命令,执行完若出来版本号则证明已安装
    killall -V
    
    #若没出来版本号,显示无此命令,则先安装
    yum install -y psmisc
    cd /etc/keepalived
    
    vi check_nginx_status.sh
    #保存下面内容,注意,一个空格都不能错
    #!/bin/sh
    
    A=`ps -C nginx --no-header |wc -l`
    if [ $A -eq 0 ];then
        /usr/local/nginx/sbin/nginx
        sleep 3
        if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
            killall keepalived
        fi
    fi
    
    
    #保存退出,并赋执行权限
    chmod 775 check_nginx_status.sh

    #尝试着运行一下,不报错则说明脚本没问题
    ./check_nginx_status.sh

    2.进入nginx-master,在keepalived的配置文件中调用此脚本,重点加上紫色部分的代码

    cd /etc/keepalived
    
    vi keepalived.conf
    #保存下面的配置
    ! Configuration File for keepalived global_defs { router_id nginx1 } vrrp_script check_nginx_status { script "/etc/keepalived/check_nginx_status.sh" # 每隔2秒运行一下上一行脚本 interval 2 # 如果脚本运行成功,则升级权重+10 weight 10 } vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 61 priority 100 #主备之间同步检查的时间间隔,默认1s advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { #追踪nginx脚本 check_nginx_status } virtual_ipaddress { 192.168.26.102 } }

    3.重启keepalived

    systemctl restart keepalived
    #设置开机自启动
    systemctl enable keepalived

    4.测试,若此时访问虚拟ip是通的,并且vip是绑定在master上的,则大功告成!

    5.在backup节点上,重新执行1-4步骤即可。

    常见的问题:

    1.keepalived调用的脚本不生效,手动执行脚本没问题,但是配到keepalived.conf中就是不起作用。

    首先检查keepalived.conf配置里面脚本定义的名字和外面脚本的名字是否一致,再检查和配置里调用的方法的名字和定义的名字是否一致,若都没问题,那就是selinux的问题了。

    关闭selinux,这个只是临时关闭,重启之后又不行了

    setenforce 0

    永久关闭selinux,执行完命令后记得重启

    sed -i "s/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config
    愿你走出半生,归来仍是少年!
  • 相关阅读:
    html5中新增的form表单属性
    FORM
    .Net Core 发布失败
    Sql Server查询最近执行sql
    HttpWebRequest.GetResponse()操作超时
    使用SqlBulkCopy批量插入/更新数据
    ADO .NET 往数据库批量插入数据发生错误:超时时间已到,但是尚未从池中获取链接
    Ueditor代码内容前台只显示一行
    Lambda表达式
    委托的简单使用
  • 原文地址:https://www.cnblogs.com/hujunwei/p/15773502.html
Copyright © 2011-2022 走看看