slave_net_timeout

http://dev.mysql.com/doc/refman/5.6/en/replication-options-slave.html#sysvar_slave_net_timeout

1. 先了解一下mysql中与复制有关的三个参数的含义

slave_net_timeout
The number of seconds to wait for more data from a master/slave connection before aborting the read
MySQL主从复制的时候, 当Master和Slave之间的网络中断,但是Master和Slave无法察觉的情况下(比如防火墙或者路由问题)。Slave会等待slave_net_timeout设置的秒数后,才能认为网络出现故障,然后才会重连并且追赶这段时间主库的数据。
MASTER_CONNECT_RETRY
 specifies how many seconds to wait between connect retries. The default is 60
MASTER_RETRY_COUNT 
added in MySQL 5.6.1, limits the number of reconnection attempts and updates the value of the Master_Retry_Count column in the output of SHOW SLAVE STATUS 
2.模拟master与slave网络故障,测试slave同步是否正常
Master:
1.登陆mysql,查看t表
master_mysql> select * from t;
Empty set (0.00 sec)
2.模拟master的网络故障(在虚拟环境中模拟,生产环境慎用)
master_mysql> system service network stop
3.kill掉master的Binlog Dump线程
master_mysql> select id,command from information_schema.processlist where COMMAND = 'Binlog Dump' or COMMAND = 'Binlog Dump GTID'\G
*************************** 1. row ***************************
     id: 51
command: Binlog Dump
*************************** 2. row ***************************
     id: 52
command: Binlog Dump
2 rows in set (0.00 sec)
mysql>kill 51
mysql>kill 52
4.向表t中插入几条记录
master_mysql>insert into  t(name,sdate) values('M1',now()),('M2',now()),('M3',now()); 
master_mysql> select * from t;
+----+------+---------------------+
| id | name | sdate               |
+----+------+---------------------+
|  1 | m1   | 2015-07-12 22:38:41 |
|  2 | m2   | 2015-07-12 22:38:41 |
+----+------+---------------------+
2 rows in set (0.00 sec)
Slave:

master上的网络都断了,slave还没发现。因为slave无法判断是master没有数据更新还是binlog dump线程意外终止了。

所以show slave status 显示正常。正常情况下当master的binlog dump线程挂掉后,网络还正常时,master会通知slave的。

这里由于master上的网络断了,所以这个binlog dump被kill 掉的消息没有发给slave,slave认为master是正常的。

slave_mysql> show slave status\G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0    
slave_mysql> select * from t;
Empty set (0.00 sec)
master上模拟修复网络
master_mysql> system service network start
slave上查看master上的数据是否能同步到slave
slave_mysql> select * from t;
Empty set (0.00 sec)
master上的数据还是没同步过来,为什么呢?
slave_mysql> pager grep -i -E "Master_Retry_Count|Connect_Retry"
PAGER set to 'grep -i -E "Master_Retry_Count|Connect_Retry"'
slave_mysql> show slave status\G
                Connect_Retry: 10
           Master_Retry_Count: 86400
1 row in set (0.00 sec)
slave_mysql> select @@slave_net_timeout;
+---------------------+
| @@slave_net_timeout |
+---------------------+
|                 600 |
+---------------------+
1 row in set (0.00 sec)

由于slave上的slave_net_timeout是600,所以master大约10分钟后没有给slave推送更新数据时,
slave才会去主动重连master。也就是说在master的网络中断10分钟后,slave才能发现与master的网络出问题了。
这种情况下,怎么让slave与master进行数据同步呢?
1.重启slave
2.等待slave_net_timeout时间过后,slave主动尝试连接master
我们什么都不做,过几分钟后,在看slave与master已经同步了。
slave_mysql> select  *  from t;
+----+------+---------------------+
| id | name | sdate               |
+----+------+---------------------+
|  1 | m1   | 2015-07-12 22:38:41 |
|  2 | m2   | 2015-07-12 22:38:41 |
+----+------+---------------------+
2 rows in set (0.00 sec)
总结:
1.用这三个参数来判断主从是否延迟是不准确的Slave_IO_Running,Slave_SQL_Running,Seconds_Behind_Master.还是用pt-heartbeat吧。
2.slave_net_timeout不要用默认值,设置一个你能接受的延时时间。

猜你喜欢

转载自blog.csdn.net/w892824196/article/details/80593783