hatora's blog

日常の出来事や仕事のことなど/Java/開発/Web/IT

SQL Databaseに接続ができなくなる

年始の計画再起動メンテナンス後に発生した事象についてまとめる。
とりあえず現状は発生しなくなっているため様子見中。

構成

簡単に言うと下記のようなWebアプリ
Azure VM(Java-WebApp) ⇔ 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 ゲートウェイ」側で一時的に問題が発生したという結論になった。