seconds_behind_master的陷阱和pt-heartbeat

myownstars發表於2015-03-08

Seconds_behind_master

In essence, this field measures the time difference in seconds between the slave SQL thread and the slave I/O thread.

binlog中每個binlog events都會附上執行時的timestampMySQL將當前系統的時間戳同SQL thread正在執行的binlog event上的時間戳做比較,這個差值就Seconds_Behind_Master的值。

主備時延 = masterrelay_log的時延  + relay_logsql_thread的時延,

當後者為0seconds_behind_master也為0,而無法檢測到前者的lag,即該引數只有在sql thread執行binlog event時才被計算。

 

Mysql自身有預防機制:

1  binlog dumpkill時會通知備庫;

備庫長時間沒有收到主庫變更,則會自動重連,由slave-net-timeout/master-connect-retry/master-retry-count決定;

改進

1 採用別的監控方法,如pt-heartbeat,主庫定期將當前時間更新相應表記錄,備庫讀取並與備庫當前時間比較來獲取延遲時間;

  只要表中有記錄,備庫就可以實時計算lag,可避免seconds_behind_master=0可能帶來的誤報。

2 配置slave-net-timeout/master-connect-retry/master-retry-count(後兩種在change master中指定),備庫過了slave-net-timeout(預設3600s)仍未從主庫收到資訊則會嘗試重連,master-connect-retry為重連次數,master-retry-count為每次間隔時間(預設皆為60s)

 

 

Pt-heartbeat

工作原理:

1,在主庫上建立一張heartbeat表,按照一定的時間頻率更新該表的欄位(把時間更新進去)。

2,連線到從庫上檢查複製的時間記錄,和從庫的當前系統時間進行比較,得出時間的差異。

 

在主庫上開啟守護程式來更新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       #執行一次就退出

 

引數

--check

檢查從的延遲,檢查一次就退出,除非指定了--recurse會遞迴的檢查所有的從伺服器。

--monitor

持續監控從的延遲情況。透過--interval指定的間隔時間,列印出從的延遲資訊,透過--file則可以把這些資訊列印到指定的檔案。

--daemonize

執行時,放入到後臺執行

--file 

列印--monitor最新的記錄到指定的檔案,很好的防止滿螢幕都是資料的煩惱。

--frames

在--monitor裡輸出的[]裡的記錄段,預設是1m,5m,15m。可以指定1個,如:--frames=1s,多個用逗號隔開。可用單位有秒(s)、分鐘(m)、小時(h)、天(d)。

--interval

檢查、更新的間隔時間。預設是見是1s。最小的單位是0.01s,最大精度為小數點後兩位,因此0.015將調整至0.02

--log

開啟daemonized模式的所有日誌將會被列印到制定的檔案中。

--update

更新主上的心跳錶。

--replace

使用--replace代替--update模式更新心跳錶裡的時間欄位,這樣的好處是不用管表裡是否有行。

--stop

停止執行該工具(--daemonize),在/tmp/目錄下建立一個“pt-heartbeat-sentinel” 檔案。後面想重新開啟則需要把該臨時檔案刪除,才能開啟(--daemonize)。

--table

指定心跳錶名,預設heartbeat

--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

);

也可簡化為

CREATE TABLE heartbeat (

  id int NOT NULL PRIMARY KEY,

  ts datetime NOT NULL

);

heratbeat表一直在更改ts,若是手工建表則必須手工插入一條記錄

INSERT INTO heartbeat (ts, server_id) VALUES (NOW(), N);

or

INSERT INTO heartbeat (ts, server_id) VALUES (UTC_TIMESTAMP(), N);

 

 

 

測試案例

Master  10.0.0.1:3306

Slave   10.0.0.2:3306

 

1,在主上執行:--daemonize表示守護程式,後臺執行。

[root@test_10.0.0.1 ~]# pt-heartbeat --user=root --ask-pass --host=127.0.0.1 --create-table -D test --interval=1 --update --replace --daemonize

Enter password:

[root@test_10.0.0.1 ~]#

 

3.在主上執行監測複製延遲

複製程式碼

 

[root@test_10.0.0.1 ~]# pt-heartbeat -D test --table=heartbeat --monitor -h 10.0.0.2 uroot -p

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.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去設定。

 

 

如何關閉主上面執行的後臺程式。可以用引數--stop 去關閉:

 

[root@test_10.0.0.1 ~]# pt-heartbeat --stop

Successfully created file /tmp/pt-heartbeat-sentinel

[root@test_10.0.0.1 ~]#

這樣就把在主上開啟的程式殺掉了,後續要繼續開啟後臺進行的話,需要把/tmp/pt-heartbeat-sentinel 檔案刪除,否則啟動不了。

 

參考資料

http://www.cnblogs.com/gomysql/p/3687329.html   


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15480802/viewspace-1452213/,如需轉載,請註明出處,否則將追究法律責任。

相關文章