在生产环境中,主从复制常常会有复制延迟的现象,主要是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=
s_user=root
s_port=
s_host=localhost # master
m_psswd=
m_user=root
m_port=
m_host=192.168.0.102 slave_wan_ip=`ifconfig | sed -n '/inet /{s/.*addr://;s/ .*//;p}' | head -n1` while true
do
sleep
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

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

作者:Atlas

出处:Atlas的博客 http://www.cnblogs.com/gomysql

您的支持是对博主最大的鼓励,感谢您的认真阅读。本文版权归作者所有,欢迎转载,但请保留该声明

最新文章

  1. Datatable转换Json
  2. gulp-notify处理报错----gulp系列(二)
  3. JavaScript实现dropdownlist选定值后将选定值的key与value填入两个textbox中
  4. C# 矩阵计算
  5. wikioi 1206 保留两位小数 【考查浮点数输入输出】
  6. < java.util >-- List接口
  7. android学习日记24--Android 菜单开发
  8. 转:Oracle EBS FND User Info API
  9. OD: Kernel Vulnerabilities
  10. 笔记-AndroidStudio开发环境的搭建
  11. 使用faker 生成中文测试数据
  12. 配置VNC SERVER 远程访问
  13. Java HttpURLConnection发送post请求示例
  14. 从裸机到实时操作系统RTOS
  15. 用Python3、NetCore、Shell分别开发一个Ubuntu版的定时提醒(附NetCore跨平台两种发布方式)
  16. MySQL5.7.21解压版安装详细教程
  17. 大数据入门第二十二天——spark(三)自定义分区、排序与查找
  18. Jenkins+Jmeter+Ant自动化集成环境搭建
  19. php分享二十二:设计模式
  20. Asterisk——part 1

热门文章

  1. 101 to 010 Atcoder CODE FESTIVAL 2017 qual B D
  2. 前端开发---css样式的使用方式
  3. a标签中href=""的几种用法
  4. Android 流量测试方法
  5. Ajax返回数据格式
  6. MVC dropdownlist 后端设置select属性后前端依然不能默认选中的解决方法
  7. IDEA JavaSE环境配置
  8. 1、二维数组中的查找------------>剑指offer系列
  9. spark基准测试-BigDataBenchs
  10. No input file specified的解决方法