方案:

采用两台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环境的可以自己编译安装。


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

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{}两个括着的留下来,其它的配置部分可以删掉

参数说明

global_defs: 全局配置标识,表面下面的区域{}是全局配置

notification_email: 里面填邮箱地址,如果keepalived在发生诸如切换操作时会的发邮件到配置上的邮箱,邮件地址可以多个,每行一个

notification_email_from:表示发送通知邮件时邮件源地址是谁

smtp_server:表示发送email时使用的smtp服务器地址,可以填127.0.0.1

smtp_connect_timeout:连接smtp超时时间

vrrp_instance:各服务器上实例配置域,这里按本服务器的具体情况填值

state:本实例启动状态,MASTER/SLAVE,不管填MASTER/SLAVE,最终还是要看本机器的权重。

interface:实例绑定的网卡,因为在配置虚拟IP的时候必须是在已有的网卡上添加的,这里按本机情况而定

virtual_router_id:这里设置VRID,如果两台机器是同一个备份组,设置一样

priority:设置本节点的优先级,优先级高的为master,不能超过255

advert_int:组播信息发送间隔,同一个备份组两个机器设置必须一样,默认是1S

authentication:验证域,同组的机器auth_type(验证类型)和auth_pass(验证密码)必须一样

virtual_ipaddress:VIP,为master机器设置的虚拟地址,和实例绑定的网卡(interface)设置到一个网段

启动keepalived

/etc/init.d/keepalived start

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

Node1的结果:

图1

Node0的结果:**
**

图2

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


2.1 nginx的安装,请自行解决。


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

下载地址:http://pan.baidu.com/s/1kVFcGV9

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

cd /opt/
chmod +x chk_nginx.sh

再次修改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状态:已被启动

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

出现的问题记录

  1. 在配好主从备份之后,发现虚拟IP能ping通,但是访问虚拟IP对应机器上的服务(不是apache或者mysql之类的公用软件)却不成功,这是因为要访问的服务绑定了主机上的一个实体IP不是INADDR_ANY地址,所以连接不上。

2.记得设置防火墙和关闭selinux策略

关闭selinux

vi /etc/sysconfig/selinux
修改:
SELINUX=disabled
#setenforce 0

配置iptables,添加VRRP通讯支持

iptables -A INPUT -d 192.168.99.168 -j ACCEPT