pt-heartbeat的工作原理通過使用時(shí)間戳方式在主庫上更新特定表,然后在從庫上讀取被更新特定表里的時(shí)間戳,再與本地系統(tǒng)時(shí)間對(duì)比來得出其延遲。
具體流程:
1)在主庫上創(chuàng)建一張heartbeat表,按照一定的時(shí)間頻率更新該表的字段(把時(shí)間更新); 監(jiān)控操作運(yùn)行后,heartbeat表能促使主從同步。
2)連接到從庫上檢查復(fù)制的時(shí)間記錄,和從庫的當(dāng)前系統(tǒng)時(shí)間進(jìn)行比較,得出時(shí)間的差異。
一、使用方法(主從和從庫上都可以執(zhí)行監(jiān)控操作):
pt-heartbeat [OPTIONS] [DSN] —update | —monitor | —check | —stop
注意:需要指定的參數(shù)至少有 --stop 、--update、--monitor、--check
其中--update,--monitor和--check是互斥的;--daemonize和--check也是互斥。
--ask-pass 隱式輸入MySQL密碼
--charset 字符集設(shè)置
--check 檢查從的延遲,檢查一次就退出,除非指定了--recurse會(huì)遞歸的檢查所有的從服務(wù)器。
--check-read-only 如果從服務(wù)器開啟了只讀模式,該工具會(huì)跳過任何插入。
--create-table 在主上創(chuàng)建心跳監(jiān)控的表,如果該表不存在,可以自己手動(dòng)建立,建議存儲(chǔ)引擎改成memory;通過更新該表知道主從延遲的差距。
CREATE TABLE heartbeat (
ts varchar(26) NOT NULL,
server_id int unsigned NOT NULL PRIMARY KEY,
file varchar(255) DEFAULT NULL,
position bigint unsigned DEFAULT NULL,
relay_master_log_file varchar(255) DEFAULT NULL,
exec_master_log_pos bigint unsigned DEFAULT NULL
);
heratbeat 一直在更改ts和position,而ts是檢查復(fù)制延遲的關(guān)鍵
--daemonize 執(zhí)行時(shí),放入到后臺(tái)執(zhí)行
--user=-u, 連接數(shù)據(jù)庫的帳號(hào)
--database=-D, 連接數(shù)據(jù)庫的名稱
--host=-h, 連接的數(shù)據(jù)庫地址
--password=-p, 連接數(shù)據(jù)庫的密碼
--port=-P, 連接數(shù)據(jù)庫的端口
--socket=-S, 連接數(shù)據(jù)庫的套接字文件
--file [--file=output.txt] 打印--monitor最新的記錄到指定的文件,很好的防止?jié)M屏幕全是數(shù)據(jù)。
--frames [--frames=1m,5m,15m] 在--monitor里輸出的[]里的記錄段,默認(rèn)是1m,5m,15m。可以指定1個(gè);如:--frames=1s,多個(gè)用逗號(hào)隔開。可用單位有秒(s)、分鐘(m)、小時(shí)(h)、天(d)。
--interval 檢查、更新的間隔時(shí)間。默認(rèn)是見是1s。最小的單位是0.01s,最大精度為小數(shù)點(diǎn)后兩位,因此0.016將自動(dòng)調(diào)整至0.02。
--log 開啟daemonized模式的所有日志將會(huì)被打印到制定的文件中。
--monitor 持續(xù)監(jiān)控從庫的延遲情況。通過--interval指定的間隔時(shí)間,打印出從庫的延遲信息,通過--file則可以把這些信息打印到指定的文件。
--master-server-id 指定主庫的server_id,若沒有指定則該工具會(huì)連到主庫上查找其server_id。
--print-master-server-id 在--monitor和--check模式下,指定該參數(shù)則打印出主的server_id。
--recurse 多級(jí)復(fù)制的檢查深度。模式M-S-S...不是最后的一個(gè)從庫都需要開啟log_slave_updates,這樣才能檢查到。
--recursion-method 指定復(fù)制檢查的方式,默認(rèn)為processlist,hosts。
--update 更新主庫上的心跳表。
--replace 使用--replace代替--update模式更新心跳表里的時(shí)間字段,這樣的好處是不用管表里是否有行。
--stop 停止運(yùn)行該工具(--daemonize),在/tmp/目錄下創(chuàng)建一個(gè)"pt-heartbeat-sentinel"文件。后面想重新開啟則需要把該臨時(shí)文件刪除,才能開啟(--daemonize)。
--table 指定心跳表名,默認(rèn)heartbeat。
二、演示使用pt-heartbeat
# --master-server-id參數(shù)(主庫my.cnf里配置的server-id值)
a、首先添加表
# pt-heartbeat --user=root --password=pwd -S /tmp/mysql.sock -D test --master-server-id=1 --create-table --update
MASTER> select * from heartbeat;
+----------------------------+-----------+------------------+-----------+-----------------------+---------------------+
| ts | server_id | file | position | relay_master_log_file | exec_master_log_pos |
+----------------------------+-----------+------------------+-----------+-----------------------+---------------------+
| 2022-09-22T09:48:14.003020 | 1 | mysql-bin.000391 | 677136957 | mysql-bin.000180 | 120 |
+----------------------------+-----------+------------------+-----------+-----------------------+---------------------+
b、更新主庫上的heartbeat(后臺(tái)運(yùn)行)
# pt-heartbeat --user=root --password=pwd -S /tmp/mysql.sock -D test --master-server-id=1 --update &
[1] 31249
c、從庫上監(jiān)控延遲
# pt-heartbeat --user=root --password=pwd -S /tmp/mysql.sock -D test --master-server-id=1 --monitor --print-master-server-id
1.00s [ 0.02s, 0.00s, 0.00s ] 1 #實(shí)時(shí)延遲: 1分鐘延遲,5分鐘延遲,15分鐘延遲
1.00s [ 0.03s, 0.01s, 0.00s ] 1
1.00s [ 0.05s, 0.01s, 0.00s ] 1
1.00s [ 0.07s, 0.01s, 0.00s ] 1
1.00s [ 0.08s, 0.02s, 0.01s ] 1
1.00s [ 0.10s, 0.02s, 0.01s ] 1
1.00s [ 0.12s, 0.02s, 0.01s ] 1
1.00s [ 0.13s, 0.03s, 0.01s ] 1
d、其他操作示例
#將主庫上的update使用守護(hù)進(jìn)程方式調(diào)度
# pt-heartbeat --user=root --password=pwd -S /tmp/mysql.sock -D test --master-server-id=1 --update --daemonize
#修改主庫上的更新間隔為2s
# pt-heartbeat --user=root --password=pwd -S /tmp/mysql.sock -D test --master-server-id=1 --update --daemonize --interval=2
#停止主庫上的pt-heartbeat守護(hù)進(jìn)程
# pt-heartbeat --stop
Successfully created file /tmp/pt-heartbeat-sentinel
# rm -rf /tmp/pt-heartbeat-sentinel
#單次查看從庫上的延遲情況
# pt-heartbeat --user=root --password=pwd -S /tmp/mysql.sock -D test --master-server-id=1 --check
1.00
#使用守護(hù)進(jìn)程監(jiān)控從庫并輸出日志
# pt-heartbeat --user=root --password=pwd -S /tmp/mysql.sock -D test --master-server-id=1 --monitor --print-master-server-id --daemonize --log=/tmp/slave-heart.log
三、自動(dòng)化監(jiān)控
注意:
如果想把這個(gè)輸出結(jié)果加入自動(dòng)化監(jiān)控,那么可以使用如下命令使監(jiān)控輸出寫到文件,然后使用腳本定期過濾文件中的最大值作為預(yù)警即可:
注意--log選項(xiàng)必須在有--daemonize參數(shù)的時(shí)候才會(huì)打印到文件中,且這個(gè)文件的路徑最好在/tmp下,否則可能因?yàn)闄?quán)限問題無法創(chuàng)建
# pt-heartbeat -D test --table=heartbeat --monitor --user=root --password=pwd --log=/opt/master-slave-delay.log --daemonize
[root@master-server ~]# tail -f /opt/master-slave-delay.txt //可以測試,在主庫上更新數(shù)據(jù)時(shí),從庫上是否及時(shí)同步,如不同步,可以在這里看到監(jiān)控的延遲數(shù)據(jù)
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.00s [ 0.00s, 0.00s, 0.00s ]
.......
下面是編寫的主從同步延遲監(jiān)控腳本,就是定期過濾--log文件中最大值(此腳本運(yùn)行的前提是:啟動(dòng)更新主庫heartbeat命令以及帶上--log的同步延遲檢測命令)。如果發(fā)生延遲,發(fā)送報(bào)警。
# cat /root/check-slave-monitor.sh
#!/bin/bash
cat /opt/master-slave-delay.log > /opt/master_slave_delay.log
echo -e > /opt/master-slave-delat.log
max_time=`cat /opt/master_slave_delay.log |grep -v '^$' |awk '{print $1}' |sort -k1nr |head -1`
NUM=$(echo "$max_time"|cut -d"s" -f1)
if [ $NUM == "0.00" ];then
echo "MySQL主從同步延遲一致"
else
echo "Mysql主從數(shù)據(jù)同步有延遲"
# TODO 這里添加報(bào)警
fi
結(jié)合crontab,每隔一分鐘檢查一次
# mysql主從同步延遲檢查
* * * * * /bin/bash -x /root/check-slave-monitor.sh > /dev/null 2>&1
關(guān)閉上面在主庫上執(zhí)行heartbeat的守護(hù)進(jìn)程
方法一:可以用參數(shù)--stop去關(guān)閉
# pt-heartbeat --stop
Successfully created file /tmp/pt-heartbeat-sentinel
這樣就把在主上開啟的進(jìn)程殺掉了。
但是后續(xù)要繼續(xù)開啟后臺(tái)進(jìn)行的話,記住一定要先把/tmp/pt-heartbeat-sentinel 文件刪除,否則啟動(dòng)不了
方法二:直接kill掉進(jìn)程pid(推薦這種方法)
#ps -ef|grep heartbeat
kill -9 15152
最后總結(jié):
通過pt-heartbeart工具可以很好地彌補(bǔ)默認(rèn)主從延遲的問題,但需要搞清楚該工具的原理。
重點(diǎn)了:默認(rèn)的Seconds_Behind_Master值是通過將服務(wù)器當(dāng)前的時(shí)間戳與二進(jìn)制日志中的事件時(shí)間戳相對(duì)比得到的,所以只有在執(zhí)行事件時(shí)才能報(bào)告延遲。從庫復(fù)制線程沒有運(yùn)行,也會(huì)報(bào)延遲。
還有一種情況:大事務(wù),一個(gè)事務(wù)更新數(shù)據(jù)長達(dá)一個(gè)小時(shí),最后提交。這條更新將比它實(shí)際發(fā)生時(shí)間要晚一個(gè)小時(shí)才記錄到二進(jìn)制日志中。當(dāng)從庫執(zhí)行這條語句時(shí),會(huì)臨時(shí)地報(bào)告?zhèn)鋷煅舆t為一個(gè)小時(shí),執(zhí)行完后又很快變成0。
以上就是今天的內(nèi)容,希望讀者朋友看完這篇文章后有所啟發(fā)。






