生产环境有一些服务器是heartbeat+drbd做的高可用(参考:https://blog.51cto.com/net881004/2117869),但是有时候由于各种原因会产生问题(比如脑裂),而且没有及时发现。所以做了脚本是对heartbeat、drbd服务状态进行监控、对drbd分区挂载目录进行监控,现分享如下。

脚本的执行原理可能并不好(先判断当前服务器是哪个主机名,然后将另外一台的IP、端口、密码赋值给变量,然后将本机和远程的heartbeat、drbd和挂载目录状态输出到不同的文件,最后进行相应的逻辑与或或运算,如果有问题邮件通知),希望高人指点:

#!/bin/bash

#author:gxm

#date:2018-05-15

#version:1.1

#运行脚本前请先修改相关参数,比如7-13、220-224、227-231、252行信息

HOSTNAME1="drbd1.db.com"

HOSTNAME2="drbd2.db.com"

MOUNTDIR="/store"

MAILFROM="test@163.com"

SMTPSERVER="smtp.163.com"

SMTPUSER="test@163.com"

SMTPPASSWD="123456"

CURRDATE=$(date "+%Y-%m-%d %H:%M:%S")

DRBD_HALOG=/var/log/drbd_ha.log

CURRENTHOST_HEARTBEAT_STATUS=/tmp/currenthost_heartbeat_status.txt

OTHERHOST_HEARTBEAT_STATUS=/tmp/otherhost_heartbeat_status.txt

CURRENTHOST_DRBD_DETAILED=/tmp/currenthost_drbd_detailed.txt

OTHERHOST_DRBD_DETAILED=/tmp/otherhost_drbd_detailed.txt

CURRENTHOST_DISK=/tmp/currenthost_disk.txt

OTHERHOST_DISK=/tmp/otherhost_disk.txt

#退出脚本

function force_exit()

{

echo "$CURRDATE: 脚本意外退出!" | tee -a $DRBD_HALOG

echo

exit 1;

}

# 输出日志提示

function output_notify()

{

echo $CURRDATE:$1 | tee -a $DRBD_HALOG

}

# 输出错误提示

function output_error()

{

echo "$CURRDATE:[ERROR] >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" | tee -a $DRBD_HALOG

echo "$CURRDATE:[ERROR] "$1 | tee -a $DRBD_HALOG

echo "$CURRDATE:[ERROR] <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

}

#颜色函数

function echo_colour()

{

if [ $1 -eq 0 ]

then

echo -e $CURRDATE:"\033[41;37m ${2} \033[0m" | tee -a $DRBD_HALOG

return 0

fi

if [ $1 -eq 1 ]

then

echo -e $CURRDATE:"\033[43;37m ${2} \033[0m" | tee -a $DRBD_HALOG

return 0

fi

if [ $1 -eq 2 ]

then

echo -e $CURRDATE:"\033[47;30m ${2} \033[0m" | tee -a $DRBD_HALOG

return 0

fi

if [ $1 -eq 3 ]

then

echo -e $CURRDATE:"\033[34m ${2} \033[0m" | tee -a $DRBD_HALOG

return 0

fi

if [ $1 -eq 4 ]

then

echo -e $CURRDATE:"\033[31m ${2} \033[0m" | tee -a $DRBD_HALOG

return 0

fi

}

#检测root用户

function check_user_root()

{

if [ `id -u` -eq 0 ]

then

output_notify "当前是root账号,正在执行脚本"

else

output_error "当前是非root账号,退出脚本"

force_exit

fi

}

check_user_root

#检测操作系统版本

function check_os()

{

if uname -a | grep 'el5' >/dev/null 2>&1

then

SYS_RELEASE="el5"

elif uname -a | grep 'el7' >/dev/null 2>&1

then

SYS_RELEASE="el7"

else

SYS_RELEASE="el6"

fi

}

#安装配置mailx客户端工具

function mailx()

{

yum -y install mailx

cat >> /etc/mail.rc  <

set from=$MAILFROM

set smtp=$SMTPSERVER

set smtp-auth-user=$SMTPUSER

set smtp-auth-password=$SMTPPASSWD

set smtp-auth=login

EOF

}

#检测mailx是否安装,如果没安装安装下

function check_mailx_program()

{

check_os

if [ $SYS_RELEASE = el6 ]

then

if [ ! -e /bin/mailx ]

then

echo "现在安装mailx工具!"

mailx

fi

elif [ $SYS_RELEASE = el7 ]

then

if [ ! -e /usr/bin/mailx ]

then

echo "现在安装mailx工具!"

mailx

fi

else

echo "此脚本只适用于centos6和7版本"

fi

}

check_mailx_program

#发送邮件函数的帮助

function sendmailhelp()

{

echo "eg: $0 [Subject] [address] [content_file] [file]"

echo ""

exit 1

}

#具体发送邮件函数

#$1为邮件标题,$2为收件人邮箱地址,$3为邮件内容,$4为附件(不是必须)

function sendmail()

{

if [ ! -n "$1" ]

then

sendmailhelp

fi

cDate=`date +%Y%m%d`

if [ ! -n "$2" ]

then

sendmailhelp

else

mail_to=$2

echo "      Send Mail to ${mail_to}"

fi

if [ ! -n "$4" ]

then

mail -s $1 ${mail_to}

else

mail -s $1 -a $4 ${mail_to}

fi

}

#检查操作系统版本

function check_os()

{

if uname -a | grep 'el5' >/dev/null 2>&1

then

SYS_RELEASE="el5"

elif uname -a | grep 'el7' >/dev/null 2>&1

then

SYS_RELEASE="el7"

else

SYS_RELEASE="el6"

fi

}

#获取当前主机名并给另外一台主机赋予相关远程信息

CURRENT_HOSTNAME=`hostname`

if [ $CURRENT_HOSTNAME = "$HOSTNAME1" ]

then

output_notify "当前服务器主机名为$CURRENT_HOSTNAME"

OTHER_HOST="192.168.40.52"

OTHER_PROT="22"

OTHER_USER="root"

OTHER_PASSWD="123456"

elif [ $CURRENT_HOSTNAME = "$HOSTNAME2" ]

then

output_notify "当前服务器主机名为$CURRENT_HOSTNAME"

OTHER_HOST="192.168.40.54"

OTHER_PROT="22"

OTHER_USER="root"

OTHER_PASSWD="123456"

else

echo "您主机名不符合要求"

fi

#判断是否安装了expect工具

if [ ! -e /usr/bin/expect ]

then

echo "现在安装expect工具!"

yum -y install expect

fi

#远程到另外一台主机的函数

function ssh_otherhost()

{

/usr/bin/expect<

spawn ssh -t -p "$OTHER_PROT" $OTHER_USER@$OTHER_HOST "$1"

expect {

"*\(yes\/no\)?" { send "yes\r"; exp_continue}

"*password:" { send "$OTHER_PASSWD\r" }

}

expect eof

EOF

}

#将查询服务状态导出到txt文件中

function outtxt()

{

$1 > $2

ssh_otherhost "$1" > $3

}

check_os

if [ $SYS_RELEASE = el6 ]

then

outtxt "/etc/init.d/heartbeat status" "$CURRENTHOST_HEARTBEAT_STATUS" "$OTHERHOST_HEARTBEAT_STATUS"

outtxt "cat /proc/drbd" "$CURRENTHOST_DRBD_DETAILED" "$OTHERHOST_DRBD_DETAILED"

outtxt "df -h" "$CURRENTHOST_DISK" "$OTHERHOST_DISK"

elif [ $SYS_RELEASE = el7 ]

then

outtxt "systemctl status heartbeat" "$CURRENTHOST_HEARTBEAT_STATUS" "$OTHERHOST_HEARTBEAT_STATUS"

outtxt "cat /proc/drbd" "$CURRENTHOST_DRBD_DETAILED" "$OTHERHOST_DRBD_DETAILED"

outtxt "df -h" "$CURRENTHOST_DISK" "$OTHERHOST_DISK"

else

echo "此脚本只支持centos6和7"

fi

#在导出的heartbeat状态文件中查找指定关键字的函数

function server_code()

{

cat $1 | egrep "$2" >/dev/null 2>&1

reslut=$?

if [ $reslut -eq 0 ]

then

output_notify "$3"

return 0

else

output_error "$4"

return 1

fi

}

#在导出的disk文件中查找指定关键字的函数

function disk_mount_code()

{

cat $1 | egrep "$2" >/dev/null 2>&1

reslut=$?

if [ $reslut -eq 0 ]

then

output_notify "$3"

return 0

else

output_notify "$4"

return 1

fi

}

#drbd的主从状态函数

function drbd_status()

{

currenthost_drbd=`cat $CURRENTHOST_DRBD_DETAILED | grep "ro:"|awk -F" " '{print $3}'`

otherhost_drbd=`cat $OTHERHOST_DRBD_DETAILED | grep "ro:"|awk -F" " '{print $3}'`

if ([[ $currenthost_drbd = "ro:Secondary/Primary" ]] && [[ $otherhost_drbd = "ro:Primary/Secondary" ]]) || ([[ $currenthost_drbd = "ro:Primary/Secondary" ]] && [[ $otherhost_drbd = "ro:Secondary/Primary" ]])

then

output_notify "drbd主从状态正常"

return 0

else

output_error "drbd主从状态异常,请详细检查或参考$DRBD_HALOG日志"

return 1

fi

}

#drbd的同步状态函数

function drbd_status_update()

{

currenthost_drbd_update=`cat $CURRENTHOST_DRBD_DETAILED | grep "ro:"|awk -F" " '{print $4}'`

otherhost_drbd_update=`cat $OTHERHOST_DRBD_DETAILED | grep "ro:"|awk -F" " '{print $4}'`

if [[ $currenthost_drbd_update = "ds:UpToDate/UpToDate" ]] && [[ $otherhost_drbd_update = "ds:UpToDate/UpToDate" ]]

then

output_notify "drbd同步状态正常"

return 0

else

output_error "drbd同步状态异常,请详细检查或参考$DRBD_HALOG日志"

return 1

fi

}

#判断两台服务器heartbeat运行情况

check_os

if [ $SYS_RELEASE = el6 ]

then

server_code "$CURRENTHOST_HEARTBEAT_STATUS" "is running" "当前服务器heartbeat服务运行正常" "当前服务器heartbeat服务异常,请检查"

currenthost_heartbeat_code=$?

server_code "$OTHERHOST_HEARTBEAT_STATUS" "is running" "另一台服务器heartbeat服务运行正常" "另一台服务器heartbeat服务异常,请检查"

otherhost_heartbeat_code=$?

elif [ $SYS_RELEASE = el7 ]

then

server_code "$CURRENTHOST_HEARTBEAT_STATUS" "Active.*active.*running" "当前服务器heartbeat服务运行正常" "当前服务器heartbeat服务异常,请检查"

currenthost_heartbeat_code=$?

server_code "$OTHERHOST_HEARTBEAT_STATUS" "Active.*active.*running" "另一台服务器heartbeat服务运行正常" "另一台服务器heartbeat服务异常,请检查"

otherhost_heartbeat_code=$?

else

echo "此脚本只支持centos6和7"

fi

if [ $currenthost_heartbeat_code -eq 0 ] && [ $otherhost_heartbeat_code -eq 0 ]

then

echo_colour 1 "恭喜,两台服务器heartbeat服务均运行正常"

else

output_error "heartbeat服务异常,请详细检查或参考$DRBD_HALOG日志"

sendmail "heartbeat服务异常,详细见邮件正文" gxm@china.com $DRBD_HALOG

fi

#判断两台服务器挂载磁盘情况

disk_mount_code "$CURRENTHOST_DISK" "$MOUNTDIR" "当前服务器$MOUNTDIR挂载了" "当前服务器$MOUNTDIR没挂载"

currenthost_disk_code=$?

disk_mount_code "$OTHERHOST_DISK" "$MOUNTDIR" "另一台服务器$MOUNTDIR挂载了" "另一台服务器$MOUNTDIR没挂载"

otherhost_disk_code=$?

if ([ $currenthost_disk_code -eq 0 ] && [ $otherhost_disk_code -eq 1 ]) || ([ $currenthost_disk_code -eq 1 ] && [ $otherhost_disk_code -eq 0 ])

then

echo_colour 1 "恭喜,$MOUNTDIR挂载正常"

else

output_error "$MOUNTDIR挂载异常,请详细检查或参考$DRBD_HALOG日志"

sendmail "$MOUNTDIR挂载异常,详细见邮件正文" gxm@china.com $DRBD_HALOG

fi

#判断两台服务器drbd运行情况

drbd_status

drbd_status_code=$?

drbd_status_update

drbd_status_update_code=$?

if [ $drbd_status_code -eq 0 ] && [ $drbd_status_update_code -eq 0 ]

then

echo_colour 1 "恭喜,两台服务器drbd运行正常"

else

output_error "drbd运行不正常,请详细检查或参考$DRBD_HALOG日志"

sendmail "drbd服务异常,详细见邮件正文" gxm@china.com $DRBD_HALOG

fi

运行结果:

heartbeat如何监控程序_heartbeat+drbd监控脚本(自动发现问题,并邮件通知)相关推荐

  1. 监控软件自动发现功能和监控软件分布式监控配置

    监控软件自动发现功能 新添加了一台web02主机 被监控主机上,需要安装好zabbix-agent程序 编辑zabbix-agent配置文件 [root@web02 yum.repos.d]# gre ...

  2. PowerBI 报表服务器刷新失败自动重刷并邮件通知

    前言: 大家好,我是小小大世界,初来乍到,作为一名BI工作者,一直想着通过某种方式记录自己成长的点点滴滴,今天静下心来,开始写一些自己工作中的经验. 正文: 前几天看了几篇文章,提到了如何使用报表服务 ...

  3. zabbix 监控项自动发现过滤_通过Zabbix的自动发现(规则)自动创建监控项

    下图是一个已配置并启用的自动发现规则: 应用到165.194这个主机后,自动发现的监控项: 服务端配置创建Template 创建Discovery rule 键值readPorts跟被监控端配置的参数 ...

  4. zabbix 系统IO监控_自动发现

    上篇写了一个zabbix_系统IO监控,但每次都需要手动加,比较费劲,监控项跟图形都只能一个一个加 附上篇博客地址: http://xiong51.blog.51cto.com/5239058/194 ...

  5. zabbix详解之监控项自动发现(LLD)

    概述 自动发现(LLD)提供了一种为受监控节点的不同监控指标自动创建监控项,触发器和图形的分发.例如,Zabbix可以在你的机器上自动开始监控服务端口,而无需为每个服务端口手动创建监控项. 此外,可以 ...

  6. 坚持#第273天~zabbix监控2(自动发现的总结、自动注册、微信报警、linux上网)

    zabbix自动发现: 一:创建发现规则 配置-自动发现 名称:Local networkHaha IP范围:192.168.1.1-255 检查-新的ICMP ping用于与其他对象ping的通的功 ...

  7. zabbix 监控项自动发现过滤_Zabbix5.2由浅入深之官方自动发现规则初探(网络篇)

    今天的主题是官方模板的自动发现规则分析,在监控工作中常常会遇到一些可变化的OID值,也就是父OID+索引,而索引本身是变化的,如果监控设备数量固定,一个个写问题不大,但在规模增加到一定程度手动添加已然 ...

  8. zabbix 监控项自动发现过滤_Zabbix监控之配置Linux自动发现与自动注册报警

    1.关于linux客户端的部署上篇已经介绍不清楚的可以去看一下(Zabbix监控之agent和邮件报警配置) 1.1.一.配置自动发现: 1.1.1.1.1.打开Zabbix Web管理界面,创建Za ...

  9. zabbix 监控项自动发现过滤_Zabbix使用javascript+jsonpath预处理动态生成监控项

    场景模拟: 问题1:数据库空间如果太大,对性能方面有一定的影响,所以某知名企业的运维人员小智想要监控每台数据库服务器的数据库文件大小.这名运维人员目前的做法是执行查询语句,把结果存成txt文件,然后每 ...

最新文章

  1. Spring Boot-@ImportResource注解
  2. 手机计算机快速切换功能,新功能!手势导航快速切换应用功能上线~
  3. php中get结合mysql_php中,$_GET中的数值能被mySQL读到么?
  4. vue echarts动态数据定时刷新
  5. RouteDebug.dll
  6. 第四章 ASP.NET MVC HTML辅助方法生成表单标签具体用法
  7. 中年男人的唯一出路就是安分守己
  8. 「LibreOJ β Round #4」多项式 (广义欧拉数论定理)
  9. jquery css,attr,val方法
  10. 股东其实对公司情况一无所知,唯一办法是追责
  11. 中小幼计算机等级培训,全国中小学教师教育技术水平考试考试系统使用培训0817.pptx...
  12. vptr初始化语义学
  13. 我复盘了自己的工作,总结了这个跨境支付产品经理的成长经验给你
  14. 《东周列国志》第十七回 宋国纳赂诛长万 楚王杯酒虏息妫
  15. Latex排版技巧:上下方可输入文字的箭头
  16. 图文笔记,带你走进《未来简史》(11-15)
  17. 初音未来音乐计算机教程,PSP《初音未来:歌姬计划》原创PV制作简易图文教程...
  18. 微信公众号 语音转文字api_有没有语音转文字的APP?
  19. Codeforces1696 C. Fishingprince Plays With Array
  20. [读书笔记]《程序员代码面试指南》

热门文章

  1. 关于Android设备使用adb命令协助处理调试电容屏(TP)的应用
  2. SpringBoot配置跨域 修改默认json序列化
  3. 将“差异化”进行到底 21:9超宽屏笔记本电脑出现
  4. 基础笔记:计算机组成原理(第二版)蒋本珊 清华大学出版社(未完成)
  5. [ 虚拟专用网 ] 虚拟专用网常见面试题大集合
  6. openwrt--uci指令的使用
  7. 华为p8刷linux系统,华为手机变身交通卡,公交地铁都能刷
  8. android 扫码枪bug记录
  9. 吉林大学超星慕课平台——高级语言程序设计 实验04 数组及其在程序设计中的应用(2022级)
  10. 为小米(红米)6A解锁_ROOT_安装天下游虚拟定位教程_已亲身验证通过!附图