Firestore への自動アップグレード

このページでは、以前の Cloud Datastore から Datastore モードの Firestore へのアップグレード パスについて説明します。

Firestore は Datastore モードで動作するため、以前の Cloud Datastore との下位互換性があります。Datastore モードの Firestore では、Datastore システムの動作を維持しながら Firestore の改善されたストレージ レイヤにアクセスできます。Datastore モードの Firestore では、以前の Cloud Datastore の次の制限がなくなります。

  • クエリは結果整合性がなくなりました。代わりに、結果整合性を明示的にリクエストしない限り、強整合性になります。
  • トランザクション内のクエリが祖先クエリである必要がなくなります1
  • 25 エンティティ グループまでというトランザクションの制限がなくなります1
  • 1 秒あたり 1 個というエンティティ グループへの書き込み制限がなくなります1

Datastore モードの詳細については、Datastore モードの Firestore をご覧ください。

2021 年 6 月に以前の Cloud Datastore から Datastore モードの Firestore への移行が開始されました。移行は、非常に低いトラフィック データベースから始まり、今後数か月でトラフィック量の多いデータベースに拡張する予定です。

1 エンティティ グループによるオプティミスティック同時実行モードに移行するデータベースには、引き続き Datastore モードの Firestore での 25 エンティティ グループ トランザクション上限と 1 秒あたり 1 個の書き込み制限が適用されます。 トランザクション内のクエリは祖先クエリでなければなりません。詳細については、エンティティ グループによるオプティミスティック同時実行モードのセクションをご覧ください。

Datastore モードの Firestore への自動アップグレード

以前の Cloud Datastore を使用するアプリケーションを管理している場合は、アプリケーション コードの更新は必要ありません。Google から、アプリケーションを Datastore モードの Firestore にアップグレードするスケジュールをお知らせします。このアップグレードにダウンタイムは必要ありません。

自動アップグレード プロセスについてご不明な点がある場合は、各サポート窓口までお問い合わせください。

データベース タイプの表示

gcloud alpha firestore databases describe コマンドを使用して、データベース タイプを確認できます。出力で type フィールドの存在を確認します。

  • type: DATASTORE_MODE

    データベース タイプは Datastore モードの Firestore です。アップグレードは不要で、アップグレードがすでに完了しています。

  • 出力に type がありません

    データベース タイプは以前の Cloud Datastore です。データベースは、Datastore モードの Firestore にアップグレードされます。

  • type: FIRESTORE_NATIVE

    データベース タイプはネイティブ モードの Firestore です。

アップグレードのステージ

大まかに言うと、このプロセスに沿って以前の Cloud Datastore データベースを Datastore モードの Firestore にアップグレードします。このプロセスにアプリケーションのダウンタイムは必要ありません。

  1. 新しい Datastore モードの Firestore データレプリカを既存の以前の Cloud Datastore データベースに追加します。Datastore モードの Firestore にエンティティの書き込みオペレーションを非同期で複製します。

  2. 既存のデータとインデックス エントリを以前の Cloud Datastore から Datastore モードの Firestore にコピーします。コピーが完了したら、データを確認します。

  3. Datastore モードの Firestore に直接エンティティをリダイレクトします。まず、結果整合性を読み込み、強整合性の読み込みをリダイレクトします。

  4. エンティティの書き込みとトランザクション型の読み取りを Datastore モードの Firestore に直接リダイレクトします。

このプロセスでは以下のステージを使用します。

1. 書き込みを同期的に適用する

このステージでは、書き込みが以前の Cloud Datastore に同期的に適用されます。エンティティとインデックスへのすべての変更が少なくとも 1 つのレプリカに適用されるまで、書き込みは成功を報告しません。これにより、Datastore モードの Firestore の動作がシミュレートされます。これにより、書き込みも同期的に適用されます(書き込みが commit された後、非同期で適用される以前の Cloud Datastore のデフォルトの動作とは異なります)。

このステージの目的は、アップグレード前の Datastore モードにおける Firestore での同期のレイテンシの影響を明らかにすることです。移行中および移行後も、書き込みの同期適用が継続されます。

アクティビティがごくわずかなデータベースでは、このステージはスキップされます。このステージがデータベースのアップグレードに含まれているかどうかを確認するには、APPLY_WRITES_SYNCHRONOUSLY ステージのログを調べます。

