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