主从复制延时判断

在生产环境中,主从复制常常会有复制延迟的现象,主要是master是并发的写,而slave是单线程的应用relay log,所以会出现复制延时,在MySQL 5.6版本中有了基于库的多线程复制。还有MariaDB的并行复制。但是我们使用MySQL 5.5的版本也比较多。如何判断复制是否延时呢?工具现在可以使用的有pt-heartbeat,但是如果我们自己明白怎么样判断复制是否延时的话,自己写简单的shell脚本或者python脚本也可以完成。

复制是否延时的判断标准如下

不要通过Seconds_Behind_Master去判断,该值表示slave上SQL线程和IO线程之间的延迟

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更加优秀的地方。

so,根据上面的规则,我写了简单的shell脚本,如下:

#!/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.102

slave_wan_ip=`ifconfig | sed -n ‘/inet /{s/.*addr://;s/ .*//;p}‘ | head -n1`

while true
do
    sleep 1
    echo -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 ]
    then
        echo -e "\e[1;31mSLAVE 没有取到值,请检查参数设置!\e[0m"
        exit 1
    fi

    if [ $Master_Log_File = $Relay_Master_Log_File ] && [ $Read_Master_Log_Pos = $Exec_Master_Log_Pos ]
    then
        if [ $Master_Log_File = $Master_File ] && [ $Exec_Master_Log_Pos = $Master_Pos ]
        then
            echo -e "\e[1;32mMaster-slave 复制无延迟 ^_^\e[0m"
        else
            if [ $Master_Log_File_Num -gt $Master_File_Num ] || [ $Master_Pos -gt $Exec_Master_Log_Pos ]
            then
                log_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"
            fi
        fi
    fi
done

如果你觉得判断的标准或者脚本还不够完善,可以相互交流一下。^_^

主从复制延时判断

时间: 2024-08-03 08:35:40

主从复制延时判断的相关文章

双击时不运行单击事件——加延时判断

思路很简单,就是加一个延时,判断在特定时间内是否有第二个鼠标事件 [cpp] view plaincopyprint? //tqt.h #ifndef TQT_H_ #define TQT_H_ #include <QtGui> #include <QtCore> class ClickedLabel : public QLabel { Q_OBJECT private: int press; //QTimer *timer; protected: void mousePressE

10 : mysql 主从复制 - 延时从库

延时从库 主从复制很好的解决了物理损坏,但是如果主库有个误删除写入的操作怎么办? 正常情况下从库也会同步这个错误的,企业中应该怎么避免这个情况?这个时候就需要使用延时同步来解决: 延时从库?delay(延时)从节点同步数据. 对SQL线程进行延时设置.IO线程正常的执行.企业中一般延迟3-6小时 延时从库的配置过程:mysql>stop slave;mysql>CHANGE MASTER TO MASTER_DELAY = 60; (延时60s)mysql>start slave;mys

MySQL 主从复制延时监控

#!/bin/bash USER="root" PASSWORD="root" MYSQL="/usr/mysql/mysql-5.6.10/client/mysql" HOST="10.198.18.18" thread_status=$($MYSQL -u"$USER" -p"$PASSWORD" -h"$HOST" -e 'show slave status\G

MySQL 5.7最新版本的2个bug

好久没写博客了,都长草了.新业务上了5.7没遇到什么问题,虽然没遇到什么问题,但不代表没有问题,我有个习惯就是没事就喜欢逛逛percona的Blog,于是看到目前最新GA版本5.7.17的2个bug,于是就搭建环境进行bug复现.目前知道的2个bug如下: 1. slave_parallel_workers > 0,也就是开启了多线程复制的时候如果有延时,那么Seconds_Behind_Master一直是0,不会变化,虽然这个参数不准确,但也是一个衡量指标.准确的复制延时判断的请看我前面的文章

如何实现 MySQL 的读写分离?MySQL 主从复制原理的是啥?如何解决 MySQL 主从同步的延时问题?

高并发这个阶段,肯定是需要做读写分离的,啥意思?因为实际上大部分的互联网公司,一些网站,或者是 app,其实都是读多写少.所以针对这个情况,就是写一个主库,但是主库挂多个从库,然后从多个从库来读,那不就可以支撑更高的读并发压力了吗? 如何实现 MySQL 的读写分离? 其实很简单,就是基于主从复制架构,简单来说,就搞一个主库,挂多个从库,然后我们就单单只是写主库,然后主库会自动把数据给同步到从库上去. MySQL 主从复制原理的是啥? 主库将变更写入 binlog 日志,然后从库连接到主库之后,

MySQL Replication 主从复制全方位解决方案

原文:MySQL Replication 主从复制全方位解决方案 1.1 主从复制基础概念 在了解主从复制之前必须要了解的就是数据库的二进制日志(binlog),主从复制架构大多基于二进制日志进行,二进制日志相关信息参考:http://www.cnblogs.com/clsn/p/8087678.html#_label6 1.1.1 二进制日志管理说明 二进制日志在哪?如何设置位置和命名? 在my.cnf文件中使用 log-bin = 指定:命名规则为 mysql-bin.000000 (后为6

MySQL主从延时复制

MySQL的主从复制是实现MySQL大规模集群的基础,其在日常生产环境中被广泛的被应用,而在MySQL5.6开始对MySQL的底层代码不断的重构完善后在MySQL的主从复制取得极大的进步,且在5.7版本引入主从多线程复制(http://blog.51cto.com/jim123/1961241),而在5.6版本开始MySQL的主从复制就支持slave上延时复制master而不需要借助第三方工具实现,主从复制延时可以在master误删除数据后在slave中延时一定时间后快速找回误删除数据,至于设置

【深入学习Redis】主从复制(下)

(续上文) 六.应用中的问题 1. 读写分离及其中的问题 在主从复制基础上实现的读写分离,可以实现Redis的读负载均衡:由主节点提供写服务,由一个或多个从节点提供读服务(多个从节点既可以提高数据冗余程度,也可以最大化读负载能力):在读负载较大的应用场景下,可以大大提高Redis服务器的并发量.下面介绍在使用Redis读写分离时,需要注意的问题. 1.延迟与不一致问题 前面已经讲到,由于主从复制的命令传播是异步的,延迟与数据的不一致不可避免.如果应用对数据不一致的接受程度程度较低,可能的优化措施

读完这篇文章,就基本搞定了Redis主从复制

在前面的两篇文章中,我们分别介绍了Redis的内存模型和Redis持久化技术及方案选择. 在之前的文章中曾提到过,Redis高可用的方案包括持久化.主从复制(及读写分离).哨兵和集群.其中持久化侧重解决的是Redis数据的单机备份问题(从内存到硬盘的备份):而主从复制则侧重解决数据的多机热备.此外,主从复制还可以实现负载均衡和故障恢复. 在本文中,我们将详细介绍Redis主从复制的方方面面,包括:如何使用主从复制.主从复制的原理(重点是全量复制和部分复制.以及心跳机制).实际应用中需要注意的问题