• Keepalived+Nginx提供前端负载均衡+主从双机热备+自动切换


    原文链接:http://unun.in/linux/156.html

    方案:

    采用两台Nginx服务器作为前端,提供静态web内容,分发web请求,一主一从,Keepalived实现状态监测,保证 Nginx正常对外提供服务,即主Nginx服务进程死掉之后,keepalived能够通过脚本或者程序检测机制,将网站的访问切换到从Nginx上 来。后端的web应用服务器的监控由Nginx负责,keepalived只监控Nginx的健康状况。

    性能:大约是硬件负载均衡器的10%

    优势:虽然性能远弱于LVS+Keepalived方案,但Nginx本身就是web服务器,可处理静态文件,页面缓存,rewrite等WEB容器功能,在web前端的负载均衡应用优先选用此方案。

    应用情景:作为web应用服务器集群前端的负载均衡器。

    环境:

    操作系统:centos6.5

    Keepalived版本: keepalived-1.2.13.tar.gz

    nginx版本:nginx-1.6.2.tar.gz

    主机IP

    Node0:192.168.99.138

    Node1:192.168.99.155

    虚拟IP: 192.168.99.168

    后端WEB服务器IP:

    ng2:192.168.99.152

    ng3:192.168.99.135

    ----------------------------------------------------

    这里我们选用的是lnmp环境,LNMP环境的可以自己编译安装,这里也有一个简单的配置教程:centos + nginx + php-fpm +mysql的简单配置,生产环境中最好自己编译安装。

    ----------------------------------------------------

    keepalived安装配置步骤:

    1.1 下载keepalived,官网下载地址:http://www.keepalived.org/download.html

    cd /usr/local/src/
    wget http://www.keepalived.org/software/keepalived-1.2.13.tar.gz

    不得不说的是keepalived的下载速度慢成翔,最终也是没有wget下载下来,我传到oschina上了

    下载地址:http://git.oschina.net/xiaoshusheng/Slow-download-speed/tree/master/keepalived

    1.2 解压、并编译安装keepalived

    tar -zxvf keepalived-1.2.13.tar.gz
    cd keepalived-1.2.13
    ./configure --prefix=/usr/local/keepalived
    make && make install

    2.1 设置环境变量和init.d,配置conf文件

    cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
    cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
    cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
    mkdir /etc/keepalived
    cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived
    vi /etc/keepalived/keepalived.conf

    Node1 这部分按照以下修改,其它的默认就行

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

    Node0 这部分按照以下修改,其它的默认就行

    vrrp_instance VI_1 {
        state BACKUP
        interface eth0
        virtual_router_id 51
        priority 99
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.99.168
        }
    }

    这里是让node1当的主,node0做的从,其他的部分,可以酌情根据自己的实际情况来做出相应的修改!

    其实除了global_defs{}和vrrp_instance VI_1{}两个括着的留下来,其它的配置部分可以删掉

    启动keepalived

    /etc/init.d/keepalived start

    使用ip addr 查看虚拟ip是否已绑定,

    Node1的结果:

    Node0的结果:

    可以看到Node1在接管着虚拟ip(VIP)。

    ----------------------------------------------------

    2.1 nginx的安装,请参见:centos + nginx + php-fpm +mysql的简单配置的nginx配置部分,或者:本帖的部分内容:http://unun.in/linux/153.html

    ----------------------------------------------------

    3.1 nginx的反向代理和负载均衡请参考:使用nginx做反向代理及负载均衡

    ----------------------------------------------------

    让keepalived监视nginx状态

    4.1 安装nmap

    yum install -y nmap

    这里直接yum安装了,如果你编译安装也可以,这里不做过多说明了

    4.2 编写shell脚本,检查端口是否open,如果不是,重启一下,仍然不是,那就废掉

    vi /opt/chk_nginx.sh

    加入如下内容:

    #!/bin/bash
    # check nginx server status
    NGINX=/usr/local/nginx/sbin/nginx
    PORT=80
    nmap localhost -p $PORT | grep "$PORT/tcp open"
    #echo $?
    if [ $? -ne 0 ];then
        $NGINX -s stop
        $NGINX
        sleep 3
        nmap localhost -p $PORT | grep "$PORT/tcp open"
        [ $? -ne 0 ] && /etc/init.d/keepalived stop
    fi

    编写完脚本,别忘了给予它可执行的权限,否则无效

    cd /opt/
    chmod +x chk_nginx.sh

    ----------------------------------------2015.08.03更-------------------------------

    再次修改keepalived.conf

    vi /etc/keepalived/keepalived.conf

    在配置里面增加这两部分内容

    vrrp_script chk_http_port {
        script "/opt/chk_nginx.sh"
        interval 2
        weight 2
    }

    然后在vrrp_instance VI_1中增加如下配置

    track_script {
      chk_http_port
    }

    配置的最终结构样子该是这样的,注意前面说的主从配置的区别,这里是个主的最终配置:

    global_defs {
       router_id LVS_DEVEL
    }
    vrrp_script chk_http_port {
        script "/opt/chk_nginx.sh"
        interval 2
        weight 2
    }
    vrrp_instance VI_1 {
        state MASTER
        interface eth0
        virtual_router_id 51
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.99.168
        }
        track_script {
            chk_http_port
        }
    }


    更进一步,为了避免启动keepalived之前没有启动nginx , 可以在/etc/init.d/keepalived的start中首先启动nginx:

    vi /etc/init.d/keepalived

    将start()部分修改为如下样子

    start() {
        /usr/local/nginx/sbin/nginx
        sleep 3
        echo -n $"Starting $prog: "
        daemon keepalived ${KEEPALIVED_OPTIONS}
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
    }

    ------------------------------------------------------------------------------

    检测是否成功

    关闭nginx,重启keepalived,查看虚拟IP是否被接管

    /etc/init.d/keepalived restart

    在Node1(主)上使用

    ip addr

    可以看到,虚拟IP已被Node1(主)接管

    然后用虚拟ip:192.168.99.168访问,访问正常

    使用netstat -ltunp命令查看是否nginx存在:结果存在

    然后干掉主服务的nginx进程

    再使用netstat -ltunp命令查看nginx是否重启:结果已经重启

    然后再干掉主服务的nginx进程

    再使用netstat -ltunp命令查看nginx是否重启:结果已经重启

    使用service keepalived status查看keepalived状态:结果显示:keepalived (pid  2439) is running...

    修改Node1上的nginx配置,故意制造错误,然后杀掉nginx进程

    使用netstat -ltunp命令查看nginx状态:已经起不来了

    然后使用service keepalived status查看keepalived状态:结果显示:keepalived is stopped

    然后访问虚拟ip:192.168.99.168,依然能够正常访问

    在Node0(从)上使用ip addr查看,发现虚拟IP已被Node0(从)接管

    使用netstat -ltunp命令查看是否nginx存在:结果存在

    然后干掉主服务的nginx进程

    再使用netstat -ltunp命令查看nginx是否重启:结果已经重启

    在切换到Node1(主)上,将nginx的配置修改正确,然后启动keepalived

    /etc/init.d/keepalived start

    在使用ip addr命令查看,发现虚拟IP已被Node1(主)重新接管

    使用netstat -ltunp命令查看nginx状态:已被启动

    通过上面测试可以发现,可用性大大提高,克服了负载均衡器的单点问题,但是从负载均衡器很多时间处于闲置状态,还是有一定的浪费的!

  • 相关阅读:
    python之virtualenv
    Markdown学习
    Python之进程(multiprocessing)
    python之concurrent.futures模块
    Python之线程
    LoadRunner(四)、检查点
    LoadRunner(三)、关联
    LoadRunner(二)、录制
    LoadRunner(一)、安装
    Jmeter(十九)逻辑控制器之if控制器
  • 原文地址:https://www.cnblogs.com/mr-amazing/p/4739098.html
Copyright © 2020-2023  润新知