拓撲圖以下:php
實現思路是:master的優先級爲100,backup的優先級爲99;在master上面配置一個檢測nginx監控狀態的腳本(backup不用配置),當發現master的nginx故障後將master的優先級減2爲98,使其backup優先級比master高,bakup獲取到vip對外提供服務;nginx
當master服務器上面的nginx服務恢復正常後,master的優先級不減2恢復原來的100,master獲取到vip對外提供服務vim
郵件報警實現思路:使用keepalived的狀態轉換執行腳本參數notify_master|notify_backup;當角色變爲master或backup時去調用發送郵件的腳本給指定用戶發送郵件通知centos
Keepalived_master配置文件:bash
---------------------------------------------------------------------------------------------服務器
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配置文件:ide
---------------------------------------------------------------------------------------------工具
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 } }
上面用到的腳本代碼信息post
chk_nginx.sh腳本信息ui
---------------------------------------------------------------------------------------------
#!/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
配置發送報警郵件:
一、 安裝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 ]
二、安裝郵件發送工具mailx 。(郵件用戶代理MUA)
[root@ssticentos65 ~]# yum -y install mailx #在線安裝mailx
三、 配置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 ##登陸,默認便可