zoukankan      html  css  js  c++  java
  • Nginx通过Keepalived实现高可用

    本次测试环境:

    两台虚拟机

    centos7.3虚拟机A 10.0.3.46

    centos7.3虚拟机B 10.0.3.110

    对外开放的虚拟ip 10.0.3.96(这个ip只需要在keepalived里面配置就可以了)

    简述实验原理:

    虚拟机A和B都需要安装nginx和keepalived(过程省略,其中keepalived为yum安装模式yum install keepalived -y,编译安装的貌似不能正常运行,暂时不清楚什么原因)我简单将keepalived理解为检测i服务器是否可用,如果某台服务器宕机,则将虚拟ip转移到另一台服务器

    实验步骤:

    为了区别虚拟机AB,修改nginx的默认页面

    分别开启nginx

    分别修改keepalived的配置文件keepalived.conf,yum安装默认放在/etc/keepalived/keepalived.conf,或者也可以自行find / -name keepalived.conf。注意需要把原文件内容全部删除(或者把原文件重命名做备份),否则会出错

    在两台keepalived上都需要在/etc/sysctl.conf中添加以下参数,否则无法正常绑定虚拟ip

    net.ipv4.ip_nonlocal_bind = 1

    虚拟机A的keepalived配置文件全部内容为:(正常来说还应该配套一个检测Nginx存活状态的脚本,后续我实践了再加进来)

    vrrp_instance VI_1 {
        state MASTER
        interface ens33      #这里需要根据自己的网卡接口修改
        virtual_router_id 66   #该值保持一致,默认为51,但是建议修改为其他值,我的就是因为局域网内已经部署有一个keepalived占用了51这个id,导致keepalived无法正常启动
        priority 101         #具有更高的优先级,比如说当这台虚拟机A宕机恢复后,keepalived根据这个优先级决定是否优先使用虚拟机A
        advert_int 1
        authentication {           #类型和密码必须与另一台虚拟机保持一致
            auth_type PASS
            auth_pass 123456
        }
        virtual_ipaddress {
            10.0.3.96     #这个是我随便取的,只要局域网内该ip没有被占用就可以了
        }
    }
    

     虚拟机B的keepalived配置文件为

    vrrp_instance VI_1 {
        state BACKUP
        interface ens33
        virtual_router_id 66
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 123456
        }
        virtual_ipaddress {
            10.0.3.96
        }
    }
    

    Nginx存活状态检测脚本:(目前没有添加这个配置,放在这里是让大家知道有这个东西)

    #!/bin/bash
    A=`ps -C nginx–no-header |wc -l`
    if [ $A -eq 0 ];then
        /usr/local/nginx/sbin/nginx
    sleep 2
    if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
    killallkeepalived
    fi
    fi

    现在启动两台虚拟机的keepalived

    systemctl start keepalived

    此时ping 10.0.3.96会有反应,必须能ping通

    PS:这种配置方法,会出现在ifconfig无法找到virtual_ipaddress的情况,但是可以正常ping通,整个keepalived也可以正常使用。这个以后熟悉了再回来补充

    测试实验效果

    尝试从外界访问10.0.3.96,优先访问46,因为46的优先级101比另一台的优先级100大

     现在我们把虚拟机B上的keepalived服务停掉,再次访问,发现切换到虚拟机B上了(该nginx默认页面我没有进行修改)

     现在把虚拟机A的keepalived重新启动

    题外话扩展:

    另外,还有一个关于Nginx的session(会话)处理问题,之前面试的时候被问过,一脸懵逼,所以这里顺便提一下

    解决方法

    1.Nginx配置ip_hash,使client访问的服务器固定

    2.使用Redis等缓存会话

    3.设置使用浏览器本地cookie

  • 相关阅读:
    2016北京集训测试赛(十四)Problem A: 股神小L
    2016北京集训测试赛(十三) Problem B: 网络战争
    BZOJ 3473 字符串
    2016北京集训测试赛(十一)Problem C: 树链问题
    微信服务号登陆优化
    重新认识下数组的concat方法
    微信服务号开发碰到的缓存问题!
    关于微信服务号开发的一些总结!
    JQ-weui中的日期选择控件关于时间段的设置!
    用json方法来作深拷贝应该知道的一点东西!
  • 原文地址:https://www.cnblogs.com/biaopei/p/8618050.html
Copyright © 2011-2022 走看看