自动升级为 Firestore

本页介绍了从旧版 Cloud Datastore 到 Datastore 模式 Firestore 的升级路径。

Firestore 可以在 Datastore 模式下运行,这样能够向后兼容旧版 Cloud Datastore。借助 Datastore 模式 Firestore,您可以访问 Firestore 经过改进的存储层,同时保留 Datastore 的系统行为。Datastore 模式 Firestore 取消了以下旧版 Cloud Datastore 限制:

  • 查询不再具有最终一致性。除非您明确请求最终一致性,否则查询将变得高度一致。
  • 事务中的查询不再需要是祖先查询1
  • 事务不再仅限于 25 个实体群组1
  • 对实体组的写入不再限于每秒 1 次1

如需详细了解 Datastore 模式,请参阅 Datastore 模式 Firestore

自 2021 年 6 月起,从旧版 Cloud Datastore 到 Datastore 模式 Firestore 的迁移已开始。迁移从流量非常低的数据库开始,并且将在未来几个月内扩展到流量更高的数据库。

1 迁移到 Optimistic With 实体群组并发模式仍受 25 个实体组的约束 事务限制以及 Datastore 模式 Firestore 的每秒 1 次写入限制。 事务中的查询必须是祖先查询。如需了解详情,请参阅“使用实体组的乐观并发模式”部分

自动升级为 Datastore 模式 Firestore

如果您管理使用旧版 Cloud Datastore 的应用,则无需 更新应用代码。届时我们将通知您,以便安排将您的应用升级为 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:在将对实体和索引的所有更改都应用于至少一个副本之前,写入不会报告成功。这模拟了 Datastore 模式 Firestore 的行为,该模式也会同步应用写入(与在提交后异步应用写入的旧版 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. 验证数据

    与旧版 Cloud Datastore 中的数据进行比较,在 Datastore 模式 Firestore 中重新验证数据。

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 配额”页面开始显示 Firestore 使用量 而不是旧版 Cloud Datastore

交易

Datastore 模式 Firestore 支持三种并发模式:

  • 乐观

    大多数旧版 Cloud Datastore 数据库将对 Datastore 模式 Firestore 中的事务使用乐观并发。乐观并发机制可以保留 旧版 Cloud Datastore 中事务的现有行为。

  • 使用实体组进行乐观更新

    依赖于实体组事务语义的数据库将迁移到此并发模式。请参阅 使用组织部门并发模式乐观 部分

  • Pessimistic

    之前迁移过的一些活动极少的数据库已迁移 为 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"

您还可以通过检查 logs PREPARE 阶段。

使用实体群组并发模式实现乐观

如需移除“乐观并支持实体组”的查询、事务和写入吞吐量限制,请将项目的并发模式更改为“乐观”。为确保此更改与您的项目兼容,请执行以下操作:

  1. 在 Datastore 模式下的 Firestore 中创建测试项目。

  2. 更改测试项目的并发设置 模式更改为 OPTIMISTIC。发出 HTTP 补丁 如下所示。

  3. 对测试项目运行测试,以确保您的工作负载 在没有 Entity 群组的情况下运行正常。

  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 APIGoogle Cloud CLI

更新会发布到 datastore.googleapis.com 日志记录服务名称下的两个日志

日志名称 受监控的资源 载荷
migration_state datastore_database type.googleapis.com/google.datastore.admin.v1.MigrationStateEvent
migration_progress datastore_database type.googleapis.com/google.datastore.admin.v1.MigrationProgressEvent

如果升级的整体状态(RUNNINGCOMPLETE)发生变化,则 migration_state 日志会更新。

每次升级进入新阶段(PREPARESTARTAPPLY_WRITES_SYNCHRONOUSLYCOPY_AND_VERIFYREDIRECT_EVENTUALLY_CONSISTENT_READSREDIRECT_STRONGLY_CONSISTENT_READSREDIRECT_WRITES)时,migration_progress 日志即会更新。

若要在升级过程中接收通知,您可以 创建基于日志的指标 日志和 根据以下内容创建提醒: 这些指标

Google Cloud 控制台中的迁移横幅

当您的旧版 Cloud Datastore 数据库处于迁移过程中时, Datastore Studio 页面中将会显示信息横幅, Google Cloud 控制台此横幅包含用于打开 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"

迁移完成后,这些命令将不起作用。

如果您需要将迁移暂停一周以上,请联系 通过支持渠道获得支持。两周后 系统可能会自动继续进行迁移

Cloud Monitoring 指标

Datastore 数据库可用的 Cloud Monitoring 指标在整个升级过程中保持不变,请参阅可用的 Datastore 指标