监控从属服务器以确保其正常运行的最佳做法是什么
a) 仍在运行 b) 距离成为大师还差得很远
如果它落后了,我想通过电子邮件发出警报,很乐意编写一两个脚本来挂接到命令行应用程序中。
答案1
1
你可以使用 maatkit 的mk-心跳
2
你可以看看结果
show slave status;
在 sql slave 上运行,但 Seconds_Behind_Master 有时会非常不准确。
3
你可以破解自己的解决方案,类似于我的 - 我用它纳吉奥斯监测和喂养穆宁图表显示了‘落后主人的秒数’。
在主服务器上我有一个简单的 cron 作业:
* * * * * root /usr/local/bin/repltest
其中 repltest 为:
#!/bin/bash
start=`date +%s`
d=0
while [ $d -lt 60 ] ; do
echo "update repl_test set t= NOW(); " |mysql --defaults-file=/etc/mysql/debian.cnf repl_test
sleep 3
d=$(( `date +%s` - $start ))
done
在从属设备上,我监视返回的值:
echo "select UNIX_TIMESTAMP(NOW())-UNIX_TIMESTAMP(t) from repl_test" | mysql --defaults-file=/etc/mysql/debian.cnf -N repl_test
所有服务器上的本地时间通过 ntp 同步。
repl_test db包含:
CREATE TABLE IF NOT EXISTS `repl_test` (`t` datetime NOT NULL) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `repl_test` (`t`) VALUES(NOW());
如果你运行复制 - 我建议你也设置mk-表校验和不时地比较你的 SQL 服务器的内容。
答案2
pQd 有,检查“显示从属状态”是最简单的方法。关于 Seconds_behind_master 不准确,我想提一下,该值是从属 SQL 线程从中继日志中读取的语句的时间戳差;它与估计需要多长时间才能赶上无关。例如,一个需要一小时才能运行的长时间更新将导致从属服务器看起来比主服务器晚一个小时,但一旦语句完成,它很可能只剩下 1 秒钟的工作来赶上。
此外,您还需要授予您将要监控的用户“复制客户端”权限,以便检索从属状态;
答案3
正如其他人所说,显而易见的答案是使用 SHOW SLAVE STATUS 的一些变体。我个人使用 Nagios 内置的检查器,但那是因为我已经通过 nagios 进行了各种其他监控。但是有一个问题,SHOW SLAVE STATUS 可能会显示两个进程都在运行,但从属进程却挂起了。据我们所知(因为我们遇到了这个问题并对其进行了调查),问题发生在网络中断持续时间太短以至于无法直接杀死从属进程但又太长以至于无法正常恢复时。我们想出了一个解决方法,我们查看表中最新条目的时间戳,该时间戳会定期更改,并在主从属进程之间进行比较,然后如果“落后太多”则发出警报。它并不完美,而且只在某些情况下有效,但请注意。
答案4
您应该执行查询SHOW SLAVE STATUS
并确保Slave_IO_Running
和Slave_SQL_Running
的值均为Yes
。如果不是,从属服务器将无法自动恢复。如果两者都为,Yes
则复制仍在进行,即使可能会有延迟(Seconds_Behind_Master
)。