负载均衡-Keepalived高可用

准备工作

本文我们采用Nginx + Keepalived的方式构建高可用的负载层。准备两台Nginx的主机,保证两台Nginx主机能够被外网访问;安装两台Nginx的虚拟机IP地址分别是:

Nginx Master:172.16.200.1

Nginx Slave:172.16.200.2

VIP:172.16.200.3

访问相关的地址,确保两台Nginx都是可用的:

nginx Master:

img

nginx Slave:

img

组网拓扑如下:

img

Nginx的安装在我的博客前文中有写、也可以自行百度、这里我就不再详细描述了。

1、Keepalived安装

我们的目标是“在一台工作的Nginx崩溃的情况下,系统能够检测到,并自动将请求切换到另外一台备份的Nginx服务器上”。所以,之前安装的两台Nginx,Master服务器是主要的工作服务器,Slave服务器是备份服务器,在Master服务器出现问题后,由Slave服务器接替其工作。如下图所示(外网的请求使用一个由keepalived控制的虚拟的浮动IP进行访问):

img

www.keepalived.org 官网下载keepalived的稳定版本,我下载的是最新版2.0.19。

解压,并且安装。(安装的时候我们可通过prefix参数指定安装目录、当然我们也可以默认安装)

# 解压目录:
tar -zxvf keepalived-2.0.19.tar.gz
# 进入解压目录并指定安装位置:
./configure –prefix=/usr/local/keepalived
# 执行编译和安装命令:
make & make install

安装完成后我们把keepalived添加到centos的系统服务中,我们需要拷贝一些文件到指定的路径下:

# 将keepalived主程序加入到环境变量/usr/sbin/目录下:
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/

# 将keepalived启动脚本变量引用文件放到/etc/sysconfig/目录下:
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived

# 将keepalived启动脚本(源码目录下),放到/etc/init.d/目录下:
cp keepalived-2.0.19/keepalived/etc/init.d/keepalived  /etc/rc.d/init.d/keepalived

# 将配置文件放到默认路径下:
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf
# 设置执行权限:
chmod +x /etc/init.d/keepalived

# 注册成服务:
chkconfig –add keepalived

# 设置开机启动:
chkconfig keepalived on

# 然后我们就可以使用下面的命令来管理keepalived啦
systemctl status keepalived
systemctl start keepalived
systemctl stop keepalived

2、Nginx状态检查

在正式介绍Nginx + Keepalived的配置前,我们首先介绍一下如何检查Nginx的状态。只有能够正确检查Nginx的状态,才能在Nginx节点出现问题的情况下,切换到另一台Nginx上接替其工作。

Nginx为什么会停止响应呢?无非有以下几种情况:

1、Nginx的所有进程被强行终止(或管理进程)。这种情况,是我们需要检查和切换的。无论什么情况下进程被终止了,如果它不能重启,我们就要切换到备机。

2、Nginx日志盘的挂载点崩溃或者磁盘写满。这个也是我们需要检查和切换的。

3、Nginx已经达到设置的最大连接数,暂时停止响应。这种情况下,我们不能进行备机切换,因为通过VIP:172.16.200.3连接过来的用户请求比较多(在我们优化参数后,可以达到65535 / 4的数量),一旦我们进行备机切换,这些用户请求将全部异常。这个问题的解决需要靠增加负载机器,而不是主备切换。

4、Nginx物理机异常关机。这个肯定是需要进行检查和切换的。

检查脚本如下:

#!/bin/sh
if [ $(ps -C nginx –no-header | wc -l) -eq 0 ]; then
    /usr/nginx/sbin/nginx
    fi
    sleep 2
    if [ $(ps -C nginx –no-header | wc -l) -eq 0 ]; then
        systemctl stop keepalived
fi

我们大致讲解一下“ps -C nginx –no-header | wc -l”这个命令:

– ps 这个命令用来进行Linux中进程相关的查询,-C 意思是按照进程名称进行查询。查询出来后的结果如下:

img

