2011-12-15 77 views
4

我有一個主/從MySql複製。MySql - 複製監控工具

進出口尋找一個工具,可以讓我監控複製(看它有沒有錯誤,請檢查滯後等)

我更喜歡一個可視化工具,將允許所有團隊成員獲得知名度狀態而不是腳本工具。

有什麼想法?

+0

您正在尋找可下載的工具?或者某人可以構建的工具? – 2011-12-15 11:17:18

+0

我喜歡SAAS或下載[MySQL的監視複製]的 – Ran 2011-12-15 12:18:37

+0

可能重複(http://stackoverflow.com/questions/1075433/mysql-monitor-replication) – jweyrich 2012-07-20 04:03:28

回答

2

你可以使用任何編程語言,從查詢MySQL和獲取結果:

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

如果你認爲這是一個壞主意,然後安裝phpmyadmin,有一個已經內置了圖形用戶界面的複製監視,如:http://demo.phpmyadmin.net/master-config/(複製)

7

我們正在使用下面的bash腳本。你可以在php和web上做相同的想法。

#!/bin/sh 
## Joel Chaney## 
## [email protected] (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 protected] # 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 Read_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 
0

如果你在從是否是最新的或不只是興趣:

mysql的「你的連接信息」 -e「顯示從狀態\ G」 | grep的-i seconds_behind

5
#!/bin/bash 

HOST=your-server-ip 
USER=mysql-user 
PASSWORD=mysql-password 
SUBJECT="Mysql replication problem" 
[email protected] 

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 
1

我已經使用了幾種不同的方法,最基本的幸福使用PHP網頁,檢查站狀態,然後讓標準的監視工具來監視頁面。這是一個不錯的方法,因爲它意味着您可以通過檢查網頁來將現有的監控工具用於警報。

實例:檢查在主數據庫服務器的狀態db1.internal

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

應該總是返回 「是」

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等。 您可以在外部監控此網頁,或將其添加到許多可以檢查網頁的標準監視工具中。我用免費服務http://monitor.us

另外,如果你不想讓自己的內部基礎設施http://newrelic.com與Web界面提供了極大的服務器監控工具,幷包括一個MySQL插件,它提供了很多偉大的信息介意第三方運行的代碼如查詢分析,InnoDB指標和具有滯後監視器的複製狀態。 New Relic專注於Web應用監控,但免費服務允許您監控無限數量的服務器。

我目前使用這些工具的組合,上面的網頁用於觸發緊急情況的警報,以及用於查看長期性能和趨勢分析的NewRelic工具。

1

的問題是:

  • 你想知道你的MySQL複製是OK
  • 或者你想知道你的數據是一致的?

你不能只依靠SHOW SLAVE STATUS輸出知道,如果你的奴隸等同於法師:一個(壞)試圖解決您停止複製的錯誤可能意味着一些INSERT或UPDATE或什麼的,從未出現在你的奴隸身上。要檢查這一點,你必須閱讀SHOW SLAVE STATUS,當然,在輸出中一切都必須正常,但是你也必須比較數據(即行數,校驗和......)。

我寫了一個PHP工具,要做到這一點:https://bitbucket.org/verticalassertions/verticalslave 它的特點:

  • 檢查複製(上顯示從狀態值的檢查,檢查表,校驗表,...)
  • 檢查複製與自動修復(與上面相同+錯誤複製表的轉儲)
  • 轉儲的非複製數據庫(在配置中列出)
  • 重置複製,當你全部破壞時 - 基本上是複製數據庫的轉儲和s撻奴隸)通過郵件
  • 發送縮短報告,鏈接到報告全文在網站上的版本
  • 商店過去的報告
  • 可以從CLI(crontab中)來運行,或手動從網站設置了

感覺免費分岔和改進。我確定有些工具比較好(特別是在xD版),但是我需要一個工具來完成我所要求的工作,而且我不能想象那些花哨的東西。