1. 程式人生 > >mysql 主從複製引數slave_net_timeout

mysql 主從複製引數slave_net_timeout

slave_net_timeout

slave_net_timeout表示slave在slave_net_timeout時間之內沒有收到master的任何資料(包括binlog,heartbeat),slave認為連線斷開,會進行重連。

超時後,立刻重連,後續重連的時間間隔由 CHANGE MASTER TO 命令的MASTER_CONNECT_RETRY 引數指定。

重連次數上限由--master-retry-count 命令列引數指定. 預設值3600s.

檢視和修改

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上做如下操作:

  1. 設定slave_net_timeout為6000
  2. 執行stop slave停止複製
  3. 使用change master to 將heartbeat修改為180s,connect_retry修改為50s
    sql change master to MASTER_CONNECT_RETRY=50,MASTER_HEARTBEAT_PERIOD=180;
  4. 執行start slave開啟複製

在slave上使用show processlist,確認I/O執行緒,SQl執行緒已經啟動成功。
在master上同樣使用show processlist,確認Binlog Dump程序已啟動成功。

接著,在master上做如下操作:

  1. 清除iptables所有規則,排除干擾

     iptables -F 
  2. 設定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沒有對應關係。

這是個奇怪的問題。

參考

16.1.6.3 Replication Slave Options and Variables