如果要去掉统计出来的结果表的头部,那么要使用 –no-header参数,加上参数后,查询结果如下:

img

“|”,这是Linux中的管道流命令,将上一个命令的输出结果作为下一个命令的输入;wc 统计命令,-l 参数,代表按行数进行统计。所以整个命令的输出结果为:

img

清楚了其中最关键的命令,我们再来讲解一下整个脚本的含义:第一个判断说明的是,如果当前nginx的进程数量 0,那么执行nginx的启动命令,试图重新启动nginx;接下来等待2秒(这是为了给nginx一定的启动时间),然后再次查看Nginx的进程数量,如果仍然 0,那么停止这台机器的keepalived服务,以便备用的Keepalived节点检查到Keepalived已经停止这个事件,并将浮动IP切换到备用服务器上。

注意:这段脚本是和我机器上的Nginx安装路径、Keepalived服务的状态有关的,您如果要用的话,请进行相应的更改。

3、Nginx+KeepAlived简配

首先,为了保证不会出现额外的问题,请首先关闭防火墙,当然正式环境里面,防火墙不能关闭。外网进行Nginx访问的浮动IP:172.16.200.3;我们将172.16.200.1这台服务器上运行的Nginx作为主要的Nginx,其上的keepalived服务我们设置成Master方式;我们将172.16.200.2这台服务器上运行的Nginx作为备用的Nginx服务,其上的keepalived服务我们设置为Backup方式。

注意:经过安装,keepalived配置文件的位置在“/etc/keepalived/keepalived.conf”(如果没有,请创建一个,但是经过之前的步骤,这个位置肯定是有文件的,如果没有可能是之前您的步骤出现了什么问题)。

配置Master节点:

首先我们来看看该节点的原始IP信息:

img

172.16.200.1节点上KeepAlive的的配置信息如下:

! Configuration File for keepalived
# global setting , notify email setting
global_defs {
    #存在于同一个网段中,一组keepalived的各个节点都有不同的名字
    #在全局设置中,我们还可以设置管理员的email信息等。
    router_id LVS_Master
}

#这个是我们在上一小结讲到的nginx检查脚本,我们保存在这个文件中(注意文件权限)
vrrp_script chknginx {
    script "/usr/local/keepalived/bin/checknginx.sh"
    #每10秒钟,检查一次
    interval 10
}

#keepalived实例设置,是最重要的设置信息
vrrp_instance VI_1 {
    #state状态MASTER表示是主要工作节点。
    #一个keepalived组中,最多只有一个MASTER节点,当然也可以没有
    state Master
    #实例所绑定的网卡设备,我的网卡设备是eth0。您按照您自己的来
    interface eth0
    #同一个keepalived组,节点的设置必须一样,这样才会被识别
    virtual_router_id 51
    #节点优先级,BACKUP的优先级一定要比MASTER的优先级低
    priority 100
    #组播信息发送间隔,两个节点设置必须一样
    advert_int 1
    #实际的eth1上的固定ip地址
    mcast_src_ip=172.16.200.1
    #验证信息,只有验证信息相同,才能被加入到一个组中。
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    #虚拟地址和绑定的端口,如果有多个,就绑定多个
        #dev 是指定浮动IP要绑定的网卡设备号
        virtual_ipaddress {
        172.16.200.3 dev eth0
    }

    #设置的检查脚本
    #关联上方的“vrrp_script chknginx”
    track_script {
        chknginx
    }
}

配置Slave节点:

172.16.200.2节点上KeepAlive的的配置信息如下:

! Configuration File for keepalived
global setting , notify email setting
global_defs {
    #存在于同一个网段中,一组keepalived的各个节点都有不同的名字
    #在全局设置中,我们还可以设置管理员的email信息等。
    router_id LVS_Slave
}

#这个是我们在上一小结讲到的nginx检查脚本,我们保存在这个文件中(注意文件权限)
vrrp_script chknginx {
    script "/usr/local/keepalived/bin/checknginx.sh"
    #每10秒钟,检查一次
    interval 10
}

#keepalived实例设置,是最重要的设置信息
vrrp_instance VI_1 {
    #state状态MASTER表示是主要工作节点。
    #一个keepalived组中,最多只有一个MASTER节点,当然也可以没有
    state Master
    #实例所绑定的网卡设备,我的网卡设备是eth1。您按照您自己的来
    interface eth0
    #同一个keepalived组,节点的设置必须一样,这样才会被识别
    virtual_router_id 51
    #节点优先级,BACKUP的优先级一定要比MASTER的优先级低
    priority 99
    #组播信息发送间隔,两个节点设置必须一样
    advert_int 1
    #实际的eth1上的固定ip地址
    mcast_src_ip=172.16.200.2
    #验证信息,只有验证信息相同,才能被加入到一个组中。
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    #虚拟地址和绑定的端口,如果有多个,就绑定多个
    #dev 是指定浮动IP要绑定的网卡设备号
    virtual_ipaddress {
        172.16.200.3 dev eth0
    }

    #设置的检查脚本
    #关联上方的“vrrp_script chknginx”
    track_script {
        chknginx
    }
}

注:2.0.19版本一定要注释掉# vrrp_strict、要不然keepalived服务无法启动。

启动主节点和备用节点:

以上配置中请注意几个关键点:注意nginx状态检查的脚本的位置,根据自己创建文件的位置不一样,脚本检查的指定位置也不一样;注意优先级,Master节点的优先级一定要高于所有的Slave节点。注意局域网的组播地址,一定要可用。局域网内所有keepalived节点都是利用组播方式寻找对方。最后,keepalived一定要注册成服务形式,您可以想象上面所有脚本、配置、命令如果重启后再来一次,会是什么情况。

先启动Master节点,后启动Slave节点、如果设置和启动都是成功的,您不会在日志信息中收到任何的keepalived报错信息。接下来您就可以使用VIP:172.16.200.3这个IP访问Nginx了:

img

img

为了试验,我们主动停止Master节点上的keepalived服务(注意,杀Nginx进程不起作用,因为我们的检查脚本会试图重新启动Nginx进程),接下来我们可以看到浮动IP漂移到了172.16.200.2备机上:

img

img

4、Nginx+KeepAlived非抢占模式

keepalived的切换可以是自动的,但是却做不到毫秒级别,他怎么都需要几秒钟的时间进行切换。

这就有一个问题,虽然在主节点出现问题我们转向备份节点时,这个延时无可避免,但是在我们修复主节点后,实际上并没有必要再马上做一次切换,所以Keepalived提供了一种非抢占模式,来满足这个要求。

下面我们就来介绍一下Keepalived的非抢占模式的配置(无Master节点,全部依据优先级确定哪个节点进行工作):

Master节点配置信息改动如下:

! Configuration File for keepalived
global setting , notify email setting
global_defs {
    router_id LVS_Master
}

vrrp_script chknginx {
        script "/usr/local/keepalived/bin/checknginx.sh"
        interval 10
        一旦节点失效,节点的优先级就减少2
        有多少个keepalived节点,就填写多少数量。
        这样保证这个节点的优先级比其他节点都低
        weight -2
        fall 表示多少次检查失败,就算节点失效。默认1
        fall 1
    }

    vrrp_instance VI_1 {
    #state状态都是Slave表示是主要工作节点。
    state Slave
    interface eth0
    virtual_router_id 51
    这个关键配置项,设置为“非抢占”模式
    nopreempt
    每个节点的优先级一定要不一样
    priority 100
    advert_int 1
    mcast_src_ip=172.16.200.1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    #虚拟地址和绑定的端口,如果有多个,就绑定多个
    #dev 是指定浮动IP要绑定的网卡设备号
    virtual_ipaddress {
        172.16.200.3 dev eth0
    }

    #设置的检查脚本
    #关联上方的“vrrp_script chknginx”
    track_script {
        chknginx
    }
}

备份节点的配置改动:加入“非抢占”模式的关键字、更改一个确定的优先级,设置检查失败后优先级的递减量。

推荐文章