网站开发技术学习,网站常用的字体,易企秀电脑版,公司建网站几天可以对于MySQL数据库主从复制延迟的监控#xff0c;可以借助percona的有力武器pt-heartbeat来实现。 pt-heartbeat的工作原理通过使用时间戳方式在主库上更新特定表#xff0c;然后在从库上读取被更新的时间戳然后与本地系统时间对比来得出其延迟。具体流程#xff1a; 1可以借助percona的有力武器pt-heartbeat来实现。 pt-heartbeat的工作原理通过使用时间戳方式在主库上更新特定表然后在从库上读取被更新的时间戳然后与本地系统时间对比来得出其延迟。具体流程 1在主上创建一张heartbeat表按照一定的时间频率更新该表的字段把时间更新进去。监控操作运行后heartbeat表能促使主从同步 2连接到从库上检查复制的时间记录和从库的当前系统时间进行比较得出时间的差异。
使用方法主从和从库上都可以执行监控操作 pt-heartbeat [OPTIONS] [DSN] --update|--monitor|--check|--stop
注意需要指定的参数至少有 --stop--update--monitor--check。
其中--update--monitor和--check是互斥的--daemonize和--check也是互斥。
--ask-pass 隐式输入MySQL密码
--charset 字符集设置
--check 检查从的延迟检查一次就退出除非指定了--recurse会递归的检查所有的从服务器。
--check-read-only 如果从服务器开启了只读模式该工具会跳过任何插入。
--create-table 在主上创建心跳监控的表如果该表不存在可以自己手动建立建议存储引擎改成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是我们检查复制延迟的关键。
--daemonize 执行时放入到后台执行
--user-u 连接数据库的帐号
--database-D 连接数据库的名称
--host-h 连接的数据库地址
--password-p 连接数据库的密码
--port-P 连接数据库的端口
--socket-S 连接数据库的套接字文件
--file 【--fileoutput.txt】 打印--monitor最新的记录到指定的文件很好的防止满屏幕都是数据的烦恼。
--frames 【--frames1m,2m,3m】 在--monitor里输出的[]里的记录段默认是1m,5m,15m。可以指定1个如--frames1s多个用逗号隔开。可用单位有秒s、分钟m、小时h、天d。
--interval 检查、更新的间隔时间。默认是见是1s。最小的单位是0.01s最大精度为小数点后两位因此0.015将调整至0.02。
--log 开启daemonized模式的所有日志将会被打印到制定的文件中。
--monitor 持续监控从的延迟情况。通过--interval指定的间隔时间打印出从的延迟信息通过--file则可以把这些信息打印到指定的文件。
--master-server-id 指定主的server_id若没有指定则该工具会连到主上查找其server_id。
--print-master-server-id 在--monitor和--check 模式下指定该参数则打印出主的server_id。
--recurse 多级复制的检查深度。模式M-S-S...不是最后的一个从都需要开启log_slave_updates这样才能检查到。
--recursion-method 指定复制检查的方式,默认为processlist,hosts。
--update 更新主上的心跳表。
--replace 使用--replace代替--update模式更新心跳表里的时间字段这样的好处是不用管表里是否有行。
--stop 停止运行该工具--daemonize在/tmp/目录下创建一个“pt-heartbeat-sentinel” 文件。后面想重新开启则需要把该临时文件删除才能开启--daemonize。
--table 指定心跳表名默认heartbeat。
实例说明 master192.168.1.101 slave192.168.1.102 同步的库test、test 主从库都能使用root账号、密码123456登录
先操作针对test库的检查其他同步的库的检查操作类似
更新主库上的heartbeat,--interval1表示1秒钟更新一次注意这个启动操作要在主库服务器上执行
[rootvm371 fulltable]# pt-heartbeat --userroot --ask-pass --host104.2.142.146 --create-table -D test --interval1 --update --replace --daemonize Enter password: [rootvm371 fulltable]# ps -ef|grep pt-heartbeat root 14073 1 0 14:06 ? 00:00:00 perl /app/percona-toolkit-3.3.1/bin/pt-heartbeat --userroot --ask-pass --host10.2.132.166 --create-table -D test --interval1 --update --replace --daemonize root 14154 12310 0 14:06 pts/0 00:00:00 grep --colorauto pt-heartbeat
mysql select * from heartbeat\G; *************************** 1. row *************************** ts: 2021-08-02T14:27:23.002120 server_id: 1583306 file: mysql-bin.000026 position: 332806008 relay_master_log_file: exec_master_log_pos: 0 1 row in set (0.00 sec)
ERROR: No query specified
在主库运行监测同步延迟:
[rootvm371 fulltable]# pt-heartbeat -D test --tableheartbeat --monitor --host104.2.132.146 --userroot --password123456 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 ] 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 ] 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 ] 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去设置。
或者加上--master-server-id参数主库my.cnf里配置的server-id值也可以将主库的server-id打印出来--print-master-server-id
[rootvm371 fulltable]# pt-heartbeat -D test --tableheartbeat --monitor --host190.29.132.156 --userroot --password123456 --print-master-server-id 0.00s [ 0.00s, 0.00s, 0.00s ] 1583306 0.00s [ 0.00s, 0.00s, 0.00s ] 1583306 0.00s [ 0.00s, 0.00s, 0.00s ] 1583306 0.00s [ 0.00s, 0.00s, 0.00s ] 1583306 0.00s [ 0.00s, 0.00s, 0.00s ] 1583306 0.00s [ 0.00s, 0.00s, 0.00s ] 1583306 0.00s [ 0.00s, 0.00s, 0.00s ] 1583306 0.00s [ 0.00s, 0.00s, 0.00s ] 1583306 0.00s [ 0.00s, 0.00s, 0.00s ] 1583306 0.00s [ 0.00s, 0.00s, 0.00s ] 1583306 0.00s [ 0.00s, 0.00s, 0.00s ] 1583306 0.00s [ 0.00s, 0.00s, 0.00s ] 1583306 上面的监测命令会一直在运行状态中可以使用--check监测一次就退出 注意使用了--check就不能使用--monit --update--monitor和--check是互斥的--daemonize和--check也是互斥。
通过pt-heartbeart工具可以很好的弥补默认主从延迟的问题但需要搞清楚该工具的原理。 默认的Seconds_Behind_Master值是通过将服务器当前的时间戳与二进制日志中的事件时间戳相对比得到的所以只有在执行事件时才能报告延时。备库复制线程没有运行也会报延迟null。 还有一种情况大事务一个事务更新数据长达一个小时最后提交。这条更新将比它实际发生时间要晚一个小时才记录到二进制日志中。当备库执行这条语句时会临时地报告备库延迟为一个小时执行完后又很快变成0。 一般上而言I/O线程不会造成过大的延迟主要的延迟还是在SQL线程上
Master_Log_File表示从库I/O线程当前读取Binlog的文件名如果比主库当前的binlog日志还小的话说明从库I/O接受主库的日志慢了。
Read_Master_Log_File表示SQL线程正在应用的Relay Log对应的Binlog如果这个binlog文件比较老说明SQL线程应用日志的速度过慢因此基本可以判断出延迟的线程是SQL线程了。
上面两个多用于进行比较。
Read_Master_Log_Pos表示从库I/O线程读取主库Binlog的位置。
Exec_Master_Log_Pos表示SQL线程正在应用Relay Log的位置对应于主库Binlog的位置。
你可以通过 Read_Master_Log_Pos – Exec_Master_Log_Pos 得到的差值来计算SQL_THREAD的落后但前提是Master_Log_File和Relay_Master_Log_File是相同的
1、首先看 Relay_Master_Log_File 和 Master_Log_File 是否有差异
2、如果Relay_Master_Log_File 和 Master_Log_File 有差异的话那说明延迟很大
3、如果Relay_Master_Log_File 和 Master_Log_File 没有差异再来看Exec_Master_Log_Pos 和 Read_Master_Log_Pos 的差异那么更加严谨的做法是同时在主库执行show master status和在从库上面执行show slave status 的输出进行比较。MHA就是这样保证数据一致性的。MMM都没有做到。这也算MHA比MMM更加优秀的地方。
#!/bin/bash
# 判断主从复制是否延迟
# write by yayun 2014-07-23
# http://www.cnblogs.com/gomysql/# slave
s_psswd123456
s_userroot
s_port3306
s_hostlocalhost# master
m_psswd123456
m_userroot
m_port3306
m_host192.168.0.102slave_wan_ipifconfig | sed -n /inet /{s/.*addr://;s/ .*//;p} | head -n1while true
dosleep 1echo -e \e[1;33m###################################\e[0mMaster_Log_File$(mysql -u$s_user -p$s_psswd -h$s_host -P$s_port -e show slave status\G | grep -w Master_Log_File | awk -F: {print $2})Relay_Master_Log_File$(mysql -u$s_user -p$s_psswd -h$s_host -P$s_port -e show slave status\G | grep -w Relay_Master_Log_File | awk -F: {print $2})Read_Master_Log_Pos$(mysql -u$s_user -p$s_psswd -h$s_host -P$s_port -e show slave status\G | grep -w Read_Master_Log_Pos | awk -F: {print $2})Exec_Master_Log_Pos$(mysql -u$s_user -p$s_psswd -h$s_host -P$s_port -e show slave status\G | grep -w Exec_Master_Log_Pos | awk -F: {print $2}|sed s/[ \t]*$//g)Master_Log_File_Numecho $Master_Log_File | awk -F . {print $2} | sed s/^0\//Master_File$(mysql -u$m_user -p$m_psswd -h$m_host -P$m_port -Nse show master status | awk {print $1})Master_Pos$(mysql -u$m_user -p$m_psswd -h$m_host -P$m_port -Nse show master status | awk {print $2}|sed s/[ \t]*$//g)Master_File_Numecho $Master_File | awk -F . {print $2} | sed s/^0\//if [ -z $Master_Log_File ] [ -z $Relay_Master_Log_File ] [ -z $Read_Master_Log_Pos ] [ -z $Exec_Master_Log_Pos ]thenecho -e \e[1;31mSLAVE 没有取到值请检查参数设置!\e[0mexit 1fiif [ $Master_Log_File $Relay_Master_Log_File ] [ $Read_Master_Log_Pos $Exec_Master_Log_Pos ]thenif [ $Master_Log_File $Master_File ] [ $Exec_Master_Log_Pos $Master_Pos ]thenecho -e \e[1;32mMaster-slave 复制无延迟 ^_^\e[0melseif [ $Master_Log_File_Num -gt $Master_File_Num ] || [ $Master_Pos -gt $Exec_Master_Log_Pos ]thenlog_count$(expr $Master_Log_File_Num - $Master_File_Num)pos_count$(expr $Master_Pos - $Exec_Master_Log_Pos)echo -e \e[1;31mMaster-slave 复制延迟 !!!\e[0mecho -e \e[1;31mMaster:$m_host Slave:$slave_wan_ip\e[0mecho -e \e[1;31mMaster当前binlog: $Master_Fileecho -e \e[1;31mSlave当前binlog: $Master_Log_Fileecho -e \e[1;31mbinlog相差文件数: $log_count\e[0mecho -e \e[1;31mPos点相差: $pos_count\e[0mfififi
done