Chinaunix首页 | 论坛 | 博客
  • 博客访问: 30209
  • 博文数量: 12
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 177
  • 用 户 组: 普通用户
  • 注册时间: 2014-12-09 10:25
个人简介

我叫陆哥,一位热爱学习,热爱分享营销案例、裂变营销、商业模式的斜杠青年。

文章分类

全部博文(12)

文章存档

2019年(1)

2014年(11)

我的朋友

分类: Mysql/postgreSQL

2014-12-09 10:47:43

在生产环境中,主从复制常常会有复制延迟的现象,主要是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脚本,如下:

  1. #!/bin/bash
  2. # 判断主从复制是否延迟
  3. # http://www.cnblogs.com/xuanzhi201111/

  4. # slave
  5. s_psswd=123456
  6. s_user=root
  7. s_port=3306
  8. s_host=localhost

  9. # master
  10. m_psswd=123456
  11. m_user=root
  12. m_port=3306
  13. m_host=192.168.0.102


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

  15. while true
  16. do
  17.     sleep 1
  18.     echo -e "\e[1;33m###################################\e[0m"
  19.     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}')
  20.     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}')
  21.     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}')
  22.     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')
  23.     Master_Log_File_Num=`echo $Master_Log_File | awk -F '.' '{print $2}' | sed 's/^0\+//'`
  24.     Master_File=$(mysql -u$m_user -p$m_psswd -h$m_host -P$m_port -Nse "show master status" | awk '{print $1}')
  25.     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')
  26.     Master_File_Num=`echo $Master_File | awk -F '.' '{print $2}' | sed 's/^0\+//'`

  27.     if [ -z $Master_Log_File ] && [ -z $Relay_Master_Log_File ] && [ -z $Read_Master_Log_Pos ] && [ -z $Exec_Master_Log_Pos ]
  28.     then
  29.         echo -e "\e[1;31mSLAVE 没有取到值,请检查参数设置!\e[0m"
  30.         exit 1
  31.     fi

  32.     if [ $Master_Log_File = $Relay_Master_Log_File ] && [ $Read_Master_Log_Pos = $Exec_Master_Log_Pos ]
  33.     then
  34.         if [ $Master_Log_File = $Master_File ] && [ $Exec_Master_Log_Pos = $Master_Pos ]
  35.         then
  36.             echo -e "\e[1;32mMaster-slave 复制无延迟 ^_^\e[0m"
  37.         else
  38.             if [ $Master_Log_File_Num -gt $Master_File_Num ] || [ $Master_Pos -gt $Exec_Master_Log_Pos ]
  39.             then
  40.                 log_count=$(expr $Master_Log_File_Num - $Master_File_Num)
  41.                 pos_count=$(expr $Master_Pos - $Exec_Master_Log_Pos)
  42.                 echo -e "\e[1;31mMaster-slave 复制延迟 !!!\e[0m"
  43.                 echo -e "\e[1;31mMaster:$m_host Slave:$slave_wan_ip\e[0m"
  44.                 echo -e "\e[1;31mMaster当前binlog: $Master_File"
  45.                 echo -e "\e[1;31mSlave当前binlog: $Master_Log_File"
  46.                 echo -e "\e[1;31mbinlog相差文件数: $log_count\e[0m"
  47.                 echo -e "\e[1;31mPos点相差: $pos_count\e[0m"
  48.             fi
  49.         fi
  50.     fi
  51. done


阅读(476) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:grep的用法

给主人留下些什么吧!~~