拓扑图如下:
实现思路是: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状态发生变化执行脚本传进来的第一个参数 #XXXXXX@163.com为接收报警邮件的用户邮箱地址 NAME="Proxy_master Server" TIME=$(date +%F_%H:%M) echo "${TIME}--${NAME} status is $1" | mail -s "${NAME} status is $1" XXXXXX@163.com
配置发送报警邮件:
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 from=XX@nnv5.cn ##设置发件人的邮箱地址 set smtp=smtp.exmail.qq.com ##设置发件人的smtp地址 set smtp-auth-user="XX@nnv5.cn" smtp-auth-password="XXXXXXX" ##设置发件的账号和密码(qq邮箱有可能会需要授权码,密码有时候不行) set smtp-auth=login ##登录,默认即可