天天看點

percona-toolkit 之 【pt-heartbeat】說明

背景:

      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

~~~~~~~~~~~~~~~

萬物之中,希望至美

~~~~~~~~~~~~~~~