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状态:已被启动

 

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

posted @ 2015-08-18 12:50  笑笑别人  阅读(714)  评论(0编辑  收藏  举报