2. コピーして確認する

このステージは移行の開始を表します。Datastore モードの Firestore レプリカを使用し、次の手順を実施します。

  1. ジャーナル

    以前の Cloud Datastore へのエンティティの書き込みオペレーションも、Datastore モードの Firestore レプリカへのサイドチャネルでも開始されます。これは、以前の Cloud Datastore の既存のレプリケーション システムの一部として行われます。これらの書き込みオペレーションは、書き込みレイテンシには影響しません。Datastore モードの Firestore レプリカは、コピー手順の後に適用する書き込みオペレーションをバッファします。

  2. コピー

    Datastore モードの Firestore レプリカで、既存のデータとインデックス エントリのオフライン コピーを作成します。コピー手順は以前の Cloud Datastore のオペレーションに影響しません。このステップは数日続く場合があります。

  3. ジャーナルを排出する

    オフライン コピーのデータの上にジャーナル ステップによる書き込みを適用します。

  4. データを確認する

    Datastore モードの Firestore のデータを再確認するには、以前の Cloud Datastore のデータに対して比較します。

3. 結果整合性読み取りをリダイレクトする

Datastore モードの Firestore から結果整合性読み取り(祖先フィルタのないクエリ)が提供されます。この時点では、読み取りのための以前の Cloud Datastore セマンティクスは引き続き適用されます。

  • 祖先クエリは強整合性を持ちます。
  • 非祖先クエリは結果整合性になります。
  • ルックアップは強整合性を持ちます(結果整合性向けに明示的に構成されているものを除く)。

Datastore モードの Firestore は、引き続き以前の Cloud Datastore データのレプリカとして動作します。

4. 強整合性読み取りをリダイレクトする

Datastore モードの Firestore から強整合性読み取り(トランザクション以外)が提供されます。読み取りのための以前の Cloud Datastore セマンティクスは引き続き適用されます。Firestore から直接読み取りを行うようになった場合でも、Firestore は、強整合性読み取りのために最新であることを以前の Cloud Datastore に依存して保証します。

5. 書き込みをリダイレクトする

エンティティの書き込みとトランザクション型の読み取りを Datastore モードの Firestore にリダイレクトします。同じエンティティを同時に変更すると、トランザクションが中止されます。 同じエンティティ グループ内の異なるエンティティを同時に変更しても、トランザクションが中止されることはありません。

この段階の初期でも、Datastore モードの Firestore は、それぞれの書き込みが行われる前に最新であることが保証されるよう以前の Cloud Datastore に依存しています。先に実行されたすべての書き込みが確実に適用される最終パスが終了すると、Datastore モードの Firestore は以前の Cloud Datastore のコンサルティングを停止します。

6. 移行完了

読み取りのための Datastore モードの Firestore のセマンティクスが適用され、すべてのクエリが強整合性になります。

料金はこれまでと同じですが、料金には Firestore SKU が表示されます。[App Engine の割り当て] ページには、以前の Cloud Datastore の使用量の代わりに Firestore の使用量が表示されます。

トランザクション

Datastore モードの Firestore では、3 つの同時実行モードがサポートされています。

  • 楽観的

    以前の Cloud Datastore データベースの大半は、Datastore モードの Firestore のトランザクションにオプティミスティック同時実行を使用します。オプティミスティック同時実行では、以前の Cloud Datastore 内のトランザクションの既存の動作が維持されます。

  • エンティティ グループによるオプティミスティック

    エンティティ グループのトランザクション セマンティクスに依存するデータベースは、この同時実行モードに移行されます。詳細については、エンティティ グループによるオプティミスティック同時実行モードのセクションをご覧ください。

  • 悲観的

    アクティビティがとても少ないデータベースは、Datastore モードの Firestore のトランザクションに対してペシミスティックロックを使用して移行されました。

同時実行モードには、Firestore projects.databases REST リソースを介してアクセスできます。

curl -X GET -H "Authorization: Bearer "$(gcloud auth print-access-token) \
"https://firestore.googleapis.com/v1/projects/PROJECT_ID/databases"

PREPARE ステージのログを調べて、同時実行モードを確認することもできます。

エンティティ グループによるオプティミスティック同時実行モード

