Amazon EC2 以外から接続するファイアウォールタイムアウトの問題
問題の例
COPY コマンドなどの長いクエリを実行すると、データベースへのクライアント接続がハングまたはタイムアウトしているように見えます。この場合、Amazon Redshift コンソールにはクエリが完了したと表示されますが、クライアントツール自体はまだクエリを実行しているように見えることがあります。接続がいつ停止したかに応じて、クエリの結果がないか、不完全になる可能性があります。
考えられる解決策
この問題は、Amazon EC2 インスタンス以外のマシンから Amazon Redshift に接続するときに発生します。この場合、アイドル状態の接続は、一定期間非アクティブになった後、ファイアウォールなどの中間ネットワークコンポーネントによって終了します。このような動作は、Virtual Private Network (VPN) やローカルネットワークからログインした場合によく発生します。
このようなタイムアウトを回避するために以下の変更を行うことを推奨します。
-
クライアントシステムで TCP/IP タイムアウト値を大きく設定します。この変更は、クラスターへの接続に使用しているコンピューターで行います。クライアントやネットワークに対してタイムアウト期間を調整する必要があります。詳細については、「TCP/IP タイムアウト設定を変更する」を参照してください。
-
必要に応じて、DSN レベルでキープアライブの動作を設定します。詳細については、「DSN のタイムアウト設定を変更する」を参照してください。
TCP/IP タイムアウト設定を変更する
TCP/IP タイムアウト設定を変更するには、クラスターへの接続に使用するオペレーティングシステムに応じて、タイムアウト設定を設定します。
-
Linux — クライアントが Linux で動作している場合は、次のコマンドをルートユーザーとして実行し、現在のセッションのタイムアウト設定を変更します。
/sbin/sysctl -w net.ipv4.tcp_keepalive_time=200 net.ipv4.tcp_keepalive_intvl=200 net.ipv4.tcp_keepalive_probes=5
設定を保持するには、次の値を使ってファイル
/etc/sysctl.conf
を作成または変更し、システムを再起動します。net.ipv4.tcp_keepalive_time=200 net.ipv4.tcp_keepalive_intvl=200 net.ipv4.tcp_keepalive_probes=5
-
Windows — クライアントが Windows で動作している場合、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\ にある次のレジストリ設定の値を編集します。
-
KeepAliveTime: 30000
-
KeepAliveInterval: 1000
-
TcpMaxDataRetransmissions: 10
これらの設定は DWORD のデータの種類を使用します。これらがレジストリパスに存在しない場合、設定を作成し、これらの推奨値を指定できます。Windows レジストリの編集の詳細については、Windows のドキュメントを参照してください。
これらの値を設定したら、コンピューターを再起動して変更を有効にします。
-
-
Mac — クライアントが Mac で動作している場合は、次のコマンドを実行して現在のセッションのタイムアウト設定を変更します。
sudo sysctl net.inet.tcp.keepintvl=200000 sudo sysctl net.inet.tcp.keepidle=200000 sudo sysctl net.inet.tcp.keepinit=200000 sudo sysctl net.inet.tcp.always_keepalive=1
設定を保持するには、次の値を使ってファイル
/etc/sysctl.conf
を作成または変更します。net.inet.tcp.keepidle=200000 net.inet.tcp.keepintvl=200000 net.inet.tcp.keepinit=200000 net.inet.tcp.always_keepalive=1
コンピュータを再起動し、次のコマンドを実行して値が設定されていることを確認します。
sysctl net.inet.tcp.keepidle sysctl net.inet.tcp.keepintvl sysctl net.inet.tcp.keepinit sysctl net.inet.tcp.always_keepalive
DSN のタイムアウト設定を変更する
必要に応じて、DSN レベルでキープアライブの動作を設定できます。これを行うには、odbc.ini ファイルで以下のパラメータを追加または変更します。
- KeepAlivesCount
-
接続が切断されていると見なされる前に失うことが許容される TCP キープアライブパケットの数。
- KeepAlivesIdle
-
ドライバーが TCP キープアライブパケットを送信する前にアイドル状態である秒数。
- KeepAlivesInterval
-
TCP キープアライブを再送信する間隔の秒数。
Windows では、HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\使用する DSN
でキーを追加または変更することによって、レジストリのこれらのパラメータを変更します。Linux および macOS では、直接 odbc.ini ファイルでターゲットの DSN エントリのこれらのパラメータを追加または変更します。Linux および macOS コンピューターで odbc.ini ファイルを編集する方法の詳細については、「Linux および macOS X オペレーティングシステムで ODBC ドライバーマネージャーを使用しドライバーを設定する」を参照してください。
これらのパラメータがない場合、または値が 0 である場合、システムは指定されている TCP/IP キープアライブパラメータを使用して DSN キープアライブの動作を決定します。Windows では、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\
のレジストリに TCP/IP パラメータ があります。Linux および macOS では、TCP/IP のパラメータは sysctl.conf ファイルにあります。