slave_net_timeout
slave_net_timeout表示slave在slave_net_timeout時間之內沒有收到master的任何數據(包括binlog,heartbeat),slave認為連接斷開,會進行重連。
超時后,立刻重連,后續重連的時間間隔由 CHANGE MASTER TO 命令的MASTER_CONNECT_RETRY 參數指定。
重連次數上限由MASTER_CONNECT_RETRY定義,默認值3600s.
可以通過change master to 設置,也可以通過--master-retry-count 命令行參數指定.
查看和修改
mysql >show variables like 'slave_net_timeout';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| slave_net_timeout | 60 |
+-------------------+-------+
1 row in set (0.00 sec)
將slave_net_timeout修改為6000
mysql >set global slave_net_timeout=6000;
mysql >show variables like 'slave_net_timeout';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| slave_net_timeout | 6000 |
+-------------------+-------+
1 row in set (0.00 sec)
測試
一個master,一個slave,都已經正常啟動。
首先,在slave上做如下操作:
- 設置slave_net_timeout為6000
- 執行stop slave停止復制
- 使用change master to 將heartbeat修改為180s,connect_retry修改為50s
change master to MASTER_CONNECT_RETRY=50,MASTER_HEARTBEAT_PERIOD=180;
- 執行start slave開啟復制
在slave上使用show processlist,確認I/O線程,SQl線程已經啟動成功。
在master上同樣使用show processlist,確認Binlog Dump進程已啟動成功。
接着,在master上做如下操作:
-
清除iptables所有規則,排除干擾
iptables -F
-
設置iptables規則,禁止發送數據到slave
iptables -A OUTPUT -p tcp -d 192.4.222.202 -j DROP
其中,192.4.222.202是slave的IP地址。這條規則的含義表示丟棄所有master發往slave的數據包,確保沒有任何數據(binlog和heartbeat)從master發送給slave。
這樣,slave應該在超過slave_net_timeout的時間后,開始重連master。
但是從slave打印的錯誤日志看,卻是在master開啟iptables后47s,就開始重連,這個值跟slave_net_timeout設置的6000s沒有對應關系。
這是個奇怪的問題。