KeepAlivedとMySQLのタイムアウト設定は必ず確認して!!
MySQLをKeepAlivedでロードバランサーを実現というのは結構ある話ですが、それぞれのセッションタイムアウト値が違うため、いざサービスを運用する!!なんて時に思わぬ落とし穴があったります。そのための注意書きです
mysql> show variables like '%timeout%'; +------------------------------+----------+ | Variable_name | Value | +------------------------------+----------+ | interactive_timeout | 28800 | | wait_timeout | 28800 | +------------------------------+----------+ 11 rows in set (0.00 sec)
- 一方の、KeepAlivedの無通信時のタイムアウトは、デフォルトだと以下の通り(900秒で約15分)
# 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に達してしまうので要注意
- 対策 対策というほどではないけど、基本的に、TOMCAT等のアプリケーションサーバでコネクションプーリングを利用している環境の場合、この、IPVSのタイムアウトと、MySQLのコネクションタイムアウトを併せておくことが重要。
以下の例は、IPVSのコネクションタイムアウトをMySQLのデフォルトの8時間に併せる例です
# ipvsadm --set 28800 3840 9600 # ipvsadm -Ln --timeout Timeout (tcp tcpfin udp): 28800 3840 9600