エンティティ グループによるオプティミスティックのクエリ、トランザクション、書き込みスループットの制限を取り除くには、プロジェクトの同時実行モードを「楽観的」に変更します。この変更がプロジェクトに適合していることを確認するには、次の手順に従います。

  1. Datastore モードの Firestore でテスト プロジェクトを作成します。

  2. テスト プロジェクトの同時実行モードを OPTIMISTIC に変更します。以下に示すように、HTTP PATCH リクエストを発行します。

  3. テスト プロジェクトでテストを実行し、エンティティ グループなしでワークロードが想定どおりに実行されることを確認します。

  4. メイン プロジェクトの同時実行モードを OPTIMISTIC_WITH_ENTITY_GROUPS から OPTIMISTIC に変更します。

データベースの同時実行モードを変更する HTTP PATCH リクエスト:

curl --request PATCH \
--header "Authorization: Bearer "$(gcloud auth print-access-token) \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{"concurrencyMode":"OPTIMISTIC"}' \
"https://firestore.googleapis.com/v1/projects/PROJECT_ID/databases/(default)?updateMask=concurrencyMode"

ログと進捗状況の通知

アップグレード プロセスでは、Cloud Logging を使用して進捗状況のアップデートを公開します。ログを表示するには、ログ エクスプローラCloud Logging API、または Google Cloud CLI を使用します。

アップデートは、datastore.googleapis.com ロギング サービス名の下にある 2 つのログに公開されます。

ログ名 モニタリング対象リソース ペイロード
migration_state datastore_database type.googleapis.com/google.datastore.admin.v1.MigrationStateEvent
migration_progress datastore_database type.googleapis.com/google.datastore.admin.v1.MigrationProgressEvent

migration_state ログは、アップグレードの全体的な状態(RUNNINGCOMPLETE)が変更されると更新されます。

migration_progress ログは、アップグレードが新しいステージ(PREPARESTARTAPPLY_WRITES_SYNCHRONOUSLYCOPY_AND_VERIFYREDIRECT_EVENTUALLY_CONSISTENT_READSREDIRECT_STRONGLY_CONSISTENT_READSREDIRECT_WRITES)に移行するたびに更新されます。

アップグレードの進行中に通知を受け取るには、2 つのログに基づいてログベースの指標を作成し、これらの指標に基づいてアラートを作成します。

Google Cloud コンソールの移行に関するバナー

以前の Cloud Datastore データベースの移行プロセス中は、Google Cloud コンソールの [Datastore Studio] ページに情報バナーが表示されます。このバナーには、Cloud Logging を開いて移行の更新をフィルタするためのリンクが含まれています。

  1. Google Cloud コンソールで [データベース] ページに移動します。

    [データベース] に移動

  2. データベースのリストから、必要なデータベースを選択します。

  3. ナビゲーション メニューで [Datastore Studio] をクリックします。

CLI の現在の状態を表示する

移行の現在の状態をすばやく表示するには、次の gcloud コマンドを使用します。

gcloud datastore operations describe datastore-firestore-migration

移行を一時停止する

大規模なデータベース移行は、一時停止と再開が可能です。移行を一時停止すると、再開するまで次のステージに進めません。移行を一時停止すると、観測された動作やパフォーマンスの変化が移行プロセスによるものか、関係のない要因によるものかを判断しやすくなります。

データベースの移行に関するメール通知を受け取ったら、以下の一時停止コマンドを実行して、一時停止と再開が可能かどうかを確認できます。移行の一時停止と再開ができない場合は、その機能を利用できないことを示すエラーが返されます。

データベースの移行を一時停止して再開できる場合、移行が START ステージに達すると、以下のコマンドが動作開始します。

移行を一時停止するには:

curl --request POST \
--header "Authorization: Bearer "$(gcloud auth print-access-token) \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{}' \
"https://datastore.googleapis.com/v1/projects/PROJECT_ID:pauseMigration"

移行を再開するには:

curl --request POST \
--header "Authorization: Bearer "$(gcloud auth print-access-token) \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{}' \
"https://datastore.googleapis.com/v1/projects/PROJECT_ID:resumeMigration"

移行の完了後は、これらのコマンドは機能しません。

1 週間を超えて移行を停止する必要がある場合は、サポート チャンネルからご連絡ください。2 週間後に移行が自動的に再開されます。

Cloud Monitoring の指標

Datastore データベースで使用できる Cloud Monitoring 指標は、アップグレード プロセス中も変わりません。利用可能な Datastore の指標をご覧ください