[Redshift] psqlのタイムアウトを回避する

2016.06.27

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、DI部の川崎です。

RedshiftのクライアントとしてMac上のpsqlを使用していますが、処理に長時間かかるクエリの場合、タイムアウトが発生してしまい、クエリの結果がきちんと取得できない、という問題が発生していました。

社内で質問をしたところ、下記のページのkeepaliveの設定を教えてもらいましたので、試してみます。(本エントリではMacの場合を試しています)

Amazon EC2 以外から接続する — ファイアウォールタイムアウトの問題
 http://docs.aws.amazon.com/ja_jp/redshift/latest/mgmt/connecting-firewall-guidance.html
sudo sysctl net.inet.tcp.keepintvl=20000
sudo sysctl net.inet.tcp.keepidle=20000
sudo sysctl net.inet.tcp.keepinit=20000
sudo sysctl net.inet.tcp.always_keepalive=1

長時間かかるクエリの代わりに、前回のエントリでご紹介したSleepを使用します。タイムアウトは60分で起きているようですので、余裕をみて3700秒スリープすることにします。

【小ネタ】RedshiftでSleepする方法
 https://dev.classmethod.jp/server-side/db/redshift-sleep-01/

設定前

demo=# select f_sleep(3700);



-- 1時間(正確には3700秒)以上待っても、結果は返ってきません。
-- セッションは失われてしまいました。

 

設定後

demo=# \timing
Timing is on.
-- 前回同様タイミングコマンドで、処理時間を表示するようにします。
demo=# select f_sleep(3700);

 f_sleep 
------------
 t
(1 row)

Time: 3700226.472 ms

keepaliveの設定が有効になり、無事に結果が返ってきました!

設定を保持するには

先ほどのページに掲載されている、設定を保存する方法をご紹介しておきます。

設定を保持するには、次の値を使ってファイル /etc/sysctl.conf を作成または変更します。

net.inet.tcp.keepidle=20000
net.inet.tcp.keepintvl=20000
net.inet.tcp.keepinit=20000
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

最後に

社内では、この方法を試してもうまくいかず、別の設定をしたという声も聞かれました。もし別の方法、追加で必要な設定をご存知の方がいらっしゃいましたら、コメント欄からお知らせください。