我有一个主/从MySql复制。
我正在寻找一种工具,可以让我监控复制(看它没有错误,检查滞后等)。
我更喜欢可视化工具,它允许所有团队成员了解状态,而不是脚本工具。
任何想法?
答案 0 :(得分:7)
我们正在使用以下bash脚本。你可以在PHP和web基础上做同样的想法代码。
#!/bin/sh
## Joel Chaney##
## joel.chaney@mongoosemetrics.com (look at robots.txt) ##
## 2012-02-03 ##
repeat_alert_interval=30 # minutes for lock file life
lock_file=/tmp/slave_alert.lck # location of lock file
EMAIL=YOURNAME@YOURCOMPANY.DOM # where to send alerts
SSTATUS=/tmp/sstatus # location of sstatus file
### Code -- do not edit below ##
NODE=`uname -n`
## Check if alert is locked ##
function check_alert_lock () {
if [ -f $lock_file ] ; then
current_file=`find $lock_file -cmin -$repeat_alert_interval`
if [ -n "$current_file" ] ; then
# echo "Current lock file found"
return 1
else
# echo "Expired lock file found"
rm $lock_file
return 0
fi
else
touch $lock_file
return 0
fi
}
SLAVE=mysql
$SLAVE -e 'SHOW SLAVE STATUS\G' > $SSTATUS
function extract_value {
FILENAME=$1
VAR=$2
grep -w $VAR $FILENAME | awk '{print $2}'
}
Master_Binlog=$(extract_value $SSTATUS Master_Log_File )
Master_Position=$(extract_value $SSTATUS Exec_Master_Log_Pos )
Master_Host=$(extract_value $SSTATUS Master_Host)
Master_Port=$(extract_value $SSTATUS Master_Port)
Master_Log_File=$(extract_value $SSTATUS Master_Log_File)
Read_Master_Log_Pos=$(extract_value $SSTATUS Read_Master_Log_Pos)
Slave_IO_Running=$(extract_value $SSTATUS Slave_IO_Running)
Slave_SQL_Running=$(extract_value $SSTATUS Slave_SQL_Running)
Slave_ERROR=$(extract_value $SSTATUS Last_Error)
ERROR_COUNT=0
if [ "$Master_Binlog" != "$Master_Log_File" ]
then
ERRORS[$ERROR_COUNT]="master binlog ($Master_Binlog) and Master_Log_File ($Master_Log_File) differ"
ERROR_COUNT=$(($ERROR_COUNT+1))
fi
POS_DIFFERENCE=$(echo ${Master_Position}-${Read_Master_Log_Pos}|bc)
if [ $POS_DIFFERENCE -gt 1000 ]
then
ERRORS[$ERROR_COUNT]="The slave is lagging behind of $POS_DIFFERENCE"
ERROR_COUNT=$(($ERROR_COUNT+1))
fi
if [ "$Slave_IO_Running" == "No" ]
then
ERRORS[$ERROR_COUNT]="Replication is stopped"
ERROR_COUNT=$(($ERROR_COUNT+1))
fi
if [ "$Slave_SQL_Running" == "No" ]
then
ERRORS[$ERROR_COUNT]="Replication (SQL) is stopped"
ERROR_COUNT=$(($ERROR_COUNT+1))
fi
if [ $ERROR_COUNT -gt 0 ]
then
if [ check_alert_lock == 0 ]
then
SUBJECT="${NODE}-ERRORS in replication"
BODY=''
CNT=0
while [ "$CNT" != "$ERROR_COUNT" ]
do
BODY="$BODY ${ERRORS[$CNT]}"
CNT=$(($CNT+1))
done
BODY=$BODY" \n${Slave_ERROR}"
echo $BODY | mail -s "$SUBJECT" $EMAIL
fi
else
echo "Replication OK"
fi
答案 1 :(得分:7)
#!/bin/bash
HOST=your-server-ip
USER=mysql-user
PASSWORD=mysql-password
SUBJECT="Mysql replication problem"
EMAIL=your@email.address
RESULT=`mysql -h $HOST -u$USER -p$PASSWORD -e 'show slave status\G' | grep Last_SQL_Error | sed -e 's/ *Last_SQL_Error: //'`
if [ -n "$RESULT" ]; then
echo "$RESULT" | mail -s "$SUBJECT" $EMAIL
fi
答案 2 :(得分:2)
您可以使用任何编程语言来查询mysql并从以下位置获取结果:
show slave status; <-- execute on slave
show master status; <-- execute on master
如果您认为这是一个坏主意,那么安装phpmyadmin
,就有一个用于复制监控的内置GUI,例如:http://demo.phpmyadmin.net/master-config/(复制)
答案 3 :(得分:1)
如果你只是对奴隶是否是最新的感兴趣:
mysql'你的连接信息'-e'显示奴隶状态\ G'| grep -i seconds_behind
答案 4 :(得分:1)
我使用了一些不同的方法,最基本的方法是使用PHP网页检查从属状态,然后获取标准监控工具来监控页面。这是一个很好的方法,因为这意味着您可以通过检查网页将现有的监控工具用于警报。
示例:检查主机db1.internal
上的数据库服务器的状态http://mywebserver.com/replicationtest.php?host=db1.internal
应该总是返回&#34;是&#34;
replicationtest.php:
<?php
$username="myrepadmin";
$password="";
$database="database";
mysql_connect($_REQUEST['host'],$username,$password);
@mysql_select_db($database) or die( "Unable to select database");
$query="show slave status;";
$result=mysql_query($query);
$arr = mysql_fetch_assoc($result);
echo $arr['Slave_SQL_Running'] ;
mysql_close();
?>
您还可以监控Seconds_Behind_Master,Last_IO_Errno,Last_SQL_Errno等。 您可以在外部监视此Web页面,也可以将其添加到许多可以检查网页的标准监视工具中。我使用过免费服务http://monitor.us
或者,如果您不介意在内部基础架构上运行来自第三方的代码http://newrelic.com提供具有Web界面的出色服务器监控工具,并包含一个MySQL插件,该插件提供了许多有用的信息,例如:查询分析,InnoDB指标和具有滞后监视器的复制状态。 New Relic专注于Web应用程序监控,但免费服务允许您监控无限数量的服务器。
我目前使用这些工具的组合,上述网页用于触发紧急情况警报,以及用于查看长期性能和趋势分析的NewRelic工具。
答案 5 :(得分:1)
问题是:
你不能只依赖SHOW SLAVE STATUS输出来知道你的奴隶是否与Master相同:a(坏)尝试解决一个错误,停止你的复制可能暗示一些INSERT或UPDATE或者其他什么,从不发生在奴隶身上。
要检查这个,你必须阅读SHOW SLAVE STATUS,当然,在输出中一切都必须正常,但你还必须比较数据(即行数,校验和,......)。
我已经编写了一个PHP工具来执行此操作:https://bitbucket.org/verticalassertions/verticalslave 它的特点是:
随意分叉并改进。我确信有些工具更好(特别是在布局xD中),但是我需要一个能够完全符合我要求的工具,而不需要任何我无法想象的花哨工具。