LESSON 40分

ストーリー

高橋アーキテクト
負荷テストで限界が見えた。3000 RPSでシステムが飽和する。次のセールでは5000 RPSが見込まれている。どうする?

高橋アーキテクトが問いかけた。

高橋アーキテクト
サーバーのスペックを上げればいいのでは?
高橋アーキテクト
それは垂直スケーリングだ。もう一つの方法がある。サーバーの台数を増やす水平スケーリングだ。どちらを選ぶかで、システムの将来が大きく変わる

垂直スケーリング(Scale Up)

既存のサーバーのスペックを上げる方法です。CPUコア数、メモリ容量、ディスク速度を増強します。

// 垂直スケーリングのイメージ
const verticalScaling = {
  before: { cpu: '4 cores', memory: '16GB', disk: 'SSD 500GB' },
  after:  { cpu: '16 cores', memory: '64GB', disk: 'NVMe 2TB' },
  cost: '月額 $100 → $800',
};
メリットデメリット
実装が簡単(設定変更のみ)物理的な上限がある
アプリケーション変更不要コストが指数的に増加
データの一貫性が保ちやすい単一障害点(SPOF)が残る
運用が簡単ダウンタイムが必要な場合がある

適したケース

  • データベースサーバー(スケールアウトが困難)
  • 初期フェーズの小規模サービス
  • レガシーシステムの延命

水平スケーリング(Scale Out)

サーバーの台数を増やして負荷を分散する方法です。

// 水平スケーリングのイメージ
const horizontalScaling = {
  before: { servers: 1, specPerServer: '4 cores, 16GB' },
  after:  { servers: 4, specPerServer: '4 cores, 16GB' },
  totalCapacity: '4倍',
  cost: '月額 $100 → $400(線形増加)',
};
             ┌──────────┐
             │   Load   │
             │ Balancer │
             └────┬─────┘
           ┌──────┼──────┐
           ▼      ▼      ▼
       ┌──────┐┌──────┐┌──────┐
       │App 1 ││App 2 ││App 3 │
       └──────┘└──────┘└──────┘
           │      │      │
           └──────┼──────┘

            ┌──────────┐
            │ Database │
            └──────────┘
メリットデメリット
理論上無限にスケール可能アプリケーションの設計変更が必要
コストが線形に増加分散システムの複雑さ
冗長性が自然に確保されるデータの整合性管理が難しい
ローリングデプロイが可能ネットワーク遅延が追加される

適したケース

  • Webアプリケーションサーバー
  • APIサーバー
  • マイクロサービスアーキテクチャ
  • 高可用性が求められるサービス

ロードバランサー

水平スケーリングの要。複数のサーバーに対してリクエストを分散します。

// ロードバランシングアルゴリズム
enum LoadBalancingAlgorithm {
  ROUND_ROBIN = 'round-robin',           // 順番に振り分け
  LEAST_CONNECTIONS = 'least-connections', // 接続数が少ないサーバーへ
  IP_HASH = 'ip-hash',                   // IPアドレスで固定
  WEIGHTED_ROUND_ROBIN = 'weighted',     // 重み付きラウンドロビン
}

// 各アルゴリズムの特性
const algorithms = {
  roundRobin: {
    pros: '均等分散、シンプル',
    cons: 'サーバー性能差を考慮しない',
    useCase: '同一スペックのサーバー群',
  },
  leastConnections: {
    pros: '実際の負荷に基づく分散',
    cons: '接続数の追跡が必要',
    useCase: '処理時間にばらつきがあるAPI',
  },
  ipHash: {
    pros: '同一ユーザーが同一サーバーへ',
    cons: '負荷が偏る可能性',
    useCase: 'セッション固定が必要な場合',
  },
};

オートスケーリング

負荷に応じて自動的にサーバー台数を増減します。

// オートスケーリング設定の例
interface AutoScalingConfig {
  minInstances: number;     // 最小台数: 2
  maxInstances: number;     // 最大台数: 20
  desiredInstances: number; // 目標台数: 4

  scalingPolicies: {
    scaleOut: {
      metric: string;       // 'CPUUtilization'
      threshold: number;    // 70%
      cooldown: number;     // 300秒(5分)
      adjustment: number;   // +2台
    };
    scaleIn: {
      metric: string;       // 'CPUUtilization'
      threshold: number;    // 30%
      cooldown: number;     // 600秒(10分)
      adjustment: number;   // -1台
    };
  };
}

const config: AutoScalingConfig = {
  minInstances: 2,
  maxInstances: 20,
  desiredInstances: 4,
  scalingPolicies: {
    scaleOut: {
      metric: 'CPUUtilization',
      threshold: 70,
      cooldown: 300,
      adjustment: 2,
    },
    scaleIn: {
      metric: 'CPUUtilization',
      threshold: 30,
      cooldown: 600,
      adjustment: -1,
    },
  },
};

スケーリングの注意点

注意点説明
ウォームアップ時間新しいインスタンスが準備完了するまでの時間を考慮
クールダウン期間頻繁なスケーリングの往復を防ぐ
事前スケーリングイベント前に手動でスケールアウトしておく
コスト上限最大台数でコストが許容範囲内か確認

使い分けの判断フロー

スケーリングが必要

  ├─ アプリケーションはステートレスか?
  │   ├─ Yes → 水平スケーリングが第一候補
  │   └─ No  → ステートレス化を検討、または垂直スケーリング

  ├─ ダウンタイムは許容できるか?
  │   ├─ Yes → 垂直スケーリングも選択肢
  │   └─ No  → 水平スケーリング(ローリングデプロイ)

  └─ 将来のトラフィック増加は予測可能か?
      ├─ 急激な増加 → 水平スケーリング + オートスケーリング
      └─ 緩やかな増加 → 垂直スケーリングで当面対応可能

まとめ

ポイント内容
垂直スケーリングスペック増強。簡単だが上限がある
水平スケーリング台数増加。無限にスケール可能だが複雑
ロードバランサーリクエストを複数サーバーに分散
オートスケーリング負荷に応じて自動的に台数を調整
判断基準ステートレス性、ダウンタイム許容度、将来の成長予測

チェックリスト

  • 垂直/水平スケーリングのメリット・デメリットを説明できる
  • ロードバランシングアルゴリズムの種類を理解した
  • オートスケーリングの設定ポイントを把握した
  • ユースケースに応じたスケーリング戦略を選択できる

次のステップへ

次は「ステートレス設計」を学びます。水平スケーリングの前提条件であるステートレスなアプリケーション設計を理解しましょう。


推定読了時間: 40分