首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 主從延遲精準監控實戰:pt-heartbeat 原理、部署與告警全流程

     編輯:MySQL 綜合教學

為什麼不靠 Seconds_Behind_Master?

SHOW SLAVE STATUS 的 Seconds_Behind_Master 基於 Binlog 事件時間戳計算,當主庫長事務執行時間較長時,該值會出現「先大後小」的跳躍,無法真實反映實時延遲。Percona Toolkit 的 pt-heartbeat 通過「主庫寫入當前時間 -> 從庫讀取對比系統時間」實現秒級精準監控。

核心原理

  1. 主庫:後台守護進程每秒更新 heartbeat 表的一行記錄,寫入 UTC_TIMESTAMP()。
  2. 從庫:監控進程讀取該行 ts 值,與自身 UTC_TIMESTAMP() 做差,得出真實延遲秒數。
  3. 無視 Binlog 事件時間戳,直接度量「數據到達從庫並可見」的物理時間差。

部署步驟 (CentOS 7 / MySQL 5.6+)

1. 安裝 Percona Toolkit

yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm
yum install -y percona-toolkit

2. 主庫:啟動更新守護進程

pt-heartbeat -u root -p'PassWord' -D monitor_db --create-table --update --daemonize --interval=1
# 參數解析:
# -D monitor_db : 指定已存在的數據庫,將建立 heartbeat 表
# --create-table : 自動建表 (id, ts, server_id, file, position)
# --update : 更新模式 (主庫專用)
# --daemonize : 後台守護進程
# --interval=1 : 1 秒更新一次

生成的表結構:

CREATE TABLE `heartbeat` (
  `id` int NOT NULL,
  `ts` varchar(26) NOT NULL,
  `server_id` int unsigned NOT NULL,
  `file` varchar(255) DEFAULT NULL,
  `position` bigint unsigned DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

3. 從庫:啟動監控並輸出日誌

pt-heartbeat -u root -p'PassWord' -D monitor_db --table=heartbeat \
--master-server-id=100 --monitor -h 192.168.1.10 --interval=1 \
--file=/var/log/pt-heartbeat.log --run-time=0
# 關鍵參數:
# --master-server-id=100 : **必須填寫主庫 server_id**,錯誤會導致監控失效
# --monitor : 監控模式 (從庫專用)
# -h 192.168.1.10 : 從庫 IP (或 localhost)
# --file : 輸出日誌文件,便於後續告警採集
# --run-time=0 : 永久運行

日誌輸出示例:

2023-10-01T12:00:01.123456 0.001234
2023-10-01T12:00:02.123567 0.001123
# 格式:UTC時間  延遲秒數(浮點數)

4. 告警腳本示例 (Shell + 郵件/鉤子)

#!/bin/bash
LOG="/var/log/pt-heartbeat.log"
THRESHOLD=5  # 秒
LAG=$(tail -1 $LOG | awk '{print $2}')
if (( $(echo "$LAG > $THRESHOLD" | bc -l) )); then
    SUBJECT="[ALERT] MySQL Replication Lag ${LAG}s on $(hostname)"
    BODY="Current lag: ${LAG}s (threshold: ${THRESHOLD}s)\nLog: $LOG"
    echo -e "$BODY" | mail -s "$SUBJECT" dba@example.com
    # 或 curl -X POST 鉤子推送到 Prometheus Alertmanager / 鉤釘 / 企業微信
fi

加入 crontab 每分鐘執行。

進階參數與運維技巧

參數用途
--check單次檢查模式,適合腳本調用,不守護進程
--skew=0.5從庫檢查延遲補償 (默認 0.5s),減少網絡抖動誤判
--frames=1m,5m,15m輸出不同時窗口移動平均延遲 (需配合 --monitor --file)
--utc忽略系統時區,強制使用 UTC,跨時區部署必加
--stop停止主庫守護進程 (會創建 /tmp/pt-heartbeat-sentinel 文件)
--replace使用 REPLACE INTO 代替 UPDATE,避免主鍵衝突 (首次啟動建議加上)

常見坑點避雷

  • 主庫 server_id 填錯:導致監控讀取不到對應行,延遲顯示 NULL 或極大值。
  • 時區不一致:主從系統時區不同,務必加 --utc。
  • 權限不足:監控用戶需具備 SELECT (從庫)、INSERT/UPDATE (主庫) 權限。
  • 防火牆/安全組:從庫需能連主庫 3306 端口 (若監控進程跑在從庫機器上)。
  • 重啟守護進程:先 rm -f /tmp/pt-heartbeat-sentinel 再啟動。

總結

pt-heartbeat 是 MySQL 主從延遲監控的「黃金標準」。部署關鍵在於:主庫 --update --daemonize、從庫 --monitor --master-server-id、統一 UTC 時間、日誌落盤對接告警。配合 Seconds_Behind_Master 做雙重校驗,構建可靠的複製健康體檢體系。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved