Mongodb 实现监控与邮件报警

本文介绍如何使用Crontab结合Shell脚本监控MongoDB集群状态,一旦检测到节点异常,即通过Mailx发送邮件通知管理员。文章详细展示了脚本编写、配置及定时任务设置流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用 crontab 定时执行 shell脚本实现进程监控,
当进程发生异常预警时,发送邮件通知管理员(集群多用户)

邮件发送器 Mailx

CentOS 使用 Mailx 通过465端口发送邮件

发信人参数配置

/opt/mongodb/shell/mongodb_cluster_config.txt
ipAddressAndPorts=127.0.0.1:62323
semdEmailTo=405348097@qq.com
sendEmailTitle=测试节点监控异常标题
sendEmailContent=测试节点监控异常内容

创建脚本

/opt/mongodb/shell/watch.sh

#!/usr/bin/sh
# 使用 which sh 检查sh命令位置
db_backups_conf="/opt/mongodb/shell/mongodb_cluster_config.txt"

# 判断文件是否存在
if [ -f "${db_backups_conf}" ];then
	echo $(date +'%Y-%m-%d %H:%M:%S')" 发现配置信息文件存在"
	dbArrOne=($(awk -F'[=]' '{print $1}' ${db_backups_conf} ))
	dbArrTwo=($(awk -F'[=]' '{print $2}' ${db_backups_conf}))
	declare -A map=()
	
	# 将 db_backups_conf 配置文件中的信息存储在map中
	for((i=0;i<${#dbArrOne[@]};i++))
	do
		map[${dbArrOne[i]}]=${dbArrTwo[i]}
	done	
	
	# 获取要监测集群节点IP和端口号组合的字符串
	ipPortsStr=${map["ipAddressAndPorts"]}
	# 获取收件人的邮件账号的字符串
	semdEmailTo=${map["semdEmailTo"]}
	# 获取默认的字符串分隔符
	old_ifs="$IFS"
	# 设置字符串分隔符为逗号
	IFS=","
 
	# 将要集群节点IPPORT的value值的字符串进行分隔,获取一个数组
	ipPortArr=($ipPortsStr)
	# 将收件人的邮件账号value值的字符串进行分隔,获取一个数组
	semdEmailToArr=($semdEmailTo)
	# 将字符串的分隔符重新设置为默认的分隔符
	IFS="$old_ifs"
	
	# 定义一个是否需要发送异常提醒邮件变量
	isSendEmailStr=0
	# 定义一个出现异常集群节点ip和端口号存储的变量
	errorIpPort=""
	
	# 执行命令
	{
		# 遍历集群节点,监测节点是否异常宕机
		for ipPort in ${ipPortArr[@]};
		do
			# 检测mongodb节点是否异常宕机
			netstat -anop | grep ${ipPort}
			if [ $? -ne 1 ];then
				echo $(date +'%Y-%m-%d %H:%M:%S')" mongodb集群节点正常:"${ipPort}
			else
				echo $(date +'%Y-%m-%d %H:%M:%S')" mongodb集群节点异常:"${ipPort}
				isSendEmailStr=1
				errorIpPort=${errorIpPort}""${ipPort}","
			fi
		done
	} || {
		isSendEmailStr=1
	}
	
	# 判断命令执行是否有异常,如果有异常就发送邮件
	if [${isSendEmailStr} == "0"];then
			echo $(date +'%Y-%m-%d %H:%M:%S')" 执行mongodb集群节点监测全部正常"
		else 
			echo $(date +'%Y-%m-%d %H:%M:%S')" 执行mongodb集群节点监测有异常,开始发送邮件通知管理员"
			
			#遍历收件人的邮箱地址,逐个发送邮件
			for email in ${semdEmailToArr[@]};
			do
				echo $(date +'%Y-%m-%d %H:%M:%S')" 开始发送邮件:"${email}
 
				echo ""${map["sendEmailContent"]}",异常节点信息如下:"${errorIpPort} | mail -s ""${map["sendEmailTitle"]} ${email}
			done
			echo $(date +'%Y-%m-%d %H:%M:%S')" 执行mongodb集群节点监测有异常,成功发送邮件通知管理员"
	fi
	echo $(date +'%Y-%m-%d %H:%M:%S')" 脚本执行完毕"
else
	echo "文件不存在"
fi

测试脚本

手动关闭 Mongo服务进程

// 查看 mongodb 进程
$ ps -ef|grep mongodb
// 输出 root   12611  1  0 17:05 ?   00:00:03 mongod --dbpath /opt/mongodb/data/db
// 杀死进程
$ kill -2 12611
// 查看是否杀死成功
$ ps -ef|grep mongodb
// 查看端口是否还会被占用
$ netstat -anp|grep 62323

执行脚本,成功的话会发送邮件

$ sh watch.sh

使用 Crontab 设置定时脚本

CentOS 使用 Crontab 定时任务
每1小时检测1次服务器,如果进程出现异常则发送邮件通知

$ crontab -e
# 每1小时执行一次.
* */1 * * * sh /opt/mongodb/shell/watch.sh

# 每1分钟执行一次.(最少)
# * * * * * sh /opt/mongodb/shell/watch.sh

如果想要执行一次异常之后关闭定时任务,可以通过 mv命令重命名 watch.sh

欢迎技术指正与交流,转载请注明出处
https://www.imure.cn/2019/11/20/Mongodb-Monitor-and-send-email/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值