とあるネットワーク(Web)サーバがありまして。
- graceful restart できない
- graceful stop はできる
- 処理中のものは全て処理し終わってから終了する
- 再起動は数秒で完了する
という性質のものを、稼働中に再起動するとダウンタイムがでてしまうのをなんとか誤魔化したかったのです。
最初は nginx から proxy しているところで、繋がらなかったら何秒かおいて何回までリトライ、みたいな設定ができないか探したんですが見つからず、HAProxy を調べたら以下のような設定でできたのでメモ。
frontend absorber
mode tcp
default_backend upstream
bind *:9999
backend upstream
mode tcp
server localhost localhost:8888 weight 1
retries 10
retries 10 で、接続できなかった場合には 1秒間隔(1秒以下のtimeout connect が指定されていればその間隔) で10回までリトライする、という挙動になります。これで10秒以内に再起動できれば救済可能です。
適当に ab でリクエストを流し続けながら再起動してみてもエラーはでなかったので、大丈夫でしょう。
(2018-01-15 18:15 redispatch は関係なく、再試行間隔は timeout connect に依存していたので修正しました)