このドキュメントでは、Compute Engine で堅牢なシステムを設計するためのベスト プラクティスについて説明します。一般的なアドバイスを提供し、インスタンスのダウンタイムを軽減し、仮想マシン(VM)インスタンスが思いがけない障害を被ったときに備えるために役立つ Compute Engine のいくつかの機能を取り上げます。
堅牢なシステムとは、サービスを中断することなく、またはサービスを使用しているユーザーのエクスペリエンスに影響を及ぼすことなく、一定量の障害や中断に耐えられるシステムです。Compute Engine には、このような中断を防ぐためにあらゆる努力が施されていますが、特定のイベントは予測できないため、これらのイベントに備えておくことをおすすめします。
障害の種類について
場合により、システムやハードウェアのエラーが原因で 1 つ以上の VM インスタンスが失われることがあります。次のような障害などが含まれます。
単一インスタンスの予期しないエラー
単一インスタンスの予期しないエラーは、ハードウェアやシステムのエラーが原因で発生することがあります。このような障害が発生した場合は、永続ディスクと起動スクリプトを使用してデータを保存し、インスタンスの再起動後にソフトウェアを再度有効にすると影響を軽減できます。
単一インスタンスの予期しない再起動
場合により、単一インスタンスの予期しないエラーが発生し、再起動することがあります。単一インスタンスの予期しないエラーのみが発生する場合とは異なり、インスタンスはエラーにより終了し、その後 Google Compute Engine サービスによって自動的に再起動されます。このような障害が発生した場合は、データのバックアップをとり、永続ディスクを使用するとともに、起動スクリプトによってソフトウェアを迅速に再構成すると影響を軽減できます。
ゾーンまたはリージョンのエラー
ゾーンとリージョンのエラーは発生頻度の低いエラーですが、発生した場合、特定のゾーンまたはリージョンにあるすべてのインスタンスがアクセス不能となったり、エラーで終了したりする可能性があります。
このような障害が発生した場合は、複数のリージョンやゾーンにわたってインスタンスを展開し、負荷分散を実装すると影響を軽減できます。また、データをバックアップするか、複数のゾーンに永続ディスクを複製する必要があります。
堅牢なシステムの設計のヒント
インスタンスのエラーを緩和するためには、Google Compute Engine サービスで、エラー、ネットワークの中断、思いがけない災害などに対して堅牢となるようにアプリケーションを設計する必要があります。堅牢なシステムは、停止したインスタンスから稼働中のインスタンスへのトラフィックのリダイレクトや、再起動時のタスクの自動化など、エラーに適切に対処できる必要があります。
ここでは、エラーに対して堅牢なシステムを設計するのに役立つ一般的なヒントを示します。
ライブ マイグレーションの使用
Google では、そのインフラストラクチャについて定期的にメンテナンスを実施しています。最新のソフトウェアを使用してシステムにパッチを適用し、ルーチンテストと予防的メンテナンスを実行し、全体としてインフラストラクチャが可能な限り安全で高速かつ効率的に機能していることを確認します。Compute Engine では、このインフラストラクチャ メンテナンスが仮想マシン インスタンスに対してデフォルトで透過的となるように、ライブ マイグレーションを採用しています。
ライブ マイグレーションは、メンテナンス作業が実施されるシステムから実行中のインスタンスを移動するために Google が構築したテクノロジーです。Compute Engine ではこの操作が自動的に行われます。
ライブ マイグレーション中は、インスタンスで一時的にパフォーマンスの低下が発生することがあります。また、メンテナンス開始時に仮想マシン インスタンスを停止し、メンテナンス完了後に再起動するよう構成するオプションもあります。このオプションは、インスタンスで一定かつ最大のパフォーマンスが必要とされる場合や、アプリケーション全体がインスタンスのエラーや再起動に対応できるように作成されている場合に適しています。
仮想マシンをライブ マイグレーションするよう構成する方法、またはマイグレーションではなく再起動するよう構成する方法については、インスタンス可用性ポリシーの設定をご覧ください。
ライブ マイグレーションの詳細については、ライブ マイグレーションのドキュメントをご覧ください。
インスタンスを分散する
いずれかのインスタンスを含むゾーンまたはリージョンが機能しなくなった場合に、アクセス先となる代替の仮想マシン インスタンスが確保されるように、複数のリージョンまたはゾーンにインスタンスを作成します。同じゾーンまたはリージョンですべてのインスタンスをホストすると、そのゾーンまたはリージョンがアクセス不能となった場合に、どのインスタンスにもアクセスできなくなります。
ゾーン固有の内部 DNS 名を使用する
Compute Engine 内部ネットワーク上のインスタンスのアドレス指定に内部 DNS 名またはインスタンス名を使用する場合は、ゾーン DNS 名を使用します。内部 DNS サーバーはすべてのゾーンに分散して配置されているため、他のロケーションで障害が発生していても、ゾーン DNS 名であれば確実に解決できます。インスタンスの内部完全修飾ドメイン名(FQDN)の形式は次のとおりです。
- ゾーン DNS を使用するインスタンス:
[INSTANCE_NAME].[ZONE].c.[PROJECT_ID].internal
- グローバル DNS を使用するインスタンス:
[INSTANCE_NAME].c.[PROJECT_ID].internal
ここで
[INSTANCE_NAME]
は、インスタンスの名前です。[ZONE]
はインスタンスが配置されているゾーンです。[PROJECT_ID]
はインスタンスが属するプロジェクトです。
インスタンスがゾーン DNS 名とグローバル DNS 名のどちらを使用しているか確認するには、インスタンスの内部 DNS 名を表示するをご覧ください。
プロジェクトでグローバル DNS 名を使用している場合は、ゾーン DNS 名と検索パスに応じてアプリケーションを準備できます。詳細については、ゾーン DNS 名に移行するをご覧ください。
インスタンスのグループを作成する
マネージド インスタンス グループを使用してインスタンスの同種のグループを作成し、1 つのインスタンスが異常になった場合に、ロードバランサが複数の VM インスタンスにトラフィックを誘導できるようにします。
マネージド インスタンス グループには、自動スケーリングや自動修復などの機能もあります。自動スケーリングは、特定のシグナルに基づいて、VM インスタンスの数を増減することで、トラフィックの急増に対応できます。自動修復ではヘルスチェックを行い、必要に応じて異常なインスタンスを自動的に再作成します。
マネージド インスタンス グループはリージョンにも使用できるため、単一リージョン内の複数のゾーンに分散された VM インスタンスのグループを作成できます。詳細については、リージョン マネージド インスタンス グループを使用したインスタンスの分散をご覧ください。
負荷分散を使用する
Google Cloud には負荷分散サービスが用意されているため、トラフィックの多い期間をサポートしてインスタンスを過負荷にしないようにします。負荷分散サービスを使用すると、次のことができます。
リージョン マネージド インスタンス グループを使用して、複数のゾーン内のインスタンスにアプリケーションをデプロイします。その後、リージョン内のすべてのゾーンにあるすべての仮想マシン インスタンス間でトラフィックを分散するように転送ルールを構成できます。各転送ルールでは、特定の外部 IP アドレスを使用してアプリケーションへの 1 つのエントリ ポイントを定義できます。
グローバルな負荷分散を使用して、複数のリージョンにインスタンスをデプロイします。HTTP 負荷分散を使用すると、クライアント側の一番近いロケーションでトラフィックを Google Cloud システムに送信できます。クロスリージョン負荷分散により、特定のリージョンがアクセス不能となった場合にトラフィックが別のリージョンに自動的に転送されるように、冗長性が確保されます。これにより、引き続き同じ外部 IP アドレスを使用してサービスにアクセスできます。
自動スケーリングを使用して、負荷の増減に基づいて自動的にマネージド インスタンス グループのインスタンスを追加または削除します。
さらに、負荷分散サービスは、VM のヘルスチェックも備えており、インスタンスのエラーを検出して処理するためのサポートを提供します。
詳細については、負荷分散の概要と負荷分散のドキュメントをご覧ください。
起動スクリプトとシャットダウン スクリプトを使用する
Compute Engine には、インスタンスが起動またはシャットダウンすると実行される起動スクリプトとシャットダウン スクリプトが用意されています。これらのスクリプトにより、インスタンスが初めて起動したときや、意図的かどうかを問わずインスタンスが停止したときに、ソフトウェアのインストール、更新の実行、バックアップの作成、データのロギングなどのタスクを自動化できます。
起動スクリプトとシャットダウン スクリプトはいずれも、インスタンスをブートストラップまたは完全シャットダウンするための効率的で有益な方法です。カスタム イメージを使用してインスタンスを構成する代わりに、起動スクリプトを使用してインスタンスを構成することには利点があります。起動スクリプトは、エラーによってインスタンスが再起動されるときに常に実行され、ソフトウェアや更新をインストールするため、またサービスが VM 内で実行されるようにするために使用できます。起動スクリプトでインスタンスを構成するための変更をコーディングすることは、カスタム イメージでどのファイルやバイトが変更されたかを把握しようとするよりも簡単です。
シャットダウン スクリプトは、インスタンスを停止する前に行うデータのバックアップ、ログの保存、および接続の正常終了といった終了時の最終作業を行えます。
詳細については、起動スクリプトの実行とシャットダウン スクリプトの実行をご覧ください。
データをバックアップする
複数のロケーションでデータのバックアップを定期的に行ってください。ファイルを Cloud Storage、永続ディスク スナップショットの作成にバックアップするか、データを別のリージョン、またはゾーンの永続ディスクに複製します。
インスタンスから Cloud Storage にファイルをコピーするには:
インスタンスにログインします。
gcloud compute ssh example-instance
このインスタンスで
gsutil
ツールを使用したことがない場合は、認証情報を設定します。gcloud init
または、Cloud Storage スコープでサービス アカウントを使用するようにインスタンスを設定した場合は、これをスキップして次の手順に進みます。
手順に沿って、Cloud Storage に対する認証を行います。
次のコマンドを使用して、Cloud Storage にデータをコピーします。
gsutil cp <file1> <file2> <file3> ... gs://<your bucket>
また、ローカルのパソコンにファイルをコピーする gcloud compute
ツールの使用も可能です。詳細については、インスタンスとのファイルのコピーをご覧ください。
次のステップ
- ライブ マイグレーションの詳細を見る。
- 起動スクリプトを作成する。
- シャットダウン スクリプトを作成する。
- マネージド インスタンス グループの詳細を見る。
- 負荷分散の詳細を見る。