水平スケーリングとは? マシンを増やす
水平スケーリング、すなわちスケールアウトは、一つのインスタンスを大きくするのではなく、サービスのインスタンスを増やすことで、より多くの負荷を処理します。
需要が増えると、一台のマシンにより多くのパワーを与える (スケールアップ) か、より多くのマシンを動かす (スケールアウト) ことができます。水平スケーリングはスケールアウトのアプローチであり、load balancerの背後に同一のインスタンスを追加で立ち上げます。これはクラウドの弾力性の基盤であり、ステートレスで置き換え可能なサービスへとあなたを導きます。
より大きくではなく、より多くのインスタンス
より大きなサーバーにアップグレードする代わりに、同じサービスのコピーを多数動かし、リクエストをそれらに分散します。容量はインスタンスを追加することで増え、需要が下がれば取り除けます。
魅力的な理由
- コモディティなインスタンスの追加によるほぼ線形の容量。
- 弾力性: スパイクにはスケールアップ、コスト削減にはスケールダウン。
- レジリエンス: 一つのインスタンスを失っても残りが提供を続けます。
- 単一マシンの最大サイズによる硬い上限がありません。
ステートレスであることの要件
水平スケーリングは、インスタンスが交換可能なときにのみきれいに機能します。どのリクエストもどのインスタンスに当たりうるため、ユーザーごとの状態はローカルメモリではなく、データベース・cache・session storeなど、インスタンスの外に置かなければなりません。
CI/CDに求めること
同一のインスタンスは、一つの不変なartifactを多数のマシンにデプロイすることを意味します。パイプラインはそのartifactを一度buildして展開し、health checkが各インスタンスをゲートします。再現可能で環境非依存なbuildこそが、多数の同一インスタンスを同じように振る舞わせます。
rollingデプロイが自然に適合
多数のインスタンスがあれば、一度に数台ずつ置き換え、その間ずっとサービスを稼働させ続けられます。パイプラインは各バッチをドレインし、更新し、health checkします。これは新バージョンがまだ動いている旧バージョンと後方互換を保つ場合にのみ機能します。
CI自体をスケールアウトする
同じ考えはbuild容量にも当てはまります。並列runnerが多いほど、一つの大きなrunnerよりも速くjobのバックログを片付けます。マネージドrunnerのフリート (Latchkeyなど) は自動でスケールアウトし、パイプラインjobのバーストがキューに入らず並列で走るようにします。
重要なポイント
- 水平スケーリングは、より大きなインスタンスではなく、同一のインスタンスを増やします。
- きれいに機能するには、ステートレスで交換可能なサービスが必要です。
- デプロイは一つの不変なartifactを、バッチごとに多数のインスタンスへ展開します。