RORO

ふつうの日記(移転したい)

CloudflareによるロードバランシングとZero-Downtime Failover

格安VPSなどでWebサーバのクラスタを組む場合に、Cloudflareのロードバランシング機能が便利に使えることがある。Cloudflare自体がそもそもリバースプロクシなので、そのリバースプロクシから複数のOriginへとリクエストを振り分ければ負荷分散やフェイルオーバーが行えるという仕組みだ。

格安VPSとこれを組み合わせるメリットとしては例えば:

  • 格安VPS事業者がロードバランサを提供していなくても使える
  • 格安VPS事業者のあやしいロードバランサより優れている(かも)
    • ヘルスチェックの結果をちゃんとメールしてくれる
    • 信頼性が高そう、おかしな挙動が少なそう
    • 高速フェイルオーバー(後述)ができる。
  • そこそこ安い:
    • Origin2つまでは $5/mo
    • Originを1つ増やすごとに +$5/mo
  • 2019年末に “Zero-Downtime Failover” という機能が実装された(有料プランのみで使える)。リクエストを送ろうとしたOriginがダウンしていた場合に、別のOriginに1回だけリトライしてくれる。つまりヘルスチェックによる死活監視を待たずに即座にフェイルオーバーが行われる。

短所としては:

  • Cloudflareを経由するのでリクエストのRTTが10~25ms程度増える。これが問題になるかどうかは用途による。
  • HTTP/S以外には使えない
  • WebSocketを使う場合、同時接続数の許容値がよくわからない。

あと、もちろん、グローバルな負荷分散が行えるとかのメリットもあるけど、ここでの文脈では関係ない。

Zero-Downtime Failover

これはウェブのリバースプロクシによくある機能で、例えばnginxのproxy_next_upstreamのようなものだ。Cloudflareでは次のように機能する:

A/AAAAレコードが複数用意されている場合またはCloudflare Load Balancingを使っている場合に、1つ目のOriginに対するリクエストでそのOriginが落ちていたら、2つ目のOriginに対してリトライする。このリトライは1リクエストについて1度だけ行われる。

これによってヘルスチェックを待たずに即座にフェイルオーバーできる。Cloudflareのヘルスチェック間隔は60秒(課金すると15秒まで縮められる)と結構長いので、これ重要。

ちなみに、この機能は2019年末ごろに追加されたようで、CloudflareのFreeプランでは使えず、有料プランのみで使える。

このZero-Downtime Failoverは、特に何も設定しなくても自動で行われるはずなのだけど、自分は以下のワナにはまって上手く動かなくなっていた。

Zero-Downtime Failoverが機能しなくなるワナ

Load BalancerのPoolにOriginサーバを列挙する際に、IPアドレスではなくホスト名でOriginsを指定するとZero-downtime Failoverが機能しなくなる (2020年4月末時点)。