SQL Databaseに接続ができなくなる
年始の計画再起動メンテナンス後に発生した事象についてまとめる。
とりあえず現状は発生しなくなっているため様子見中。
エラー内容
急に下記のエラーが発生するようになった
com.microsoft.sqlserver.jdbc.SQLServerException: The TCP/IP connection to the host XXXX, port 1433 has failed. Error: "connect timed out. Verify the connection properties. Make sure that an instance of SQL Server is running on the host and accepting TCP/IP connections at the port. Make sure that TCP connections to the port are not blocked by a firewall.".
調査内容
プロセス再起動で直るかとおもってnetstatの状態を見てみた。
コネクションプールの接続がなぜか即座にTIME_WAITになる。
$netstat -anto | grep "1433" tcp6 0 0 AzureVMのIP::35406 191.238.68.11:1433 TIME_WAIT timewait (58.00/0/0) tcp6 0 0 AzureVMのIP::35394 191.238.68.11:1433 TIME_WAIT timewait (57.86/0/0) tcp6 0 0 AzureVMのIP::35386 191.238.68.11:1433 TIME_WAIT timewait (57.57/0/0) tcp6 0 0 AzureVMのIP::35384 191.238.68.11:1433 TIME_WAIT timewait (58.21/0/0) tcp6 0 0 AzureVMのIP::35390 191.238.68.11:1433 TIME_WAIT timewait (57.75/0/0)
しかもDB接続はプールしているはずなのにnetstatコマンド上表示がない
$netstat -anto | grep "1433"
調査結果
いろいろ探していたらたどり着いた
Azure SQL Database 接続アーキテクチャ
DB接続文字列として記載して値は「Azure SQL Database ゲートウェイ」を指していた
※ 191.238.68.11は西日本のプライマリIP
一度接続が成功すると実際のデータベースをホストしているデータベースクラスターの内部ポート番号 (Internal Port Number) を返し、そちらに直接リダイレクトしている
よって1433をgrepしても引っかからなかったというわけ
$netstat -an | grep "ESTABLISHED" | sort -k5,5
ESTABLISHEDでgrepしたらそれらしいIPにちゃんと接続されていた
ということなので、「Azure SQL Database ゲートウェイ」側で一時的に問題が発生したという結論になった。