在Nagios监控体系中,自定义插件是实现个性化监控需求的核心方式,针对MySQL数据库的监控,我们可以编写Shell脚本插件来检测各类运行状态,适配不同的业务场景。

Nagios插件基础规则
Nagios监控插件通过返回不同的退出状态码来告知Nagios服务的运行状态,同时输出对应的监控信息,核心状态码定义如下:
- 0:OK,监控项状态正常
- 1:WARNING,监控项处于警告状态
- 2:CRITICAL,监控项处于严重异常状态
- 3:UNKNOWN,监控项状态未知,通常是参数错误或者检测失败
插件输出的内容会直接展示在Nagios的监控页面中,方便运维人员快速定位问题。
编写MySQL连接检测插件
最基础的MySQL监控插件是检测数据库是否能正常连接,我们可以通过mysqladmin命令来实现,以下是完整的Shell脚本示例:
#!/bin/bash
# 插件使用说明
if [ $# -ne 4 ]; then
echo "Usage: $0 -H 主机地址 -P 端口号"
exit 3
fi
# 解析输入参数
while getopts "H:P:" opt; do
case $opt in
H) HOST=$OPTARG ;;
P) PORT=$OPTARG ;;
*) echo "未知参数"; exit 3 ;;
esac
done
# 设置MySQL连接超时时间
TIMEOUT=5
# 执行连接检测
mysqladmin -h $HOST -P $PORT ping --connect-timeout=$TIMEOUT >/dev/null 2>&1
# 根据检测结果返回对应状态码
if [ $? -eq 0 ]; then
echo "MySQL连接正常 | 连接状态=1"
exit 0
else
echo "MySQL连接失败 | 连接状态=0"
exit 2
fi将上述脚本保存为check_mysql_connect.sh,赋予执行权限后即可使用。脚本中通过mysqladmin ping命令检测MySQL服务是否存活,根据命令执行结果返回对应的Nagios状态码。
扩展监控MySQL连接数
除了基础连接检测,我们还可以扩展插件监控MySQL的当前连接数,当连接数超过阈值时触发警告或严重告警,示例代码如下:
#!/bin/bash
# 参数说明:-H 主机 -P 端口 -u 用户名 -p 密码 -w 警告阈值 -c 严重阈值
if [ $# -ne 8 ]; then
echo "Usage: $0 -H 主机 -P 端口 -u 用户 -p 密码 -w 警告阈值 -c 严重阈值"
exit 3
fi
# 解析参数
while getopts "H:P:u:p:w:c:" opt; do
case $opt in
H) HOST=$OPTARG ;;
P) PORT=$OPTARG ;;
u) USER=$OPTARG ;;
p) PASS=$OPTARG ;;
w) WARN=$OPTARG ;;
c) CRIT=$OPTARG ;;
*) echo "未知参数"; exit 3 ;;
esac
done
# 查询当前MySQL连接数
CONNECT_NUM=$(mysql -h $HOST -P $PORT -u $USER -p$PASS -e "show status like 'Threads_connected';" 2>/dev/null | awk 'NR==2{print $2}')
# 检测查询是否成功
if [ -z "$CONNECT_NUM" ]; then
echo "获取MySQL连接数失败 | 连接数=未知"
exit 3
fi
# 判断连接数是否超过阈值
if [ $CONNECT_NUM -ge $CRIT ]; then
echo "MySQL连接数严重过高: 当前${CONNECT_NUM} | 连接数=${CONNECT_NUM}"
exit 2
elif [ $CONNECT_NUM -ge $WARN ]; then
echo "MySQL连接数警告: 当前${CONNECT_NUM} | 连接数=${CONNECT_NUM}"
exit 1
else
echo "MySQL连接数正常: 当前${CONNECT_NUM} | 连接数=${CONNECT_NUM}"
exit 0
fiNagios中配置使用插件
编写完成插件后,需要将插件放到Nagios的插件目录(通常是/usr/lib64/nagios/plugins/或者/usr/local/nagios/libexec/),然后修改Nagios的配置文件添加监控命令和服务:
首先在commands.cfg中添加命令定义:
define command {
command_name check_mysql_connect
command_line $USER1$/check_mysql_connect.sh -H $HOSTADDRESS$ -P $ARG1$
}然后在services.cfg中为对应的MySQL主机添加监控服务:
define service {
host_name mysql-server
service_description MySQL连接状态
check_command check_mysql_connect!3306
max_check_attempts 3
normal_check_interval 5
retry_check_interval 1
notification_interval 60
notification_period 24x7
contact_groups admins
}配置完成后重启Nagios服务,即可在监控页面看到对应的MySQL监控项状态。按照同样的思路,我们还可以扩展编写监控MySQL主从同步状态、慢查询数量、QPS等更多指标的插件,满足不同的监控需求。