Monit监控MariaDB时因小版本更新导致校验和变更引发监控失效的解决方法咨询
我太懂你这种困扰了——每次MariaDB推小版本更新,Monit就因为/usr/sbin/mysqld和/etc/init.d/mariadb这两个文件的校验和变了触发告警,甚至搞的服务反复重启,之前只能靠重启服务器恢复,确实挺折腾人的。
先给你理清楚问题根源:你配置里的mysql_bin和mysql_rc这两个文件检查项,因为引用了/etc/monit/templates/rootbin模板,默认会校验文件的哈希值。而MariaDB更新时会替换这两个核心文件,校验和自然对不上,Monit就判定服务异常了。
下面给你两个实用的解决思路:
思路一:直接跳过校验和检查(简单粗暴,适合不想折腾的场景)
既然版本更新必然会改文件内容,那我们可以把校验和检查去掉,只监控文件的基础合法性(比如是否存在、所有者是否正确)。修改你的Monit配置:
check process mysqld with pidfile /var/run/mysqld/mysqld.pid group database group mysql start program = "/etc/init.d/mariadb start" stop program = "/etc/init.d/mariadb stop" if failed host localhost port 3306 protocol mysql with timeout 15 seconds for 3 times within 4 cycles then restart if failed unixsocket /var/run/mysqld/mysqld.sock protocol mysql for 3 times within 4 cycles then restart if 5 restarts with 5 cycles then timeout depend mysql_bin depend mysql_rc # 修改mysql_bin的检查规则,去掉校验和模板 check file mysql_bin with path /usr/sbin/mysqld group mysql if does not exist then alert if uid != root then alert if gid != root then alert # 修改mysql_rc的检查规则,去掉校验和模板 check file mysql_rc with path /etc/init.d/mariadb group mysql if does not exist then alert if uid != root then alert if gid != root then alert
这样配置后,Monit只会检查这两个文件是否存在、是否由root用户/组拥有,不再校验文件内容的哈希值,自然就不会因为版本更新触发告警了。
思路二:让Monit自动更新校验和(适合需要保留文件完整性检查的场景)
如果你还是想保留文件内容的校验检查,那可以让系统在MariaDB更新完成后,自动通知Monit重新计算校验和,不用手动操作:
针对Debian/Ubuntu系统(用apt包管理器)
创建一个APT钩子脚本,放在/etc/apt/apt.conf.d/99-monit-mariadb-update,内容如下:
DPkg::Post-Invoke {"if [ -x /usr/bin/monit ]; then monit reload; fi";};
这个脚本会在每次APT完成包更新后,自动执行monit reload,让Monit重新加载配置并更新所有文件的校验和。
针对RHEL/CentOS系统(用yum/dnf包管理器)
在/etc/yum/posttrans.d/目录下创建一个脚本monit-reload.sh,内容:
#!/bin/bash if [ -x /usr/bin/monit ]; then monit reload fi
然后给脚本加上执行权限:
chmod +x /etc/yum/posttrans.d/monit-reload.sh
这样每次yum/dnf更新完MariaDB后,会自动触发Monit重新计算校验和。
另外,你之前遇到问题时其实不用重启服务器,只需要在命令行执行:
monit reload
或者单独针对这两个服务更新校验和:
monit validate mysql_bin mysql_rc
就能让Monit重新计算哈希值,恢复正常监控了。
备注:内容来源于stack exchange,提问作者neilgee

