ホーム第10章: 分散システムとクラウドの設計
第10章 1節

スケールアウトとロードバランシング

どれほど高性能なコンピュータであっても、1台のハードウェアが処理できるアクセス数やデータ容量には物理的な限界が存在します。世界中の莫大なユーザーが利用するWebサービスを支えるために、複数のコンピュータを組み合わせてシステムを拡張する「水平スケーリング」の設計思想について解説します。

1. 単一マシンの限界とスケーリング戦略

システムの処理能力が不足した際、その性能を拡張するアプローチには「スケールアップ」と「スケールアウト」の2つがあります。

  • スケールアップ(垂直スケーリング: Vertical Scaling):
    稼働しているサーバーのCPUをより高性能なものに換装したり、メモリやストレージを追加して、単一マシンの限界性能を引き上げる手法です。
    特徴: ソフトウェア側の設計変更がほとんど不要であるため導入が非常に簡単ですが、ハードウェアの物理的上限に達するとそれ以上の拡張が不可能になります。また、高性能化に伴い価格が指数関数的に高騰します。
  • スケールアウト(水平スケーリング: Horizontal Scaling):
    安価な一般的なサーバーを複数台並べ、処理を並列に分散してシステム全体の処理能力を高める手法です。
    特徴: 理論上は台数を増やすことで無限に処理能力をスケールできますが、データを複数のマシン間でどのように共有・同期するかという複雑なソフトウェア設計が必要になります。

2. 負荷分散の要:ロードバランシング

スケールアウトしたシステムにおいて、外部からの大量のアクセス(リクエスト)を、背面にある複数のサーバーノードへ適切に振り分ける装置をロードバランサ(Load Balancer: 負荷分散装置)と呼びます。

ロードバランサは以下のアルゴリズムを用いてリクエストを転送します。

  • ラウンドロビン(Round Robin): リクエストを登録されたサーバーへ順番に均等に割り当てる最も単純な方式。
  • 最小接続数(Least Connections): 現在処理中の接続(アクティブコネクション)数が最も少ない、手の空いているサーバーへ優先的に割り当てる方式。
  • IPハッシュ(IP Hash): クライアントの送信元IPアドレスからハッシュ値を計算し、常に同じクライアントからのアクセスは特定の同一サーバーへ転送する方式。

ヘルスチェックとフェイルオーバー

ロードバランサの重要な役割の一つが、サーバーの死活監視(ヘルスチェック)です。 定期的にサーバーに対して応答確認用のシグナルを送信し、無応答やエラーを返したサーバーをプールから自動的に除外します。これにより、一部のサーバーが物理的に故障した場合でも、ユーザーにはエラーを見せずに他の健全なサーバーだけでサービスを維持するフェイルオーバー(Failover)を可能にします。

3. 疎結合のためのステートレス(Stateless)設計

ロードバランサによってアクセスがどのサーバーに振り分けられるか予測できない状況下では、各サーバーのローカルメモリ上に「ログイン状態(セッション情報)」などの状態データを保持してしまうと重大な問題が生じます。 前回のアクセスでサーバーAに保存されたセッションが、今回のアクセスでサーバーBに振り分けられた瞬間、ユーザーは「突然ログアウトした状態」になってしまいます。

この問題を解決するために、モダンな分散システムではステートレス設計が採用されます。 アプリケーションサーバー自体には状態(State)を一切保持せず、状態情報はデータベースやインメモリキャッシュ(Redisなど)、または暗号化されたクライアント側トークン(JWTなど)に外出しします。サーバーは「リクエストと外出しデータを毎回受け取って処理するだけ」の単純な存在に徹することで、どのサーバーがいつ壊れてもよく、また何台でも自由に即座に追加・削除できる高い拡張性を実現しています。

しかし、ステートレス設計を進めて状態の保存先をデータベースに集約すると、今度は「データベースのスケールアウト」というさらに難解な課題に直面します。次節では、データを複数ノードに分散保持する際に避けられないトレードオフの基本定理について学びます。