拓扑图如下:

实现思路是:master的优先级为100,backup的优先级为99;在master上面配置一个检测nginx监控状态的脚本(backup不用配置),当发现master的nginx故障后将master的优先级减2为98,使其backup优先级比master高,bakup获取到vip对外提供服务;

master服务器上面的nginx服务恢复正常后,master的优先级不减2恢复原来的100,master获取到vip对外提供服务

 

邮件报警实现思路:使用keepalived的状态转换执行脚本参数notify_master|notify_backup;当角色变为master或backup时去调用发送邮件的脚本给指定用户发送邮件通知

Keepalived_master配置文件:

---------------------------------------------------------------------------------------------

global_defs {
   router_id proxy-master             ##定义设备的名称
}
vrrp_script chknginx {                  ##定义nginx健康检查脚本
        script "/etc/keepalived/scripts/chk_nginx.sh"         ##健康检查脚本存放路径
        interval 3             ##每多少秒进行一次健康检查
        weight -2             ##检查失败优先级减2
    }
vrrp_instance VI_1 {                 ##定义一个备份实例
    state MASTER                 ##此服务器为master状态
    interface ens33                 ##vip绑定到哪块网卡
    virtual_router_id 1          ##热备组id,同一个组id要一致
    priority 100                     ##当前设备的优先级
    advert_int 3                     ##备份组内多久进行一次健康检查
    notify_master "/etc/keepalived/scripts/mail.sh Master" ##状态为master时发送邮件脚本
    notify_backup "/etc/keepalived/scripts/mail.sh Backup" ##状态为backup时发送邮件脚本
    authentication {                 ##实例间认证的信息
        auth_type PASS             ##认证的类型
        auth_pass putianhui      ##认证的密码
    }
    virtual_ipaddress {                 ##设置vip的地址
        192.168.2.254 dev ens33 label ens33:1 ##设置vip并添加一个网卡别名
    }
    track_script {
        chknginx                     ##调用nginx健康检查
    }


Keepalived_backup配置文件:

---------------------------------------------------------------------------------------------

global_defs {
   router_id proxy-slave ##定义此设备的名称
}
vrrp_instance VI_1 {                     ##定义热备组实例
    state BACKUP                     ##此服务器为备份状态
    interface ens33                 ##vip绑定到哪块网卡
    virtual_router_id 1             ##热备组id,同一个组id要一致
    priority 99                     ##当前设备的优先级
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass putianhui         ##认证的密码,同一个组密码要一致
    }
    virtual_ipaddress {
        192.168.2.254 dev ens33 label ens33:1
    }
}


上面用到的脚本代码信息

chk_nginx.sh脚本信息

---------------------------------------------------------------------------------------------

#!/bin/bash
#判断80端口是否存在,不存在就退出返回1
#返回1就是判定监控检查失败,0为正常
LISTEN_PORT=80
STATUS=`/usr/bin/netstat -anpt | grep "$LISTEN_PORT" | grep -v grep |wc -l`
if [ "$STATUS" -eq 0 ];then
#   /usr/sbin/nginx
   sleep 5
   if [ "$STATUS" -eq 0 ];then
      exit 1
   else
      exit 0
   fi
else
   exit 0
fi


mail.sh发送邮件报警脚本信息

---------------------------------------------------------------------------------------------

#!/bin/bash
#使用mailx向指定用户发送邮件
#$1为keepalived状态发生变化执行脚本传进来的第一个参数
#[email protected]为接收报警邮件的用户邮箱地址
NAME="Proxy_master Server"
TIME=$(date +%F_%H:%M)
echo "${TIME}--${NAME} status is $1" | mail -s "${NAME} status is $1"  [email protected]


配置发送报警邮件:

1、  安装sendmail或postfix (邮件传送代理MTA),本教程使用sendmail软件。

(标注:如果直接使用外部邮箱【qq企业邮和网易企业邮等】发送邮件可以不需要配置sendmail或postfix,直接把这两个软件关掉,直接跳到第3步:配置mail即可实现) 

[root@ssticentos65 ~]# yum -y install sendmail                #在线yum安装sendmail
[root@ssticentos65 ~]# /etc/init.d/sendmail start             #启动sendmail服务
[root@ssticentos65 ~]# /etc/init.d/sendmail status          #查看sendmail启动情况
sendmail dead but subsys locked                            #sendmail进程锁住,原因是postfix服务启动导致sendmail服务进程锁住,需要关闭postfix服务。
sm-client (pid  1759) is running...
[root@ssticentos65 ~]# /etc/init.d/postfix stop                #暂停postfix服务提示失败,原因是postfix进程正在使用,需要使用kill命令杀掉postfix进程
Shutting down postfix:                                     [FAILED]
[root@ssticentos65 ~]# /etc/init.d/postfix status                #查看postfix服务可以查看到进程号
master (pid  1647) is running...
[root@ssticentos65 ~]# kill -9 1647                                     #杀掉postfix服务进程号
[root@ssticentos65 ~]# /etc/init.d/postfix status                #查看postfix状态
master dead but pid file exists
[root@ssticentos65 ~]# chkconfig postfix off                      #设置postfix开机不启动
[root@ssticentos65 ~]# /etc/init.d/sendmail stop               #暂停sendmail服务
Shutting down sm-client:                                   [  OK  ]
Shutting down sendmail:                                    [FAILED]
[root@ssticentos65 ~]# /etc/init.d/sendmail start                 #启动sendmail服务
Starting sendmail:                                         [  OK  ]
Starting sm-client:                                        [  OK  ]

2、安装邮件发送工具mailx 。(邮件用户代理MUA)

[root@ssticentos65 ~]# yum -y install mailx                     #在线安装mailx

3、  配置mail

[root@ssticentos65 ~]# vim /etc/mail.rc
set  [email protected]    ##设置发件人的邮箱地址
set  smtp=smtp.exmail.qq.com   ##设置发件人的smtp地址
set smtp-auth-user="[email protected]" smtp-auth-password="XXXXXXX" ##设置发件的账号和密码(qq邮箱有可能会需要授权码,密码有时候不行)
set  smtp-auth=login     ##登录,默认即可