数据库同步时延指标
mysql主从同步-同步延迟状态考量(seconds_behind_master和pt-heartbea)
一般情况下,我们是通过"show slave status \G;"提供的Seconds_Behind_Master值来衡量mysql主从同步的延迟情况。具体说明见:mysql主从同步(4)-Slave延迟状态监控,这种方法在大多数情况下确实是可行的。但是经验告诉我,仅仅依靠Seconds_Behind_Master的值来监测主从同步数据是否延迟是绝对不可靠的
曾经遇到过的一个坑:Mysql主从环境部署后,刚开始主从数据同步是没问题的,也是通过监控Seconds_Behind_Master的值来判断同步是否延迟。但是运行一段时间后,突然有一天发现,主库上写入新数据后,从库并没有按时同步过来!!于是,立刻在从库上执行"show slave status \G;"发现Seconds_Behind_Master为0 ,并且Slave_IO_Running和Slave_SQL_Running线程状态都是YES,也就是说从库到主库的连接还在,没有断开!但是主库上的变更数据就是长时间无法同步到从库上。如果没有人为干预,直到一个小时以后,从库才会自动重新连接主库,进而才继续同步主库的变更。发生这种情况时,通过一般的正常监控方式是不会发现从库有数据延迟。由此可见,仅仅通过Seconds_Behind_Master=0来
判断同步是否延迟显然是不够滴…
发现这个问题以后,我们人工干预的操作只是需要在从库上执行下面两步重新复制就能解决此问题:
mysql> stop slave;
mysql> start slave;
1
2
重新执行复制后,要尽快修改slave_net_timeout这个参数
之所以要等1小时才能重新同步,是因为slave_net_timeout这个参数默认的就是3600s,它是设置在多少秒没收到主库传来的Binary Logs events之后,从库认为网络超时,Slave IO线程会重新连接主库。
mysql> show variables like 'slave_net_timeout';
餐厅的名字+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| slave_net_timeout | 3600 |
+-------------------+-------+
1 row in set (0.00 sec)
1
2
倩女幽魂射手技能3
4
中国面积最大的省份是哪一个5
6
7
如果在部署mysql主从同步的时候,没有在从库这边设置好slave_net_timeout这个参数,遇到上面的情况,它就会按照默认的3600s(一小时)采取自动重新连接主库,然后才能继续同步主库的变更。这个参数不能设置太大,太大会造成数据库延迟或者主备库直接的链接异常不能及时发现;但是设置太小又会造成主库没有数据更新时频繁重连。至于slave_net_timeout这个参数究竟设置多少,要根据自己的mysql主库数据更新的频繁程度:主库数据更新频繁的,就将这个参数值设小点,更新不频繁就设大点。一般这个参数设置5s、10s、15s、20s、30s等等。
中国移动办卡设置方法:直接登陆从库的mysql在线修改:
mysql> set global slave_net_timeout = 5;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> show variables like 'slave_net_timeout';
+-------------------+-------+
| Variable_name | Value |
怎样开通网上银行+-------------------+-------+
| slave_net_timeout | 5 |
+-------------------+-------+
1 row in set (0.01 sec)
1
2
3
4
5
6
7
8
9
10
或者在从库的myc.nf里添加:
[root@slave-server ~]# cat /usr/local/mysql/myf
....
[mysqld]
.....
slave_net_timeout = 5
[root@slave-server ~]# /etc/init.d/mysql restart
1
2
3
4
5
6
因此,将这个参数设置恰当后,遇到上面问题的时候,从库就会按照设定的时间去主动重新连接主库同步数据,就不需要人工干预。
比喻的成语当然,上述场景是非常特殊的,一般出现的概率比较小,但是作为运维人员,我们非常有必要搞清楚该怎么应对这种情况。这就需要我们要更加深入的吃透MySQL replication重试机制。
接下来基于mysql主从复制原理来分析这一现象MySQL的Replication是区别其他数据库很关键的地方,也是可扩展性和高可用的基础。它本身已经非常智能化,只需要我们调用Change Master指定Binlog 文件名和偏移位置就可以搭建从主库到备库的复制关系。MySQL复制线程会自动将目前复制位置记录下来,在主备复制中断的时候自动连上主库,并从上次中断的位置重新开始复制。这些操作都是全自动化的,不需要人为的干预。这给了我们运维人员带来了很多便利,同时也隐藏了很多细节。要真正的理解前面问题的真相以及怎么解决这个问题,我们还是需要真正的理解MySQL复制的原理。
1)Mysql主从复制的动作是“推”还是“拉”MySQL的复制是“推”的,而不是“拉”的。“拉”是指MySQL的备库不断的循环询问主库是否有数据更新,这种方式资源消耗多,并且效率低。“推”是指MySQL的主库在自己有数据更新的时候推送这个变更给备库,这种方式只有在数据有变更的时候才会发生交互,资源消耗少。显而易见,“推”的方式更加符合程序运行的节能原则。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论