システムデザイン レッスン2

ロードバランシング

複数サーバーへリクエストを分散するロードバランサーの役割と代表的な分散アルゴリズムを学ぶ

ロードバランサーの役割

ロードバランサーは、クライアントからのリクエストを受け取り、 背後にある複数のサーバー(バックエンド)に振り分ける役割を持つコンポーネントです。 これにより特定のサーバーへの負荷集中を避け、1台が停止しても全体としてはサービスを継続できるようになります。

Client --> Load Balancer --+--> Server A
                            +--> Server B
                            +--> Server C

  ロードバランサーがどのサーバーに送るかをリクエストごとに決定する

代表的な分散アルゴリズム

ラウンドロビン(Round Robin)

登録されたサーバーへ順番に均等に割り振る。実装がシンプルで、サーバーの性能が均一な場合に有効

最少接続(Least Connections)

その時点で処理中の接続数が最も少ないサーバーに振り分ける。リクエストごとの処理時間にばらつきがある場合に有効

重み付け(Weighted)

サーバーごとに性能に応じた重みを設定し、性能の高いサーバーへ多くのリクエストを振り分ける

IPハッシュ(IP Hash)

クライアントのIPアドレスに基づいて振り分け先を決定し、同じクライアントは基本的に同じサーバーに送られる

L4とL7ロードバランシングの違い

ロードバランサーがどのネットワーク層の情報を見て振り分けるかによって、L4とL7に分類されます。

L4 Load Balancer (Transport Layer)
  見る情報: 送信元/宛先IP, ポート番号
  特徴: 中身を解析しないため高速。TCP/UDP全般に使える

L7 Load Balancer (Application Layer)
  見る情報: HTTPヘッダー, URLパス, Cookieなど
  特徴: "/api/*" は Aサーバー群へ、"/static/*" は Bサーバー群へ、
        のようにリクエスト内容に応じた柔軟な振り分けができる

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

ロードバランサーは定期的に各バックエンドへ疎通確認(ヘルスチェック)を行い、応答が異常な サーバーを一時的に振り分け対象から外します。これにより、障害の起きたサーバーにリクエストが 送られ続けてユーザーがエラーを受け取り続ける事態を防ぎます(フェイルオーバー)。

// 擬似コード: ヘルスチェックの動き
every 10 seconds:
    for server in backendServers:
        response = ping(server + "/health")
        if response.status != 200:
            markUnhealthy(server)   // 振り分け対象から除外
        else:
            markHealthy(server)     // 振り分け対象に復帰

ポイント

  • ロードバランサーは負荷分散と単一障害点の回避のために複数サーバーへリクエストを振り分ける
  • ラウンドロビン・最少接続・重み付け・IPハッシュなど、状況に応じたアルゴリズムを選ぶ
  • ヘルスチェックにより異常なサーバーを検知し、フェイルオーバーでユーザーへの影響を抑える

確認クイズ

1 / 3

ラウンドロビン方式の分散アルゴリズムの特徴として正しいものはどれか?