對(duì)于pt-heartbeat(percona toolkit)的案例代碼
發(fā)表時(shí)間:2023-09-03 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]pt-heartbeat是用來監(jiān)控主從延遲的一款percona工具,現(xiàn)在我們大部分的MySQL架構(gòu)還是基于主從復(fù)制,例如MHA,MMM,keepalived等解決方案。而主從環(huán)境的話,我們很關(guān)心的就是主從延遲的問題,一般情況下我們?cè)趶膸?kù)執(zhí)行以下語(yǔ)句:mysql> show slave sta...
pt-heartbeat是用來監(jiān)控主從延遲的一款percona工具,現(xiàn)在我們大部分的MySQL架構(gòu)還是基于主從復(fù)制,例如MHA,MMM,keepalived等解決方案。而主從環(huán)境的話,我們很關(guān)心的就是主從延遲的問題,一般情況下我們?cè)趶膸?kù)執(zhí)行以下語(yǔ)句:
mysql> show slave status\G*************************** 1. row ***************************Slave_IO_State: Waiting for master to send event
Master_Host: 172.16.16.35Master_User: root
Master_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin.000016Read_Master_Log_Pos: 299786938Relay_Log_File: mxqmongodb2-relay-bin.000032Relay_Log_Pos: 299787151Relay_Master_Log_File: mysql-bin.000016Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0Last_Error:
Skip_Counter: 0Exec_Master_Log_Pos: 299786938Relay_Log_Space: 299787451Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0Last_IO_Error:
Last_SQL_Errno: 0Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 353306Master_UUID: 806ede0c-357e-11e7-9719-00505693235d
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set: 806ede0c-357e-11e7-9719-00505693235d:666-330347Executed_Gtid_Set: 6a4ab82c-4029-11e7-86b0-00505693235d:1-3,
806ede0c-357e-11e7-9719-00505693235d:1-330347Auto_Position: 1Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:1 row in set (0.00 sec)
就可以很明顯看得到主從的狀態(tài),一般我們都會(huì)監(jiān)控以下兩個(gè)進(jìn)程的狀態(tài)確定主從延遲是否出現(xiàn)錯(cuò)誤:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
對(duì)于主從延遲來說,我們可能監(jiān)控最多的就是通過SMB(Seconds_Behind_Master)來監(jiān)控,但是這個(gè)也并不是很靠譜的;蛘呶覀兺ㄟ^監(jiān)控Read_Master_Log_Pos-Exec_Master_Log_Pos的差值來看從庫(kù)是否有延遲,是否和主庫(kù)會(huì)有一定的延遲。但是這個(gè)也并不是很完美。首先看SMB,這個(gè)參數(shù)是怎么比較出來的呢,SMB是通過將服務(wù)器當(dāng)前的時(shí)間戳與二進(jìn)制日志中的事件時(shí)間戳相對(duì)比得到的,而且是會(huì)產(chǎn)生誤報(bào)的情況。比如主庫(kù)執(zhí)行一個(gè)大事物,時(shí)間執(zhí)行很久,從庫(kù)接收以后對(duì)比時(shí)間戳發(fā)現(xiàn)已經(jīng)延遲了,就會(huì)瞬間增大SMB的值。Read_Master_Log_Pos-Exec_Master_Log_Pos的值也并不是完全可靠,F(xiàn)在pt-heartbeat就能幫我們解決這個(gè)問題。
下面我們來看一下pt-heartbeat的原理:
pt-heartbeat會(huì)在master上創(chuàng)建一張表,按照一定的時(shí)間頻率更新該表的字段,向該表寫入當(dāng)前的時(shí)間戳,然后對(duì)比從庫(kù)的時(shí)間戳和pt-heartbeat所在機(jī)器的時(shí)間戳來判斷主從延遲。
其實(shí)這里就有一個(gè)問題了,如果pt-heartbeat部署在從庫(kù)的話,要保證主從機(jī)器的時(shí)間是同步的,這個(gè)一般都是系統(tǒng)會(huì)每天自動(dòng)對(duì)時(shí)間,是可以實(shí)現(xiàn)的。如果pt-heartbeat部署在主庫(kù)就不會(huì)有這個(gè)問題。其實(shí)個(gè)人感覺比較好的方法就是對(duì)比主從兩個(gè)庫(kù)的這張表的時(shí)間戳來得出延遲更為靠譜一點(diǎn),當(dāng)然這也要考慮到主從查詢的問題。
下面看一下基本的用法:
先創(chuàng)建表:
[root@mxqmongodb2 bin]# ./pt-heartbeat --host=172.16.16.35 --port=3306 --user=root --password=123456 --database=test --update --create-table --daemonize
看一下表結(jié)構(gòu):
mysql> desc heartbeat;+-----------------------+---------------------+------+-----+---------+-------+
Field Type Null Key Default Extra
+-----------------------+---------------------+------+-----+---------+-------+
ts varchar(26) NO NULL
server_id int(10) unsigned NO PRI NULL
file varchar(255) YES NULL
position bigint(20) unsigned YES NULL
relay_master_log_file varchar(255) YES NULL
exec_master_log_pos bigint(20) unsigned YES NULL
+-----------------------+---------------------+------+-----+---------+-------+6 rows in set (0.01 sec)
mysql> select * from heartbeat\G*************************** 1. row ***************************ts: 2017-06-23T09:27:49.001580server_id: 353306file: mysql-bin.000016position: 299837221relay_master_log_file: NULL
exec_master_log_pos: NULL1 row in set (0.00 sec)
具體看一下,我們看一下數(shù)據(jù)庫(kù)的鏈接,發(fā)現(xiàn)有一個(gè)更新操作:
UPDATE `test`.`heartbeat` SET ts='2017-06-23T09:32:47.001330', file='mysql-bin.000016', position='29
其實(shí)下面的操作只是開啟了一個(gè)進(jìn)程,對(duì)heartbeat表不停的進(jìn)行更新,以獲取最新的數(shù)據(jù)。
[root@mxqmongodb2 bin]# ./pt-heartbeat --host=172.16.16.35 --port=3306 --user=root --password=123456 --database=test --update --daemonize
接下來我們開啟監(jiān)控進(jìn)程,這個(gè)是不停的刷新的:
[root@mxqmongodb2 bin]# ./pt-heartbeat -D test --monitor -h 172.16.16.34 -uroot -P3306 -p1234560.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 ]
我們指定會(huì)發(fā)現(xiàn)是沒有延遲的,我們現(xiàn)在開啟壓測(cè),再觀察一下:
[root@mxqmongodb2 tpcc-mysql]# ./tpcc_start -h127.0.0.1 -P3306 -d tpcc -u root -p123456 -w 10 -c 20 -r 10 -l 600
觀察延遲的情況:
0.71s [ 0.68s, 0.16s, 0.05s ]1.71s [ 0.71s, 0.17s, 0.06s ]0.85s [ 0.72s, 0.17s, 0.06s ]0.93s [ 0.74s, 0.18s, 0.06s ]0.00s [ 0.74s, 0.18s, 0.06s ]0.82s [ 0.73s, 0.18s, 0.06s ]0.66s [ 0.75s, 0.18s, 0.06s ]0.00s [ 0.75s, 0.18s, 0.06s ]0.88s [ 0.74s, 0.18s, 0.06s ]1.00s [ 0.74s, 0.19s, 0.06s ]
我們可以看到延遲情況,我們可以把這些輸出結(jié)果重定向到一個(gè)文件,對(duì)主從延遲進(jìn)行監(jiān)控,這也是很有效果的。
我們現(xiàn)在手動(dòng)再?gòu)膸?kù)停掉sql_thread:
mysql> stop slave sql_thread;
Query OK, 0 rows affected (0.03 sec)
然后再看輸出結(jié)果:
53.00s [ 23.85s, 6.77s, 4.20s ]54.00s [ 24.75s, 6.94s, 4.26s ]55.00s [ 25.67s, 7.12s, 4.32s ]56.00s [ 26.60s, 7.30s, 4.39s ]57.00s [ 27.55s, 7.48s, 4.45s ]58.00s [ 28.52s, 7.67s, 4.51s ]59.00s [ 29.50s, 7.86s, 4.58s ]60.00s [ 30.50s, 8.05s, 4.65s ]61.00s [ 31.50s, 8.23s, 4.71s ]62.00s [ 32.50s, 8.42s, 4.78s ]63.00s [ 33.50s, 8.61s, 4.85s ]64.00s [ 34.50s, 8.80s, 4.92s ]65.00s [ 35.50s, 8.98s, 5.00s ]
發(fā)現(xiàn)是不停的遞增的,一次間隔時(shí)間為一秒鐘。我們?cè)賳?dòng)這個(gè)sql_thread,從庫(kù)很快就跟上了主庫(kù)。
或者我們可以通過下面進(jìn)行監(jiān)控:
[root@mxqmongodb2 bin]# ./pt-heartbeat -D test --check -h 172.16.16.34 -uroot -P3306 -p1234561.00[root@mxqmongodb2 bin]# ./pt-heartbeat -D test --check -h 172.16.16.34 -uroot -P3306 -p1234560.00
他是會(huì)直接返回一個(gè)延遲的秒數(shù),這個(gè)也是比較靠譜的。我們可以直接拿這個(gè)值進(jìn)行監(jiān)控。
以上就是關(guān)于pt-heartbeat(percona toolkit)的實(shí)例代碼的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!
學(xué)習(xí)教程快速掌握從入門到精通的SQL知識(shí)。