Database JUNKY

MySQL,MariaDBを中心としたブログです

KeepAlivedとMySQLのタイムアウト設定は必ず確認して!!

MySQLKeepAlivedロードバランサーを実現というのは結構ある話ですが、それぞれのセッションタイムアウト値が違うため、いざサービスを運用する!!なんて時に思わぬ落とし穴があったります。そのための注意書きです

f:id:hit10231023:20180309104332j:plain

  • 無通信時のコネクションプーリングのタイムアウト時間のデフォルトは、interactive_timeoutで確認できます。ちなみに、MySQL 28800秒なので8時間です。
mysql>
show variables like '%timeout%';
+------------------------------+----------+
| Variable_name | Value |
+------------------------------+----------+
| interactive_timeout | 28800 |
| wait_timeout | 28800 |
+------------------------------+----------+
11 rows in set (0.00 sec)
# ipvsadm -Ln --timeout
Timeout (tcp tcpfin udp): 900 120 300
  • どういうことがおきるか? まず、LVS側のACTIVE CONNECTIONを確認してみる
# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.0.50:3306 rr
-> 192.168.0.21:3306 Route 10 9 2

次に、MySQL側のプロセスリストを確認してみる

# mysql -ppasszwww -e "show full processlist;"
+-----+---------+---------------------+--------+---------+------+-------+-----------------------+
| Id | User | Host | db | Command | Time | State | Info |
+-----+---------+---------------------+--------+---------+------+-------+-----------------------+
| 62 | devuser | 192.168.99.88:33736 | db01 | Sleep | 2832 | | NULL |
| 72 | devuser | 192.168.99.88:57133 | db01 | Sleep | 2733 | | NULL |
| 73 | devuser | 192.168.99.88:57134 | db01 | Sleep | 2733 | | NULL |
| 74 | devuser | 192.168.99.88:57135 | db01 | Sleep | 2733 | | NULL |
| 75 | devuser | 192.168.99.88:57136 | db01 | Sleep | 2733 | | NULL |
| 76 | devuser | 192.168.99.88:57137 | db01 | Sleep | 2733 | | NULL |
| 77 | devuser | 192.168.99.88:57138 | db01 | Sleep | 2733 | | NULL |
| 78 | devuser | 192.168.99.88:57139 | db01 | Sleep | 2733 | | NULL |
| 79 | devuser | 192.168.99.88:57140 | db01 | Sleep | 2733 | | NULL |
| 80 | devuser | 192.168.99.88:57141 | db01 | Sleep | 2733 | | NULL |
| 181 | devuser | 192.168.99.88:58537 | db01 | Sleep | 723 | | NULL |
| 182 | devuser | 192.168.99.88:58538 | db01 | Sleep | 723 | | NULL |
| 183 | devuser | 192.168.99.88:58539 | db01 | Sleep | 723 | | NULL |
| 184 | devuser | 192.168.99.88:58540 | db01 | Sleep | 723 | | NULL |
| 185 | devuser | 192.168.99.88:58541 | db01 | Sleep | 723 | | NULL |
| 186 | devuser | 192.168.99.88:58542 | db01 | Sleep | 723 | | NULL |
| 187 | devuser | 192.168.99.88:58543 | db01 | Sleep | 723 | | NULL |
| 188 | devuser | 192.168.99.88:58544 | db01 | Sleep | 723 | | NULL |
| 189 | devuser | 192.168.99.88:58545 | db01 | Sleep | 723 | | NULL |
+-----+---------+---------------------+--------+---------+------+-------+-----------------------+

LVS側のコネクションキープが、15分でタイムアウトするのに対して、MySQL側が8時間でタイムアウトする。つまり上記MySQL PROCESSLISTのTIMEが2733秒となっているプロセス(IDが、62~80)は、どこにも利用されないコネクションということになる、尚、利用されないコネクションは、8時間経過しないと消えない・・・MySQLのコネクションプーリングのタイムアウトが8時間経過する前に、IPVSが、15分でコネクションプーリングをタイムアウトさせてしまうのが今回の現象だ。(T_T) 泣ける。

この設定のままだと、MySQL側は即効でMAX CONNECTIONに達してしまうので要注意

以下の例は、IPVSのコネクションタイムアウトMySQLのデフォルトの8時間に併せる例です

# ipvsadm --set 28800 3840 9600
# ipvsadm -Ln --timeout
Timeout (tcp tcpfin udp): 28800 3840 9600