サーバの台数を増やして全体の処理能力を高める方式。
スケールアウトとは、サーバの台数を増やして全体の処理能力を高める方式のことです。1台ずつの性能は変えずに、同じようなサーバを何台も並べて仕事を分担させます。
ただ台数を増やすだけでは仕事は振り分けられないため、前段にロードバランサ(=負荷分散装置)を置きます。届いたリクエスト(=利用者からの処理要求)を、各サーバへ均等に振り分ける役割を担います。
身近な例で考えると、スーパーのレジを増やすのと同じです。1つのレジを速くする(スケールアップ)のではなく、レジ台数を増やして案内係(ロードバランサ)が空いたレジへお客さんを誘導すれば、行列をどんどんさばけるようになります。
スケールアウトは英語で水平拡張(horizontal scaling)とも呼ばれます。サーバを「横に並べて広げていく」イメージから、この呼び名が付いています。
水平拡張の大きな利点は次の2つです。
・拡張性が高い:台数を足せば理論上ほぼ無限に処理能力を伸ばせる
・可用性が高い:1台が故障しても、残りのサーバで処理を継続できる
可用性(かようせい)とは「サービスが止まらず使い続けられる度合い」のことです。複数台に分けておけば、1台がダウンしてもサービス全体は動き続けられるため、安定したサービス運営につながります。
スケールアップ(1台を強化=垂直拡張)とスケールアウト(台数を増やす=水平拡張)は、対になる拡張方式です。違いを表で整理します。
| 観点 | スケールアップ | スケールアウト |
|---|---|---|
| やり方 | 1台を強化 | 台数を増やす |
| 方向 | 垂直拡張(縦) | 水平拡張(横) |
| 導入の手間 | 簡単(アプリ変更不要) | アプリ側の対応が必要 |
| 拡張の上限 | 物理的な上限あり | 拡張性が高い |
| 故障への強さ | 単一障害点になりやすい | 可用性が高い |
どちらが優れているという話ではなく、状況に応じて使い分けるのがポイントです。手早く性能を上げたいときはスケールアップ、止まらず大きく伸ばしたいときはスケールアウト、と覚えておくと整理しやすくなります。実際の現場では両方を組み合わせて使うこともよくあります。
スケールアウトで台数を増やすためには、各サーバが「ステートレス(状態を持たない)」であることが大切です。ステートレスとは、リクエスト(要求)を処理する際に、以前の処理結果を自分の中に覚えていない状態のことです。
なぜステートレスが必要なのか。例えばショッピングサイトで「カートに商品を入れた」という情報を、サーバ1号機だけが覚えていたとします。次のリクエストがサーバ2号機に振り分けられると、「カートの中身を知らない」2号機は正しく応答できません。そこで、状態(カートの中身・ログイン情報など)はデータベースやセッション管理の仕組みに外出しして、どのサーバからでも参照できるようにします。
身近な例では、コンビニのバイトが増えても困らない仕組みと同じです。注文の記録はレジシステム(共有DB)に入っているので、どのバイト(サーバ)が対応しても同じ情報が見えます。「あのバイトじゃないと分からない」状態をなくすことが、スケールアウトの前提です。
ロードバランサ(LB=Load Balancer、負荷分散装置)は、届いたリクエストをどのサーバへ送るかを判断する装置です。代表的な振り分け方法は次のとおりです。
・ラウンドロビン:サーバを順番に1台ずつ使い回す。最もシンプルで、負荷が均等になりやすい
・最少接続数:現在の接続数が一番少ないサーバへ振り分ける。処理の重さが違う場合に有効
・IPハッシュ:利用者のIPアドレスをもとに担当サーバを固定する。同じ利用者が毎回同じサーバにつながる
ロードバランサは「交通整理役」です。信号のない交差点に交通整理員を1人置くと、車(リクエスト)がスムーズに各道路(サーバ)へ流れるイメージです。ロードバランサがあるおかげで、利用者はどのサーバに接続しているかを意識せずにサービスを使えます。なお、ロードバランサ自体が1台だけだと、そこが壊れたときにサービス全体が止まる弱点があるため、実際にはロードバランサも複数台で冗長化(二重化)することが多いです。
Q1. スケールアウトの説明として最も適切なものはどれか。
Q2. スケールアウト(水平拡張)の特徴として正しいものはどれか。
Q3. スケールアウトで複数のサーバへ処理を振り分けるために、前段に置く装置はどれか。