背景:
MySQL的架構中,Master-Slave是目前最受歡迎的,用的也最多,但是對於主從的延遲一般都是按照他自己的狀態【Seconds_Behind_Master】來查看的,最近看了【不要用該值來衡量主備延遲】,發現用該狀態值去判斷主從延遲也不太靠譜。文章中也介紹了pt-heartbeat 來監控能更好的了解主從延遲時間。本文就介紹下該工具的使用方法。
工作原理:
1,在主上創建一張heartbeat表,按照一定的時間頻率更新該表的字段(把時間更新進去)。
2,連接到從上檢查復制的時間記錄,和從庫的當前系統時間進行比較,得出時間的差異。
使用方法:
pt-heartbeat [OPTIONS] [DSN] --update|--monitor|--check|--stop
在主上開啟守護進程來更新test.heartbeat表:
pt-heartbeat -D test --update -h master-server --daemonize
監控從的延遲情況:
#一直執行,不退出 pt-heartbeat -D test --monitor -h slave-server #執行一次就退出 pt-heartbeat -D test --check h=slave-server
常用參數:
注意:需要指定的參數至少有 --stop,--update,--monitor,--check。其中--update,--monitor和--check是互斥的,--daemonize和--check也是互斥。 --ask-pass 隱式輸入MySQL密碼 --charset 字符集設置 --check 檢查從的延遲,檢查一次就退出,除非指定了--recurse會遞歸的檢查所有的從服務器。 --check-read-only 如果從服務器開啟了只讀模式,該工具會跳過任何插入。 --create-table 在主上創建心跳監控的表,如果該表不存在。可以自己建立,建議存儲引擎改成memory。通過更新該表知道主從延遲的差距。 CREATE TABLE heartbeat ( ts varchar(26) NOT NULL, server_id int unsigned NOT NULL PRIMARY KEY, file varchar(255) DEFAULT NULL, -- SHOW MASTER STATUS position bigint unsigned DEFAULT NULL, -- SHOW MASTER STATUS relay_master_log_file varchar(255) DEFAULT NULL, -- SHOW SLAVE STATUS exec_master_log_pos bigint unsigned DEFAULT NULL -- SHOW SLAVE STATUS ); heratbeat表一直在更改ts和position,而ts是我們檢查復制延遲的關鍵。
--daemonize 執行時,放入到后台執行 --user -u,連接數據庫的帳號 --database -D,連接數據庫的名稱 --host -h,連接的數據庫地址 --password -p,連接數據庫的密碼 --port -P,連接數據庫的端口 --socket -S,連接數據庫的套接字文件 --file 【--file=output.txt】 打印--monitor最新的記錄到指定的文件,很好的防止滿屏幕都是數據的煩惱。 --frames 【--frames=1m,2m,3m】 在--monitor里輸出的[]里的記錄段,默認是1m,5m,15m。可以指定1個,如:--frames=1s,多個用逗號隔開。可用單位有秒(s)、分鍾(m)、小時(h)、天(d)。 --interval 檢查、更新的間隔時間。默認是見是1s。最小的單位是0.01s,最大精度為小數點后兩位,因此0.015將調整至0.02。 --log 開啟daemonized模式的所有日志將會被打印到制定的文件中。 --monitor 持續監控從的延遲情況。通過--interval指定的間隔時間,打印出從的延遲信息,通過--file則可以把這些信息打印到指定的文件。 --master-server-id 指定主的server_id,若沒有指定則該工具會連到主上查找其server_id。 --print-master-server-id 在--monitor和--check 模式下,指定該參數則打印出主的server_id。 --recurse 多級復制的檢查深度。模式M-S-S...不是最后的一個從都需要開啟log_slave_updates,這樣才能檢查到。 --recursion-method 指定復制檢查的方式,默認為processlist,hosts。 --update 更新主上的心跳表。 --replace 使用--replace代替--update模式更新心跳表里的時間字段,這樣的好處是不用管表里是否有行。 --stop 停止運行該工具(--daemonize),在/tmp/目錄下創建一個“pt-heartbeat-sentinel” 文件。后面想重新開啟則需要把該臨時文件刪除,才能開啟(--daemonize)。 --table 指定心跳表名,默認heartbeat。
更多的參數請見官方文檔。
測試:
環境: 主:192.168.200.25:3306 從:192.168.200.25:3307 從:192.168.200.201:3307
測試一:
1,在主上運行:--daemonize表示守護進程,后台運行。
zhoujy@zhoujy:~$ pt-heartbeat --user=root --ask-pass --host=192.168.200.25 --create-table -D aaa --interval=1 --update --replace --daemonize Enter password:
或則指定日志文件:
zhoujy@zhoujy:~$ pt-heartbeat --user=root --ask-pass --host=192.168.200.25 --create-table -D aaa --interval=1 --log=/tmp/pt-heartbeat.log --update --daemonize Enter password:
zhoujy@zhoujy:~$ ps -ef | grep pt-heartbeat zhoujy 15656 1 0 14:42 ? 00:00:00 perl /usr/local/bin/pt-heartbeat --user=root --ask-pass --host=192.168.200.25 --create-table -D aaa --interval=1 --update --daemonize
2,在從上運行:
#執行一次就退出 zhoujy@zhoujy:~$ pt-heartbeat --user=root --password=123456 --host=192.168.200.25 --port=3307 --create-table -D aaa --check 0.00 #一直執行,不退出 zhoujy@zhoujy:~$ pt-heartbeat --user=root --password=123456 --host=192.168.200.25 --port=3307 --create-table -D aaa --monitor 0.00s [ 0.00s, 0.00s, 0.00s ] 0.00s [ 0.00s, 0.00s, 0.00s ] 0.00s [ 0.00s, 0.00s, 0.00s ]
0表示從沒有延遲。 [ 0.00s, 0.00s, 0.00s ] 表示1m,5m,15m的平均值。可以通過--frames去設置。
指定 --file 參數,把輸出保存到一個文件中。文件只會保留最新的一條記錄。
zhoujy@zhoujy:~$ pt-heartbeat --user=root --password=123456 --host=192.168.200.25 --port=3307 --create-table -D aaa --frames=1s,5s,15s --file=output.txt --monitor
文件output.txt的內容為:
3.00s [ 13.00s, 11.00s, 6.07s ]
在1,2中主更新的間隔時間為默認1s(--interval),檢查延遲不需要1s這么頻繁,設置10s檢查一次從的延遲情況:
zhoujy@zhoujy:~$ pt-heartbeat --user=root --password=123456 --host=192.168.200.25 --port=3307 --create-table -D aaa --interval=10 --frames=1s,5s,15s --monitor 0.00s [ 0.00s, 0.00s, 0.00s ] 0.00s [ 0.00s, 0.00s, 0.00s ] 0.00s [ 0.00s, 0.00s, 0.00s ]
打印出主的server_id,可以先指定主的server_id,也可以不指定,讓其自己去找。
zhoujy@zhoujy:~$ pt-heartbeat --user=root --password=123456 --host=192.168.200.25 --port=3307 --create-table -D aaa --interval=2 --print-master-server-id --frames=1s --monitor 0.00s [ 0.00s ] 12 0.00s [ 0.00s ] 12 0.00s [ 0.00s ] 12 0.00s [ 0.00s ] 12
參數:--master-server-id 先指定主的server_id。
測試二:
1,多級復制的檢查深度(--recurse),必須在--check 模式下運行。
zhoujy@zhoujy:~$ pt-heartbeat --user=rep --password=rep --host=192.168.200.25 --port=3307 --create-table -D aaa --interval=1 --frames=1s --master-server-id=12 --print-master-server-id --recurse=3 --recursion-method=processlist --check 192.168.200.25:3307 0.00 12 192.168.200.201:3307 0.00 12
上面的結果現實找到了2個從服務器,其中201是25的從,25必須要開啟log_slave_updates參數,否則無效。通過該方法可以找到所有的從服務器。
2,如何關閉主上面執行的后台進程。可以用參數--stop 去關閉:
zhoujy@zhoujy:~$ pt-heartbeat --stop Successfully created file /tmp/pt-heartbeat-sentinel
這樣就把在主上開啟的進程殺掉了,后續要繼續開啟后台進行的話,需要把/tmp/pt-heartbeat-sentinel 文件刪除,否則啟動不了。
總結:
通過pt-heartbeart工具可以很好的彌補默認主從延遲的問題,但需要搞清楚該工具的原理。而默認的Seconds_Behind_Master值是通過將服務器當前的時間戳與二進制日志中的事件時間戳相對比得到的,所以只有在執行事件時才能報告延時。備庫復制線程沒有運行,也會報延遲null。還有一種情況:大事務,一個事務更新數據長達一個小時,最后提交。這條更新將比它實際發生時間要晚一個小時才記錄到二進制日志中。當備庫執行這條語句時,會臨時地報告備庫延遲為一個小時,執行完后又很快變成0。
通過上面的測試,總結下該工具的使用方法:
1,M-S環境運行:
zhoujy@zhoujy:~$ pt-heartbeat --user=rep --password=rep --host=192.168.200.25 --port=3307 --create-table -D aaa --interval=1 --frames=1s,2s,3s --master-server-id=12 --print-master-server-id --monitor 0.00s [ 0.00s, 0.00s, 0.00s ] 12 0.00s [ 0.00s, 0.00s, 0.00s ] 12 0.00s [ 0.00s, 0.00s, 0.00s ] 12 0.00s [ 0.00s, 0.00s, 0.00s ] 12 0.00s [ 0.00s, 0.00s, 0.00s ] 12 0.00s [ 0.00s, 0.00s, 0.00s ] 12
2,M-S-S環境運行:
zhoujy@zhoujy:~$ pt-heartbeat --user=rep --password=rep --host=192.168.200.25 --port=3307 --create-table -D aaa --interval=1 --frames=1s --master-server-id=12 --print-master-server-id --recurse=3 --recursion-method=processlist --check 192.168.200.25:3307 0.00 12 192.168.200.201:3307 0.00 12
具體的參數參考上面的說明。
更多參考信息:
http://www.percona.com/doc/percona-toolkit/2.2/pt-heartbeat.html
http://blog.csdn.net/z1547840014/article/details/10174667