percona-toolkit---pt-heartbeat

对于MySQL数据库主从复制延迟的监控,可以借助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 【--file=output.txt】   打印--monitor最新的记录到指定的文件,很好的防止满屏幕都是数据的烦恼。
--frames 【--frames=1m,2m,3m】  在--monitor里输出的[]里的记录段,默认是1m,5m,15m。可以指定1个,如:--frames=1s,多个用逗号隔开。可用单位有秒(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。

实例说明:
master:192.168.1.101
slave:192.168.1.102
同步的库:test、test
主从库都能使用root账号、密码123456登录

先操作针对test库的检查,其他同步的库的检查操作类似!

更新主库上的heartbeat,--interval=1表示1秒钟更新一次(注意这个启动操作要在主库服务器上执行)

[root@vm371 fulltable]# pt-heartbeat --user=root --ask-pass --host=104.2.142.146 --create-table -D test --interval=1 --update --replace --daemonize
Enter password:
[root@vm371 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 --user=root --ask-pass --host=10.2.132.166 --create-table -D test --interval=1 --update --replace --daemonize
root     14154 12310  0 14:06 pts/0    00:00:00 grep --color=auto 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
 

在主库运行监测同步延迟:

[root@vm371 fulltable]# pt-heartbeat -D test --table=heartbeat --monitor --host=104.2.132.146 --user=root --password=123456
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)

[root@vm371 fulltable]# pt-heartbeat -D test --table=heartbeat --monitor --host=190.29.132.156 --user=root --password=123456 --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_psswd=123456
s_user=root
s_port=3306
s_host=localhost# master
m_psswd=123456
m_user=root
m_port=3306
m_host=192.168.0.102slave_wan_ip=`ifconfig | sed -n '/inet /{s/.*addr://;s/ .*//;p}' | head -n1`while true
dosleep 1echo -e "\e[1;33m###################################\e[0m"Master_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_Num=`echo $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_Num=`echo $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[0m"exit 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[0m"elseif [ $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[0m"echo -e "\e[1;31mMaster:$m_host Slave:$slave_wan_ip\e[0m"echo -e "\e[1;31mMaster当前binlog: $Master_File"echo -e "\e[1;31mSlave当前binlog:  $Master_Log_File"echo -e "\e[1;31mbinlog相差文件数: $log_count\e[0m"echo -e "\e[1;31mPos点相差:        $pos_count\e[0m"fififi
done

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/535316.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

定时删除脚本

#!/bin/sh backup_dir/data/xtrabackup DATEdate %Y-%m-%d #DATE_NOWdate %Y-%m-%d.%H%M DATE_NOWdate %Y-%m-%d PATH/usr/local/mysql/bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin export PATHbinog保留7天 binlog/data/binlogserver binlog_Rtime7#备…

percona-toolkit--pt-table-checksum

pt-table-checksum 是 Percona-Toolkit的组件之一,用于检测MySQL主、从库的数据是否一致。其原理是在主库执行基于statement的sql语句来生成主库数据块的checksum,把相同的sql语句传递到从库执行,并在从库上计算相同数据块的checksum&#xf…

Docker容器间网络通信

自从Docker容器出现以来,容器网络通信就一直是被关注的焦点,也是生产环境的迫切需求。容器网络通信又分为两大方面:单主机容器上的相互通信,和跨主机的容器相互通信。 一、Docker单主机容器通信 基于对net namespace的控制&#…

Docker容器的重启策略

1. Docker容器的重启策略 Docker容器的重启策略是面向生产环境的一个启动策略,在开发过程中可以忽略该策略。 Docker容器的重启都是由Docker守护进程完成的,因此与守护进程息息相关。 Docker容器的重启策略如下: no,默认策略&…

innobackupex实现导出和导入单张表

默认情况下,InnoDB表不能通过直接复制表文件的方式在mysql服务器之间进行移植,即便使用了innodb_file_per_table选项。而使用Xtrabackup工具可以实现此种功能,不过只能"导出"具有.ibd文件的表,也就是说导出表的mysql服务…

xtrabackup工具

(1).备份过程 和innobackupex备份过程不同的是,xtrabackup的备份路径是由"--target-dir"选项严格指定的,如果指定的目录不存在,它备份的时候不会在target-dir目录中再创建时间戳子目录。 [rootxuexi data]# xtrabackup --backup …

mysql数据库参数

注意:在配置binlog相关变量的时候,相关变量名总是搞混,因为有的是binlog,有的是log_bin,当他们分开的时候,log在前,当它们一起的时候,bin在前。在配置文件中也同样如此。 log_bin …

oracle命令行安装

cd /home/oracle/databases/runInstaller -silent -force -showprogress -responseFile /home/oracle/database/db_install.rsp -ignoreSysPrereqs -ignorePrereqdbca -silent -responseFile pwd/dbca.rspnetca -silent -responseFile /home/oracle/databases/netca.rsp

定期删除数据脚本

#!/bin/sh backup_dir/data/xtrabackup DATEdate %Y-%m-%d #DATE_NOWdate %Y-%m-%d.%H%M DATE_NOWdate %Y-%m-%d PATH/usr/local/mysql/bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin export PATH#binog保留7天 binlog/data/binlogserver binlog_Rtime7#备…

定期备份数据库脚本

#!/bin/bash MasterIp* USERroot PORT3306 PASSWD000000 DATEdate %Y-%m-%d #DATE_NOWdate %Y-%m-%d.%H%M DATE_NOWdate %Y-%m-%d OLDDATEdate %Y-%m-%d -d "30 days ago"  #全表备份 BACKUPDIR/data/mysql_backup/fulltable #单表tb_trcevt备份 datapath/data/mysq…

日志清理脚本

#!/bin/bash#定义日志所在分区当前空间所占比例数(去掉%)。grep -w表示精准匹配,只匹配"/"这个分区 LOG_PARTITION$(which df -h|awk {print $5,$6}|grep -w "/"|cut -d" " -f1|awk -F"%" {print $1}) #定义一周前的日期&a…

k8s二进制安装

1. 前言 之前文章安装 kubernetes 集群,都是使用 kubeadm 安装,然鹅很多公司也采用二进制方式搭建集群。这篇文章主要讲解,如何采用二进制包来搭建完整的高可用集群。相比使用 kubeadm 搭建,二进制搭建要繁琐很多,需要…

Logstash mutate 插件

mutate 插件可以在字段上执行变换,包括重命名、删除、替换和修改。这个插件相当常用。 比如: 你已经根据 Grok 表达式将 Tomcat 日志的内容放到各个字段中,想把状态码、字节大小或是响应时间,转换成整型;你已经根据正则…

nginx日志分析脚本

#!/usr/bin/env bashecho "" echo " " echo " \ Nginx日志安全分析脚本 V1.0 / " echo " " echo " # 支持Nginx日志分析,攻击告警分析等 " echo " # auth…

ELK学习笔记之Logstash详解

0x00 Logstash概述 官方介绍:Logstash is an open source data collection engine with real-time pipelining capabilities。简单来说logstash就是一根具备实时数据传输能力的管道,负责将数据信息从管道的输入端传输到管道的输出端;与此同时…

nginx-zabbix监控脚本

nginx_status_fun (){#函数内容NGINX_PORT$1#端口,函数的第一个参数是脚本的第二个参数,即脚本的第二个参数是段端口号NGINX_COMMAND$2#命令,函数的第二个参数是脚本的第三个参数,即脚本的第三个参数是命令nginx_active(){ #获…

percona-xtrabackup备份

#!/bin/bash # 需要安装 percona-xtrabackup # xtrabackup: https://www.percona.com/downloads/Percona-XtraBackup-2.4/LATEST/ # xtrabackup 版本:2.4.24 (RPM安装) # MySQL 版本: 5.7.36 (RPM安装) # version: 22.01.17# 备份服务器 ip DB_BACKUP_SERVER"…

k8---proxy

kube-proxy 通过 Informer知道了Service、endpoints对象的创建,然后把service身上的CLUSTER-IP 和端口已经端点信息拿出来,创建iptable NAT规则做转发或通过ipvs模块创建VS服务器,这样经过CLUSTER-IP的流量都被转发到后端pod。 iptables模式 …

k8s--configmap

当卷中使用的ConfigMap被更新时,所投射的键最终也会被更新。kubelet组件会在每次周期性同步时检查所挂载的ConfigMap是否为最新。 不过,kubelet使用的是其本地的高速缓存来获得ConfigMap的当前值。 ConfigMap既可以通过watch操作实现内容传播(默认形式&…

etcd命令

[rootlocalhost calico]# etcdctl get /coreos.com/network/subnets/4.0.32.0-24 {"PublicIP":"10.8.65.53"} 从etcd中查询出4.0.32.0/24的子网的宿主机host的ip10.8.65.53。