ITPub博客

首页 > 数据库 > MySQL > seconds_behind_master的陷阱和pt-heartbeat

seconds_behind_master的陷阱和pt-heartbeat

原创 MySQL 作者:myownstars 时间:2015-03-08 11:24:48 0 删除 编辑

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)

http://www.woqutech.com/?p=1116

 

 

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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2010-03-18

  • 博文量
    375
  • 访问量
    3095422