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月末時点)。