您的位置:首页 > 其它

slave_net_timeout

2015-07-13 16:45 260 查看
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不要用默认值,设置一个你能接受的延时时间。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: