nginx keepalive 高可用

在网络中机器不可避免的出现单点故障,当我们使用nginx进行反向代理的时候如果出现了nginx机器宕机,那么整个服务就会出现不可用的状态。那么我们针对这种情况我们该如何解决它呢?使用keepalive可以解决这个问题。那么什么是keepalived呢?

Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以利用其来避免单点故障。一个LVS服务会有2台服务器运行Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟IP,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候, 备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。

下面我们就来配置基于keepalived的nginx的高可用方案:

准备条件: 
1.启动两台虚拟机.e.g.:

192.168.64.128
192.168.64.129

2.两台虚拟机上分别安装nginx,可参考 – Linux Nginx安装 
3.修改nginx的html文件,(NGINX_HOME/html/index.html),来标识它属于哪台虚拟机。如下所示:

1) 192.168.64.128

这里写图片描述

2) 192.168.64.129

这里写图片描述

1、下载keepalive

keepalived官网下载你所需要的版本,我所下载的为:keepalived-1.3.4.zip

2、上传到Linux

使用Linux中的rz/sz命令把zip包上传到

/carl/data/program

并创建keepalive,把源文件和安装文件区分开来。

/carl/data/program/keepalive

3、解压keepalived

unzip keepalived-1.3.4.zip

然后

cd keepalived-1.3.4

4、安装keepalived

4.1.配置keepalived安装目录

./configure --prefix=/carl/data/program/keepalived --sysconf=/etc

注意:

1:keepalive启动时候会默认读取/etc/keepalived/keepalived.conf 
2:可能出现缺少依赖opensssl 。

yum install openssl-devel

4.2)编译keepalived

make && make install

4.3) keepalived创建快捷方式

ln -s /carl/data/program/keepalived/sbin/keepalived /sbin/  --建立软链接
cp //data/program/keepalived-1.3.4/keepalived/etc/init.d/keepalived /etc/init.d

4.4) 添加keepalived到系统服务

chkconfig –add keepalived  -- 添加到系统服务
chkconfig keepalived on    -- 检测是否添加成功

4.5) 启动keepalived

service keepalvied start|stop|restart

可能出现会出现提示权限不足:

chmod +x /etc/init.d/keepalived

4.6) 修改keepalive配置文件

以上步骤对于两台虚拟机都是一样的。这里修改配置文件就涉及到主从问题,在这里我们把192.168.64.128配置为主服务器,把192.168.64.129配置为从服务器。下面我们就先来配置192.168.64.128:

vi /etc/keepalived/keepalived.conf

以下是修改后的配置文件:

global_defs {
    ## 设置lvs的id,在一个网络内唯一
    router_id LVS_DEVEL
}
vrrp_instance VI_1 {
    ## 主机配置,从机为BACKUP
    state MASTER
    ## 网卡名称
    interface eno16777736
    virtual_router_id 51
    ## 权重值,值越大,优先级越高,backup设置比master小,这样就能在master宕机后讲backup变为master,而master回复后就可以恢复.
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        ## 同一网段虚拟IP
        192.168.64.100
    }
}

virtual_server 192.168.64.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 192.168.64.128 80 {
        weight 1
        TCP_CHECK{
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}

下面我们来看一下从机192.168.64.129的配置:


global_defs {
   router_id LVS_DEVEL
}
vrrp_instance VI_1 {
    state BACKUP
    interface eno16777736
    virtual_router_id 51
    priority 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
         192.168.64.100
    }
}

virtual_server 192.168.64.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 192.168.64.129 80 {
        weight 1
        TCP_CHECK{
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}

4.7) 重启keepalived

分别重启两台虚拟机的keepalived,当我们访问上面配置同一网段的虚拟IP地址: 
192.168.64.100访问的就是主服务器:192.168.64.128

这里写图片描述

并且当我们关闭掉主机也就是192.168.64.128的keepalived时,就会访问从机的nginx服务:

这里写图片描述

5、配置keepalived的日志

5.1、修改/etc/sysconfig/keepalived

vi /etc/sysconfig/keepalived

修改为:

KEEPALIVED_OPTIONS="-D -d -S 0"

“-D” 就是输出日志的选项 
这里的“-S 0”表示local0.* 具体的还需要看一下/etc/syslog.conf文件

5.2、修改/etc/rsyslog.conf

在/etc/rsyslog.conf中添加以下代码:

local0.*  /var/log/keepalived.log

5.3、重新启动keepalived和rsyslog服务

service rsyslog restart
service keepalived restart

然后就可以查看keepalived的日志了:

tail -f /var/log/keepalived.log

这里写图片描述

再修改keepalived配置文件如果没有生效可以配置keepalived的日志来帮助你修改配置文件。

6、检测Nginx心跳

当我们配置了keepalived,当主keepalived的宕机了。会自动更改路由到backup的keepalived,但是如果nginx挂掉的话,keepalived就会找不到nginx服务这样还是会造成nginx服务不可用。那么我们就可以在keepalived中添加心跳script,用来检测nginx心跳,如果检测不到nginx服务,就关闭掉keepalived的进程。这样从机的keepalive服务就可以被调用。

下面就是检测nginx的心跳脚本

/carl/data/program/nginx/sbin/check_nginx_alive.sh

脚本编写完成可以通过 bash check_nginx_alive.sh测试脚本

#!/bin/sh

PATH=/bin:/sbin:/usr/bin:/usr/sbin

A=`ps -C nginx --no-header |wc -l`

if [ $A -eq 0 ]
   then
     echo 'nginx server is died'
     killall keepalived
fi

然后再在修改/etc/keepalived/keepalived.conf文件:

## 1.new add start
vrrp_script check_nginx_alive {
    script "/carl/data/program/nginx/sbin/check_nginx_alive.sh"
    interval 3
    weight -10
}
## 1.new add end

global_defs {
    router_id LVS_DEVEL
}
vrrp_instance VI_1 {
    state MASTER
    interface eno16777736
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.64.100
    }
    ## 2.new add start
    track_script {
        check_nginx_alive
    }
    ## 2.new add end
}

virtual_server 192.168.64.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 192.168.64.128 80 {
        weight 1
        TCP_CHECK{
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }

}

上面是主机192.168.64.128的配置,可以看到一共新添加了两个地方,主要是添加了一个shell脚本用于检测nginx是否存活,然后再在keepalived的配置文件中,添加这个这个检测心跳的文件。这个是主机的配置,那么从机也需要做相应的修改。那么不管是keepalived宕机还是nginx宕机都会切换到可以热备的机器中去,这样就达到了nginx的可高用。

猜你喜欢

转载自blog.csdn.net/qq_19546289/article/details/81199937
今日推荐