# Node.jsアプリのスケーリングとオートスケーリング

Source: https://support.kapsulehost.com/ja-jp/site-scaling-and-autoscale

オートスケーリングは、CPU負荷の変化に応じてNode.jsアプリを実行するインスタンス数を増減させます。これにより、繁忙期にはより多くの処理能力を確保し、閑散期にはコストを抑えることができます。本ガイドでは、KPanelのタブ、各設定項目、課金対象となるもの、そしてアプリをスケーリングに対して安全にする方法について説明します。

## KPanelでのスケーリング機能の場所

1. [KPanel](https://kpanel.kapsulehost.com)にサインインします。
2. 左サイドバーの**ウェブサイト**をクリックし、対象のサイトをクリックします。
3. サイトの左メニューで**パフォーマンス**を開き、**スケーリング**を開きます。

直接アクセスするアドレスは`/websites/<site-id>/autoscale`です。以前の`/websites/<site-id>/scaling`のアドレスも引き続き機能し、同じ画面に移動します。

![KPanelにおけるNode.jsアプリのオートスケーリング設定](https://support.kapsulehost.com/help/screenshots/site-scaling-and-autoscale.a7af79de.webp)

> **Note:** このタブはNode.jsサイトにのみ表示されます。WordPress、WooCommerce、静的サイト、PHP、Python、Rubyのサイトではメニューに表示されません。これは、この仕組みがNode.jsのプロセスクラスターをスケーリングするものだからです。

## 1つのタブ、1つの設定

以前のKPanelには、**スケーリング**と**オートスケール**という2つのタブがあり、1組の設定を扱っていました。これらは同じ設定を2通りに表示していただけで、混乱を招くだけでした。そのため現在は、ライブステータス、各種設定、最近のスケールイベント、そして現在の請求期間における利用状況とコストのパネルをすべて1つにまとめた、単一の**スケーリング**タブになっています。

## 動作の仕組み

アプリはプロセスクラスターとして実行されます。オートスケーリングは、実行中のインスタンス全体の平均CPUを監視し、設定したしきい値に基づいてインスタンスを追加または削除します。

クラスターモードが必須です。アプリがまだクラスターモードで実行されていない場合、オートスケーリングを有効にすると自動的に切り替わり、その際に短い再起動が発生します。このページには、その切り替えが発生したことが表示されます。

## ライブステータスの見方

ステータスカードには次の3項目が表示されます。

- **Instances**: 現在実行中のインスタンス数。
- **平均CPU**: それらのインスタンスにおける平均CPU使用率。
- **Cluster**: アプリがクラスターモードかどうか。「いいえ」と表示されている場合、オートスケーリングを有効にすると切り替わります。

アプリがまったく実行されていない場合、カードにはゼロではなくその旨が表示されます。

このタブには**最後のスケール**（直近のスケールイベントの時刻、または「never」）も表示されます。

## 各種設定

| 設定項目 | 範囲 | 何をしているか |
|---|---|---|
| 最小インスタンス | 1〜16 | 下限値です。これより少なくはスケールしません |
| 最大インスタンス | 1〜16 | 上限値です。これより多くはスケールしません |
| スケールアップ CPU % | 5〜99 | 平均CPUがこの値を上回るとインスタンスを1つ追加します |
| スケールダウン CPU % | 1〜95 | 平均CPUがこの値を下回るとインスタンスを1つ削除します |
| クールダウン（秒） | 30〜3600 | スケール動作の間に必要な最小待機時間 |

設定カードのヘッダーにあるトグルがマスタースイッチです。オートスケーリングがオフの場合、各種設定は淡色表示となり、アプリは現在のインスタンス数のまま維持されます。

妥当な初期値の目安：

- **Min instances は1または2。** 単一インスタンスの再起動によってアプリがオフラインになることが許容できない場合は2にします。
- **最大インスタンス** はピーク時に支払っても良いと思える値に設定し、上限いっぱいには設定しません。
- **Scale upはおおよそ70パーセント前後。** 使うことのない余裕分に料金を払わずに済むほど高く、かつリクエストがキューイングし始める前に処理能力を追加する時間を確保できるほど低い値にします。
- **Scale downはおおよそ30パーセント前後。** 2つのしきい値の間には広い間隔を空けてください。
- **Cooldownは数分程度。** これは最も軽視されがちな設定です。

> **Warning:** 2つのCPUしきい値を近づけすぎると、フラッピング（振動現象）が発生します。クラスターがスケールアップした直後、負荷がより広く分散されたことでスケールダウンのしきい値を下回り、スケールダウンし、すると再び負荷が急上昇する、という繰り返しです。広い間隔を保ち、余裕を持ったクールダウンを使用してください。フラッピングはコストがかかり、アプリを不安定にします。

## スケールイベント

このタブには、最近のスケールイベントが新しい順に一覧表示され、それぞれ方向（増減）、発生前後のインスタンス数、トリガーとなったCPU値、そして発生時刻が表示されます。

アプリの挙動がおかしくなった際に確認すべきログです。数分の間に増減のイベントが連続している場合は、しきい値が近すぎるか、クールダウンが短すぎることを意味します。一度スケールアップしたまま戻らない場合は、負荷が高止まりしていることを意味し、これは設定の問題ではなく容量の問題です。期待していたのにイベントが一切ない場合は、CPUがしきい値を超えなかったか、オートスケーリングがオフになっているかのいずれかです。

## オートスケーリングの料金

プランの基本割り当てを超えるインスタンスは秒単位で計測され、課金されます。このタブには、現在の期間について次の内容が表示されます。

- **使用されたインスタンス時間**: 時間と分で表示され、その下に生のインスタンス秒数も表示されます。
- **現時点までの利用額**: この期間における現時点までの利用額。
- **月末時点の予測値**: これまでの利用状況から推計した月末時点の予測値。
- **Tracking**: 記録された合計のうち、いくつの利用期間分が課金済みか。
- **期間進捗**: その月の日数のうち経過した日数。

秒単位の料金は同じパネルの上部に表示されるため、課金対象となる数値は常にそれが適用される利用状況のすぐ隣で確認できます。

> **Tip:** 注視すべき数値は予測値です。これはこれまでの利用状況から推計されるため、月初に異常に忙しい週があると、実際より高めに見積もられてしまいます。数日経過した時点、そして月の半ばになった時点で再度確認してから結論を出してください。予測値が想定より高い場合は、スケールアップのしきい値を上げるのではなく、最大インスタンス数を下げてください。上限は絶対的な制限ですが、しきい値はあくまで目安に過ぎません。

最小値までスケールダウンすると、計測は停止します。オートスケーリングを完全にオフにした場合、アプリはその時点のインスタンス数のまま維持されるため、オフにする理由がコスト削減である場合は、先に最小値まで戻しておいてください。

## アプリをスケーリングに対して安全にする

このページには警告が表示されており、これがページ内で最も重要な内容です。Node.jsアプリは、複数のインスタンス間でクリーンにスケーリングできるよう、クラスターセーフでなければなりません。

具体的には、次のことを意味します。

**メモリ内にセッション状態を持たないこと。** サインイン済みユーザーのセッションが1つのインスタンスのメモリ上にしかない場合、リクエストが別のインスタンスに届くたびにサインアウトされてしまいます。セッションは共有ストアに移してください。

**正確性のために依存しているメモリ内キャッシュを持たないこと。** 各インスタンスはそれぞれ独自のキャッシュを持っています。一貫性が必要なキャッシュは共有する必要があります。

**後で読み込むことを期待したローカルファイルシステムへの書き込みを行わないこと。** あるインスタンスがローカルディスクに書き込んだアップロードファイルは、他のインスタンスからは見えません。共有ストレージに書き込んでください。

**保護されていないスケジュール処理を行わないこと。** タイマーがアプリ内部で動作している場合、すべてのインスタンスがそれを実行するため、4つのインスタンスがあれば夜間ジョブが4回実行されてしまいます。スケジュール処理はcronジョブに移すか、ロックで保護してください。[Cron Jobs](https://support.kapsulehost.com/ja-jp/cron-jobs)を参照してください。

**インスタンス数が一定であるという前提を置かないこと。** インスタンスのインデックスによって処理を分割する仕組みは、インスタンス数が変化した瞬間に破綻します。

これらのいずれかがアプリに当てはまる場合は、オートスケーリングを有効にする前に修正してください。クラスターセーフでないアプリは、どのインスタンスがどのリクエストを処理したかに依存するため、断続的で再現が難しい形で不具合を起こします。

## トラブルシューティング

**トグルを有効にできない。** 有効化にはサイトの書き込み権限が必要です。読み取り専用権限の場合、操作は無効化されています。

**オートスケーリングを有効にしたらアプリが再起動した。** 想定どおりの動作です。クラスターモードへの切り替えには再起動が必要で、これは一度だけ発生します。

**ユーザーがランダムにサインアウトされる。** クラスターセーフでない場合によく見られる典型的な症状です。セッションがメモリ上にあり、リクエストが別々のインスタンスに届いています。

**インスタンスがスケールアップしたまま戻らない。** 負荷がスケールダウンのしきい値を上回ったまま維持されているか、トラフィックとは無関係に何かがCPUを高止まりさせている可能性があります。イベント一覧を確認し、アプリが実際に何をしているかを調べてください。

**スケジュールされたジョブが複数回実行された。** すべてのインスタンスがそれを実行しました。cronジョブに移すか、ロックを追加してください。

**まったくスケールしない。** トグルがオンになっていること、アプリが実行中であること、クラスターモードが有効であることを確認してください。次に、イベント一覧でCPUが実際にスケールアップのしきい値を超えたかどうかを確認してください。

**コストが想定より高い。** イベント一覧でフラッピングが発生していないか確認し、最大インスタンス数を下げてください。

## 関連ページ

- [サイトのパフォーマンスとAPM](https://support.kapsulehost.com/ja-jp/site-performance): CPUが本当にボトルネックかどうかを確認するために。
- [サイトの稼働監視](https://support.kapsulehost.com/ja-jp/site-uptime-monitoring): スケーリングが実際に可用性を改善しているかを確認するために。
- [Cron Jobs](https://support.kapsulehost.com/ja-jp/cron-jobs): 正確に1回だけ実行する必要があるスケジュール処理のために。
- [クラウドサーバーのリサイズ](https://support.kapsulehost.com/ja-jp/cloud-servers-resize): インスタンスを増やすのではなく、より大きなマシンが必要な場合に。
