内容为自己的一点总结,如有不对欢迎狠劲儿拍砖
本文来自转载请经博主同意
监控主从复制正常与否
相比各位都应该知道,监控主从是否工作正常,涉及命令如下:
show slave status\g;那么,我们需要关注的参数如下:
1. 首先查看sql和io线程是否为yes状态(想必各位都明白了)
2. 是否有延迟 是否大于0 #一般生成环境延迟是否大于500秒,如果大于500则报警,如大于1000则严重报警
#比如传递一个sql到slave上,,binlog中在eventhear中存在time stamp时间戳,在下条binlog拿到的时间会进行比较,如果当前时间是多少则显示多少,如果更新非常频繁500秒会产生更多的sql积累在其中
至少生产中监控就是这么实现的以及包括nagios的监控插件也是这么实现的
主要关注的值本文来自转载请经博主同意,
1.master_log_file read_master_log_pos 2.relay_master_log_fileexec_master_log_pos 3.seconds_behind_master判断一个库主要观察以上几点,如果主库挂了,seconds_behind_master 会已经成为null了
那么这样如何去观测从库是否日志同步完成,如下所示
通过shell实现监控同步的方法
废话不多说了直接上菜
1.利用status去观测是否已经同步完成
判断公式
以下为判断依据,判断以下值
master_log_file 和 relay_master_log_file 的值必须相等
判断同步的偏移量
read_master_log_pos 和 exec_master_log_pos 的值必须相等
根据以上为最基础的判断依据,是否可将其从库提升为主库,就会在从库中判断master log file 是否读到的位置一样并找到一个最靠前的一个节点提升为主
shell内容如下所示:本文来自转载请经博主同意
#!/bin/bashuser='root'password='mypass'thread_status=`/usr/local/mysql/bin/mysql -u$user -p$password -s /tmp/mysql_3308.sock -e 'show slave status\g'|grep -i yes|wc -l`status=(`/usr/local/mysql/bin/mysql -u$user -p$password -s /tmp/mysql_3308.sock -e 'show slave status\g'| egrep -i master_log_file|relay_master_log_file|read_master_log_pos|exec_master_log_pos|seconds_behind_master |awk -f':' '{print $2}'`)echo ${status[4]}if [[ $thread_status != 2 ]]; then echo the replication is fault , at $(date) > $catalog echo `uname -n` | mail umail@qq.com '300' ]];then echo yan chi guo gao, at $(date) > $catalog echo `uname -n` | mail umail@qq.com $catalog echo `uname -n` | mail umail@qq.com 如果时间一样则认为正常,如果master上的时间减去slave上的时间 出现了延迟,那么证明延迟存在的,但是这种方法存在缺陷,比如主库挂了那么则不可用#!/bin/bashuser='root'password='mypass'/usr/local/mysql/bin/mysql -u$user -p$password -e 'replace into master.repl_heart set t=now(),id=1;' >/dev/null 2>&1master_select=`/usr/local/mysql/bin/mysql -u$user -p$password -s /tmp/mysql.sock -e 'select t from master.repl_heart where id=1;' | awk '{print $2}' | tail -1`slave_select=`/usr/local/mysql/bin/mysql -u$user -p$password -s /tmp/mysql_3308.sock -e 'select t from master.repl_heart where id=1;' | awk '{print $2}' | tail -1`master_date=`date -d $master_select +%s`slave_date=`date -d $slave_select +%s`delay=`echo $master_date-$slave_date | bc`if [[ $master_date == $slave_date ]];then echo 'is ok' elif [[ $delay -le 500 ]];then echo cun zai yan chi $delay else echo the replication delay too large $delay , at $(date) > $catalog echo `uname -n` | mail umail@qq.com 需要注意的是:复制中,如果是行格式,就是主库的时间;如果不是行式,这个方法可以把now()这个内置函数在s脚本中生成再写入
以上,为监控mysql主从的两种shell的写法,如有不足,麻烦指出,感谢各位
本文出自 “心情依旧” 博客,转载请与作者联系!
