查看mySQL延迟的方法,查看了多个案例,大家众说纷纭,意见差不多一致。如下也是我参考别人经验做的一些测试,希望能检测到mysql复制延迟、数据中断。
方法一:查看Seconds_Behind_Master
该参数有如下值:
- NULL 表示io_thread或sql_thread有一个发生故障,就是说该线程的Running状态时No,而非Yes
- 0 表示主从复制良好,没有lag存在
- 正值 表示主从已出现延时,数字越大表示从库落后主库越多
- 负值 很罕见,是一个BUG,按理说不应该出现
该方法是使用命令show slave status,通过比较SQL THREAD接受events时间的时间戳与IO THREAD执行事件events时间戳的差值–秒数,来确定slave落后于master多少,如主从时间不同,改时间的计算不受影响。
众所周知备库relay-log和主库的bin-log里的内容一样,真正和主库有关两的是io_thread,当主库I/O负载很大或网络阻塞时,io_thread不能及时复制binlog,而sql_thread一直能跟上io_thread的脚步,这时seconds_behind_master的值是0,实际上却不是,这时用该值作为延迟参考则不准。
|
|
方法二:使用pt-heartbeat工具
该工具可以计算出MySQL复制或者是PostgreSQL,它可以更新master或者监控复制。它还可以从f 读取配置。它借助timestmp的比较实现的,首先需要保证主从服务器时间必须要保持一致,通过与相同的一个NTP server同步时钟。它需要在主库上创建一个heartbeat的表,里面的时间戳ts就是当前的时间戳 now(),该结构也会被复制到从库上。表建好以后,会在主库上以后台进程的模式去执行一行更新操作的命令,定期去向表中的插入数据,这 个周期默认为1 秒,同时从库也会在后台执行一个监控命令,与主库保持一致的周期+0.5S(默认0.5S延迟检查)去比较,复制过来记录的ts值与主库上的同一条ts值,差值为0表示无延时,差值越大表示 延时的秒数越多。
使用工具前提:
- 在主库上建立heartbeat表
|
|
- 更新主库上的heartbeat
|
|
- 在从库上监控复制延迟
|
|
当然还有其他一些操作命令:
将主库上的update使用守护进程方式调度
|
|
修改主库上的更新时间间隔为2s
|
|
修改主库上的pt-heartbeat守护进程
|
|
单词查看从库上的延迟情况
|
|
使用守护进程监控从库并输出日志
|
|
如下是脚本的方式,只不过使用脚本的方式实现的。
|
|
脚本运行结果如下:
|
|
但是输出结果没法把报错屏蔽掉。