【问题标题】:MySql - replication monitoring tool [closed]MySql - 复制监控工具
【发布时间】:2011-12-15 10:44:40
【问题描述】:

我有一个主/从 MySql 复制。

我正在寻找一个可以让我监控复制的工具(查看它没有错误,检查滞后等)

我更喜欢让所有团队成员都能了解状态的可视化工具,而不是脚本工具。

有什么想法吗?

【问题讨论】:

标签: mysql mysql-management


【解决方案1】:

我们正在使用以下 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

【讨论】:

  • 所以当复制失败时会发送一封电子邮件?
  • 看来:"echo $BODY | mail -s "$SUBJECT" $EMAIL"
  • 这真的很有帮助,但不应该 - POS_DIFFERENCE=$(echo ${Master_Position}-${Read_Master_Log_Pos}|bc) 反过来吗?如 - POS_DIFFERENCE=$(echo ${Read_Master_Log_Pos}-${Master_Position}|bc)?既然 Master_Position 是 Exec_Master_Log_Pos 的值,而 Read_Master_Log_Pos 是 Read_Master_Log_Pos 的值呢?我希望读取值始终领先于或等于执行值。
【解决方案2】:
#!/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

【讨论】:

    【解决方案3】:

    您可以使用任何编程语言来查询 mysql 并从以下位置获取结果:

    show slave status;  <-- execute on slave
    show master status; <-- execute on master
    

    如果你认为这是一个坏主意,那么安装phpmyadmin,已经有一个用于复制监控的内置GUI,例如:http://demo.phpmyadmin.net/master-config/(复制)

    【讨论】:

    • 我一直在寻找一个更“用户友好”的工具,phpmyadmin 对于该过程来说有点过头了......大师后面的秒数超过了一定的速度,那会很酷:)
    【解决方案4】:

    如果您只是对从站是否是最新的感兴趣:

    mysql '你的连接信息' -e '显示从属状态\G' | grep -i seconds_behind

    【讨论】:

      【解决方案5】:

      我使用了几种不同的方法,最基本的是使用 PHP 网页检查从站状态,然后使用标准监控工具来监控页面。这是一种很好的方法,因为这意味着您现有的监控工具可以通过检查网页来用于警报。

      示例:检查主机 db1.internal 上的数据库服务器的状态

      http://mywebserver.com/replicationtest.php?host=db1.internal

      应该总是返回“是”

      复制测试.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 等。 您可以从外部监控此网页,或将其添加到许多可以检查网页的标准监控工具中。我用过免费服务http://monitor.us

      或者,如果您不介意在您的内部基础架构上运行来自第三方的代码,http://newrelic.com 提供带有 Web 界面的出色服务器监控工具,并包含一个 MySQL 插件,该插件可提供大量重要信息,例如查询分析、InnoDB带有滞后监视器的指标和复制状态。 New Relic 专注于 Web 应用程序监控,但免费服务允许您监控无限数量的服务器。

      我目前将这些工具与用于触发紧急情况警报的上述网页结合使用,以及用于查看长期绩效和趋势分析的 NewRelic 工具。

      【讨论】:

        【解决方案6】:

        问题是:

        • 你想知道你的Mysql复制是否正常
        • 或者您想知道您的数据是否一致?

        您不能仅依靠 SHOW SLAVE STATUS 输出来了解您的从站是否与主站相同:(错误)尝试解决停止复制的错误可能意味着某些 INSERT 或 UPDATE 或其他任何事情,从未发生过你的奴隶。

        要检查这一点,您必须阅读 SHOW SLAVE STATUS,当然,该输出中的一切都必须正常,但您还必须比较数据(即行数、校验和......)。

        我已经编写了一个 PHP 工具来做到这一点:https://bitbucket.org/verticalassertions/verticalslave 它的特点:

        • 检查复制(检查显示从属状态值、检查表、校验和表...)
        • 使用自动修复检查复制(与上述相同 + 错误转储复制表)
        • 非复制数据库转储(在配置中列出)
        • 当你彻底崩溃时重置复制 - 基本上是复制数据库的转储并启动从属)
        • 通过邮件发送简短报告,链接到网站版本的完整报告
        • 存储过去的报告
        • 可以从 CLI (crontab) 或从您设置的网站手动运行

        随意分叉和改进。我确信有些工具会更好(尤其是在布局 xD 中),但我需要一个工具能够完全按照我的要求完成,并且没有我想不出来的花哨的东西。

        【讨论】:

          猜你喜欢
          • 2012-08-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多