实验环境

  操作系统:CentOS 7.4 1708

  软件安装:yum -y install epel-release && yum -y install nginx keepalived

  Nginx+Keepalived NodeA:18.50.129.72(master)

  Nginx+Keepalived NodeB:18.50.129.73(slave)

  VIP:18.50.129.74

实现目标

  1. 当Nginx服务停止后Keepalived会自动去启动此服务,如果无法启动将VIP转移至Slave节点

  2. 当Master节点Nginx配置文件更新后,Slave节点的Nginx配置文件及时同步

Node1的Keepalived配置

! Configuration File for keepalived

global_defs {
   router_id NodeA              #路由器标识,最好写主机名,用于标识
}

vrrp_script chk_nginx {
#配置检查方式,chk_nginx为自定义名称
    script "/etc/keepalived/nginx_check.sh"
    interval 2
    weight 20                   #此值需要大于MASTER的priority减去BACKUP的priority
}

vrrp_instance VI_1 {
    state MASTER                #主节点为:MASTER,备节点为:BACKUP
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
    #此为认证方式,MASTER和BACKUP统一
        auth_type PASS
        auth_pass 1314
    }
    track_script {
    #调用上面的检查脚本
        chk_nginx
    }
    virtual_ipaddress {
    #设定VIP地址
        18.50.129.74/24
    }
}

Node2的Keepalived配置

! Configuration File for keepalived

global_defs {
   router_id NodeB
}

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 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1314
    }
    track_script {
        chk_nginx
    }
    virtual_ipaddress {
        18.50.129.74/24
    }
}

nginx_check.sh脚本内容:

#!/bin/bash

A=`ps -C nginx --no-header | wc -l`
if [ $A -eq 0 ];then
    nginx
    sleep 2
    if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then
        pkill keepalived
    fi
fi

脚本说明:

  1. 脚本逻辑为检测进程如果没有nginx就尝试启动一次,然后等礴两秒,再检测,如果还没有上进程就结束keepalived进程。这样VIP就会移动到备份节点

  2. 我这里是yum安装的Nginx,所以直接使用nginx命令可以启动nginx,如果你是源码安装,或者需要配置下环境变量或者更改下启动命令和绝对路径,并测试是否能正常启动

  3. 如果觉得等待两秒的时候过长可以更改为1秒

启动服务:

  在NodeA和NodeB执行后面命令:systemctl start keepalived

测试:

  1. 查看两个节点的Nginx服务是否启动成功,如果keepalived启动成功会调用启动Nginx,前提需要保证Nginx能正常启动

  2. 在Master故意更改错Nginx配置文件,并停止Nginx服务过几秒查看VIP是否已经移动至NodeB,正常是会移动到NodeB节点

  3. 恢复Master节点,查看VIP是否回到Master,正常VIP会绑定到Master

小知识:

查看VIP使用:ip addr 命令

keepalived日志默认记录在:/var/log/messages


最后关于Nginx配置文件同步问题,我只说明了一下思路,不作演示,可以参考我自动运维上关文章, 我们可以使用salt来管理Nginx的配置文件,这样就可以做到指的更新,这样就解决了我们多台Nginx配置文件同步问题