萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 主從同步監控全方案:關鍵指標、工具與自動化腳本

主從同步三線程模型

  • Master Binlog Dump Thread:主庫推送 binlog 事件。
  • Slave I/O Thread:從庫接收 binlog 寫入 relay log。
  • Slave SQL Thread:從庫重放 relay log 執行 SQL。

核心監控指標

指標來源正常值異常含義
Slave_IO_RunningSHOW SLAVE STATUSYesNo → 網路斷線、認證失敗、主庫無 binlog
Slave_SQL_RunningSHOW SLAVE STATUSYesNo → SQL 執行錯誤、鍵衝突、觸發器失敗
Seconds_Behind_MasterSHOW SLAVE STATUS0 或極小大 → 從庫延遲,SQL 執行慢、大事務、鎖競爭
Relay_Log_SpaceSHOW SLAVE STATUS穩定持續增長 → SQL Thread 處理不及
Last_Error / Last_IO_ErrorSHOW SLAVE STATUS空具體錯誤訊息

監控方案分層

層級 1:手動巡檢

mysql -e "SHOW SLAVE STATUS\G" | grep -E 'Running|Behind|Error'

層級 2:Percona Toolkit 專業工具

  • pt-heartbeat:精準測量延遲(不依賴 Seconds_Behind_Master)。
  • pt-slave-restart:自動跳過特定錯誤重啟 SQL Thread。
  • pt-table-checksum:驗證主從資料一致性(需預建 checksum 表)。

下載:Percona Toolkit

層級 3:企業級 GUI 監控

  • MySQL Enterprise Monitor:官方付費方案,完整儀表板。
  • MONyog:Windows/Linux 跨平台,視覺化警報。

層級 4:整合型監控系統

  • Prometheus + mysqld_exporter + Grafana:開源標準棧。
  • Zabbix:內建 MySQL 模板,支援自動發現從庫。
  • Nagios/Icinga:check_mysql_slave 外掛腳本。

生產可用 Shell 監控腳本

#!/bin/bash
# mysql_slave_monitor.sh - 放入 cron 每分鐘執行
SERVER=$(hostname)
SEC_BEHIND=$(/usr/bin/mysql -e "SHOW SLAVE STATUS\G" |
  awk -F': ' '/Seconds_Behind_Master/ {print $2}')
BROKEN_FLAG=/tmp/mysql_slave_broken.flag
DELAY_FLAG=/tmp/mysql_slave_delay.flag
THRESHOLD=60  # 秒

if [ "$SEC_BEHIND" = "NULL" ]; then
  # 同步中斷
  if [ ! -f "$BROKEN_FLAG" ]; then
    echo "[$(date)] Slave replication BROKEN on $SERVER" | mail -s "MySQL Slave Broken" admin@example.com
    touch "$BROKEN_FLAG"
  fi
  [ -f "$DELAY_FLAG" ] && rm "$DELAY_FLAG"
else
  # 同步正常
  [ -f "$BROKEN_FLAG" ] && { echo "[$(date)] Slave RESTORED on $SERVER" | mail -s "MySQL Slave Restored" admin@example.com; rm "$BROKEN_FLAG"; }
  if [ "$SEC_BEHIND" -gt "$THRESHOLD" ]; then
    [ ! -f "$DELAY_FLAG" ] && { echo "[$(date)] Slave DELAY ${SEC_BEHIND}s on $SERVER" | mail -s "MySQL Slave Delay" admin@example.com; touch "$DELAY_FLAG"; }
  else
    [ -f "$DELAY_FLAG" ] && { echo "[$(date)] Slave delay RECOVERED (${SEC_BEHIND}s) on $SERVER" | mail -s "MySQL Slave Recovered" admin@example.com; rm "$DELAY_FLAG"; }
  fi
fi

進階:Jenkins + 腳本 = 輕量級告警平台

將上述腳本封裝為 Jenkins Job,設定 Build Trigger 每分鐘輪詢,郵件/Slack/Webhook 通知,零成本構建生產級監控。

copyright © 萬盛學電腦網 all rights reserved