监视MySQL复制

监控一个奴隶确保它是最好的做法是什么?

a)仍在运行b)不是太大的主人

我想通过电子邮件提醒,如果它落后了,很高兴写一个或两个脚本钩入命令行应用程序。

1

你可以使用maatkit的mk-heartbeat

2

你可以看看结果

show slave status; 

在sql slave上运行,但Seconds_Behind_Master有时令人不安。

3

你可以破解你自己的解决scheme,类似于我的 – 我用它来监视nagios和喂养显示“秒钟后面的主”的munin图表。

在主服务器上我有简单的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()); 

如果你运行复制 – 我build议你也设置mk-table-checksum来不时地比较你的sql服务器的内容。

pQd有它,检查'显示奴隶状态'是最简单的方法。 关于Seconds_behind_master是不准确的,我想提到的是,值是从属SQL线程从中继日志读出的语句的时间戳的差异; 这与估计追赶需要多长时间无关。 例如,一个需要运行一个小时的长时间运行的更新将导致从服务器出现在其主服务器后面一个小时,但是一旦语句完成,只需要1秒的时间就可以完成跟上来。

此外,您将要授予“REPLICATION CLIENT”给您将要监视的用户以检索从站状态;

其他人所说的明显的答案是在SHOW SLAVE STATUS上使用一些变化。 我个人使用内置在Nagios中的检查器,但那是因为我已经通过nagios进行了各种其他的监视。 虽然有一个问题,但是SHOW SLAVE STATUS可能会显示正在运行的进程,而奴隶被挂起。 从我们可以看出的(因为我们有问题并且研究它),当有一些持续时间太短而不能完全杀死从机的networking打嗝时,就会出现这个问题。 我们想出了一个方法,在最后一个表格的时间戳中查看一个常规变化的表格,然后在主控制器和从属控制器之间进行比较,然后在“太远”后面发出警报。 不完美,只有在某些情况下才有效,但请注意自己的警告。

你可以参考这个博客文章,其中提到所有工具开源和商业,它显示http://blog.webyog.com/2012/11/20/how-to-monitor-mysql-replication/

通常这个博客包括像pt-heartbeat这样的工具:方便的工具来实时监控奴隶滞后。 pt-slave-restart:监视并重新启动从站。 pt-slave-find:查找从站的复制层次结构。 pt-table-checksum:检查从服务器上的数据库是否与主服务器同步。

MySQL企业监视器:Oracle的“虚拟DBA助手”是一个基于代理的监视工具,它具有一个整洁的基于Web的GUI。 “复制”选项卡给出所有主人及其奴隶的拓扑视图以及SHOW SLAVE STATUS和SHOW MASTER STATUS的输出。

MONyog-MySQL监视器和顾问程序:它支持复制监视和pipe理include-'Replication'选项卡,以及SHOW SLAVE STATUS和SHOW MASTER STATUS的所有主站及其从站的拓扑视图。

您应该执行查询SHOW SLAVE STATUS ,并确保Slave_IO_RunningSlave_SQL_Running的值均为Yes 。 如果没有,从属将不能自动恢复。 如果两者均为Yes则即使可能存在延迟( Seconds_Behind_Master ),复制仍然正常工作。

一个相当不错的工具是rep_mon ,是MyCat套件的一部分,它基本上只是pQd第三个选项样式的perl脚本,但它很容易configuration和testing。 一旦configuration完成,你可以自己运行它作为一个快速testing,或者安排在cron发送电子邮件,如果有问题。

运行时,基本上只输出“OK”,或者错误是什么。 您也可以在秒后达到某个阈值(由您设置)时提醒您。

但是,如果只是阈值监视你想要的,我build议去maatkit,它实际上插入和后来查询使用真正的SQL,而不是可能不准确的输出SHOW SLAVE STATUS

使用

 mysql_config_editor set --login-path=local --host=<< your slave >> --user=username --password 

 mysql_config_editor set --login-path=remote --host=<< your master >> --user=username --password 

设置预定义的login值以避免警告:在命令行界面上使用密码可能不安全。

使用这些来查询两个MySql服务器:

  1. 比较主站上的日志位置和从站上的Exec_Master_Log_Pos:

    master_log = $(mysql –login-path = remote -e“show master status”| grep -v File | awk'{print $ 2}')

    slave_exec = $(mysql –login-path = local -e“show slave status \ G”| grep Exec_Master_Log_Pos | awk'{print $ 2}')

    diff = $(($ master_log – $ slave_exec))

  2. 检查从站IO状态以查看它是否正在运行:

    IO_Status = $(mysql –login-path = local -e“show slave status \ G”| grep Slave_IO_Running | awk'{print $ 2}')

  3. 检查从属SQL状态以查看是否正确:

    SQL_Status = $(mysql –login-path = local -e“show slave status \ G”| grep“Slave_SQL_Running:”| awk'{print $ 2}')

然后,您可以使用$ diff,$ SQL_Status和$ IO_Status的值根据您的偏好发送警告电子邮件,如果它们不符合某些值

以下是如何使用Zenoss: 链接文本