Seconds_Behind_Master?SHOW SLAVE STATUS 的 Seconds_Behind_Master 基於 Binlog 事件時間戳計算,當主庫長事務執行時間較長時,該值會出現「先大後小」的跳躍,無法真實反映實時延遲。Percona Toolkit 的 pt-heartbeat 通過「主庫寫入當前時間 -> 從庫讀取對比系統時間」實現秒級精準監控。
heartbeat 表的一行記錄,寫入 UTC_TIMESTAMP()。ts 值,與自身 UTC_TIMESTAMP() 做差,得出真實延遲秒數。yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm yum install -y percona-toolkit
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;
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時間 延遲秒數(浮點數)
#!/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,避免主鍵衝突 (首次啟動建議加上) |
--utc。SELECT (從庫)、INSERT/UPDATE (主庫) 權限。rm -f /tmp/pt-heartbeat-sentinel 再啟動。pt-heartbeat 是 MySQL 主從延遲監控的「黃金標準」。部署關鍵在於:主庫 --update --daemonize、從庫 --monitor --master-server-id、統一 UTC 時間、日誌落盤對接告警。配合 Seconds_Behind_Master 做雙重校驗,構建可靠的複製健康體檢體系。