Mysql数据库从库监控提醒

说明

数据库配置了主从同步,一些数据分析等读操作,全部数据从从库来读取。
但是如果主从同步延迟或者断掉自后,分析的数据就不会再实时了。
而且又不能实时的看着数据库的主从状态,因此是希望能在主从延迟的时候,能自动提醒下。

思路

  • 用mysql的show slave status查询出当前的从库情况
  • 当分析结果发现延迟的时候,直接发送消息到指定的用户
  • 用linux的crontab定时任务去持续读取分析结果

过程

  • 如果监控服务器和从库不在同一台服务器上,那么需要在从库服务器创建一个外部服务器可访问的账号grant all on *.* to 'user'@'%' identified by 'userpwd';
  • 执行SQL查询:show slave status
  • 执行取得的结果进行分析

源码

//假设已经有了mysql查询连接对象
$content = array();
$res = $mysql_link->query('show slave status');    //该结果返回的是多个从库的同步信息
if ($res) {
    foreach ($res as $one) {
        if ($one['slave_io_running'] == 'Yes' && $one['slave_sql_running'] == 'Yes' && $one['seconds_behind_master'] < $seconds_behind_master) {
            //正常
        } else {
            $content_one .= '监测到服务器【' . $one['channel_name'] . '】数据库主从同步发生异常,异常信息:';
            if ($one['slave_io_running'] != 'Yes') {
                $content_one .= 'slave_io_running异常。';
            }
            if ($one['slave_sql_running'] != 'Yes') {
                $content_one .= 'slave_sql_running异常。';
            }
            if ($one['seconds_behind_master'] >= $seconds_behind_master) {
                $content_one .= 'seconds_behind_master异常延迟了' . $one['seconds_behind_master'] . '秒。';
            }
            $content[] = $content_one;
        }
    }
}
//发送提醒
if (!empty($content)) {
	//notice_user
}