ストーリー
高橋アーキテクトが問いかけた。
垂直スケーリング(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分