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不要用默认值,设置一个你能接受的延时时间。
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不要用默认值,设置一个你能接受的延时时间。
相关文章推荐
- lua 说明self,点号或冒号的关系
- 调用WebService时加入身份验证,以拒绝未授权的访问
- cURL使用教程及实例演示
- HTML5 服务器发送事件(server-sent event)
- sftp上传文件能用到的简单命令
- CentOS安装JAVA JDK
- Faster R-CNN
- 链接与加载
- java特殊符号
- 十道海量数据处理面试题与十个方法大总结
- 括号匹配 c++
- Apache2.4.9 httpd-vhosts.conf文件配置
- 腾讯企业邮箱无法登录
- C#在winform中调用系统控制台输出
- php学习之try catch
- VS2010,VS2012,VS2013中,无法嵌入互操作类型“……”,请改用适用的接口的解决方法
- json <--->List集合,实体类 之间的相互转换
- 每天一个脚本解析day1==》《service xxxxx status》之service脚本解析
- 苹果手机传感器技术
- OC基础之---- NSArray