Keepalived实现高可用Nginx

        Keepalived是一个高性能的服务器高可用或热备解决方案,Keepalived主要用来防止服务器单点故障发生的问题,可以通过其与Nginix的配合来实现Web服务端的高可用。

      关于安装Keepalived我这里就不介绍了,网上的一大堆,但是注意的是,一般我们会将Keepalived安装成系统服务。

     下面最主要是keepalived的配置文件和检测nginx的脚本文件。我们现在做两个Nginx的高可用。

下面是Master的Keepalived.conf:

! Configuration File for keepalived
 
global_defs {
   router_id hyf112 ##标识节点的字符串,通常为hostname
}
## keepalived 会定时执行脚本并且对脚本的执行结果进行分析,动态调整vrrp_instance的优先级。这里的权重weight 是与下面的优先级priority有关,如果执行了一次检查脚本成功,则权重会-20,也就是由100 - 20 变成了80,Master 的优先级为80 就低于了Backup的优先级90,那么会进行自动的主备切换。
vrrp_script chk_nginx {
    script "/etc/keepalived/nginx_check.sh" ##执行脚本位置
    interval 2 ##检测时间间隔
    weight -20 ## 如果条件成立则权重减20(-20)
}
## 定义虚拟路由 VI_1为自定义标识。
vrrp_instance VI_1 {
    state MASTER   ## 主节点为MASTER,备份节点为BACKUP
    ## 绑定虚拟IP的网络接口(网卡),与本机IP地址所在的网络接口相同(我这里是eth0)
    interface eth0 
    virtual_router_id 112  ## 虚拟路由ID号(主备要一致)
    mcast_src_ip 192.168.1.112  ## 本机ip地址
    priority 100  ##优先级配置(0-254的值)
    Nopreempt  ##
    advert_int 1 ## 组播信息发送间隔,俩个节点必须配置一致,默认1s
    authentication { 
        auth_type PASS
        auth_pass hyf  ## 真实生产环境下对密码进行匹配
    }
 
    track_script {
        chk_nginx  ##vrrp_script
    }
 
    virtual_ipaddress {
        192.168.1.110 ## 虚拟ip(vip),可以换行指定多个
    }
}

Backup节点的keepalived.conf:

! Configuration File for keepalived
 
global_defs {
   router_id hyf113
}
 
vrrp_script chk_nginx {
    script "/etc/keepalived/nginx_check.sh"
    interval 2
    weight -20
}
 
vrrp_instance VI_1 {
    state BACKUP   ##备节点
    interface eth0
    virtual_router_id 112  ##主备一致
    mcast_src_ip 192.168.1.113
    priority 90 ##优先级配置
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass hyf
    }
 
    track_script {
        chk_nginx
    }
 
    virtual_ipaddress {
        192.168.1.110
    }
}

keepalived.conf需要注意的点:

    1、首先关于优先级,减去权重后要能区分出哪个权重更高

    2、vrrp_instance中的virutal_router_id,记得是主备一致,不然虚拟IP不按优先级分配

    3、vrrp_instance中的advert_int,主备一定要一致

    4、vrrp_instance中的interface是当前IP所在网络接口

检测Nginx脚本(主备一样):

    1、先通过命令看nginx是否在启动中,

    2、如果没启动就命令启动nginx,然后休眠2秒让足够时间启动nginx

    3、再次通过命令查看nginx是否已经启动,如果还是没启动就直接kill掉keepalived

#!/bin/sh
A = `ps -C nginx --no-header | wc -l`
if [ $A -eq 0];then
    /usr/local/nginx/sbin/nginx
    sleep 2
    if [`ps -C nginx --no-header | wc -l`];then
        killall keepalived
    fi
fi

测试:首先启动两台服务器的nginx和keepalived

1、看两台机器的ip a命令下谁有虚拟ip。很明显112的权重比113的权重大,虚拟ip必须在112机子上。

浏览器访问虚拟IP192.168.1.110:

2、停掉主节点112的keepalived,看是否会切换到113.

先用ip a命令看是否虚拟IP移到113机子上:

继续访问浏览器看看:

3、我们假如重新启动112机子的keepalived服务,可以发现nginx也被一起启动了,而且虚拟ip肯定是重新移到112机子上,因为112的权重是100,而113是90.

访问浏览器:

4、我们可以测试在nginx出现问题的情况下,实现切换,这个时候我们只需要把nginx的配置文件进行修改,让其变得不可用,然后强杀掉nginx进程即可,发现也会实现自动切换服务器节点。

猜你喜欢

转载自blog.csdn.net/Howinfun/article/details/83044974