托管式灾难恢复

本文档简要介绍 BigQuery 托管式灾难恢复,以及如何为数据和工作负载实施此类灾难恢复。

概览

BigQuery 支持在发生全区域服务中断时进行灾难恢复。BigQuery 灾难恢复依靠跨区域数据集复制来管理存储故障切换。在次要区域中创建数据集副本后,您可以控制计算和存储的故障切换行为,以在服务中断期间维护业务连续性。进行故障切换后,您可以在提升的区域中访问计算容量(槽)和复制的数据集。只有企业 Plus 版才支持灾难恢复。

托管式灾难恢复会在启动故障切换时执行硬故障切换。在硬故障切换中,次要区域中的预留和数据集副本会立即提升为主要区域中的内容,即使先前的主要区域服务中断也是如此,不会等待复制任何未复制的数据。因此在硬故障切换期间,可能会发生数据丢失。进行故障切换之后,在副本的 replication_time 值之前在来源区域中提交数据的任何作业都可能需要在目标区域中重新运行。

如需启用灾难恢复,您需要在主要区域(即数据集在进行故障切换之前所在的区域)中创建企业 Plus 版预留。配对区域中的备用计算容量包含在企业 Plus 版预留中。您随后可将一个数据集附加到此预留,以便为该数据集启用故障切换。仅当数据集进行回填,并且具有与预留相同的配对主要位置和次要位置时,您才能将数据集附加到预留。将数据集附加到故障切换预留后,只有企业 Plus 版预留才能对这些数据集进行读取或写入,并且您无法对数据集执行跨区域复制提升。如需详细了解预留,请参阅工作负载管理简介

进行故障切换后,可立即在次要区域中使用主要区域的计算容量。这种可用性适用于预留基准(无论是否使用它)。

在测试或应对实际灾难的过程中,您必须主动选择进行故障切换。您不应在 10 分钟内多次进行故障切换。在数据复制场景中,回填是指使用在副本创建或生效之前存在的历史数据来填充数据集副本的过程。数据集必须先完成其回填,然后您才能故障切换到数据集。

下图展示了托管式灾难恢复的架构:

托管式灾难恢复架构。

限制

BigQuery 灾难恢复存在以下限制:

  • BigQuery 灾难恢复受到与跨区域数据集复制相同的限制。

  • 区域支持基于双区域存储桶。您无法配置以下区域对:

    • us-central1 - us 多区域
    • us-west1 - us 多区域
    • eu-west1 - eu 多区域
    • eu-west4 - eu 多区域
  • 进行故障切换后的自动扩缩取决于次要区域中的计算容量可用性。次要区域中仅提供预留基准。

  • INFORMATION_SCHEMA.RESERVATIONS 视图不包含故障切换详细信息。

  • 如果您的同一个管理项目有多个故障切换预留,但这些预留的附加数据集使用不同的次要位置,请不要将一个故障切换预留与附加到不同故障切换预留的数据集搭配使用。

  • 如果您要将现有预留转换为故障切换预留,则现有预留的分配不能超过 1,000 个。

准备工作

  1. 确保您拥有更新预留的 bigquery.reservations.update Identity and Access Management (IAM) 权限。
  2. 确保您具有针对复制进行了配置的现有数据集。有关详情,请参阅复制数据集

配额

您必须先在次要区域中具有所选的计算容量,然后才能配置故障切换预留。如果次要区域中没有可用的配额,则无法配置预留。如需了解详情,请参阅配额和限制

价格

配置托管式灾难恢复需要以下定价方案:

  • 计算容量:您必须购买企业 Plus 版

  • 增强型复制:灾难恢复在复制期间依赖于增强型复制。您需要根据物理字节数,按复制的物理 GB 量付费。如需了解详情,请参阅 Cloud Storage 价格

  • 存储:次要区域中的存储字节数的计费价格与主要区域中的存储字节数相同。如需了解详情,请参阅存储价格

客户只需要为主要区域中的计算容量付费。次要计算容量(基于预留基准)在次要区域中可用,无需额外付费。除非预留进行了故障切换,否则空闲槽不能使用次要计算容量。

如果您需要在次要区域中执行过时读取,则可以在次要区域中购买额外的企业 Plus 版计算容量。

创建或更改企业 Plus 版预留

在将数据集附加到预留之前,您必须先创建企业 Plus 版预留或更改现有预留,然后对其进行配置以用于灾难恢复。

创建预留

从下列选项中选择一项:

控制台

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

  2. 在导航菜单中,点击容量管理,然后点击创建预留

  3. 预留名称字段中,输入预留的名称。

  4. 位置列表中,选择相应位置。

  5. 版本列表中,选择企业 Plus 版。

  6. 预留大小上限选择器列表中,选择预留大小上限。

  7. 可选:在基准槽数字段中,输入预留的基准槽数。

    可用自动扩缩槽的数量为预留大小上限值减去基准槽数值。例如,如果您创建了一个包含 100 个基准槽且预留大小上限为 400 的预留,则该预留包含 300 个自动扩缩槽。如需详细了解基准槽,请参阅将预留与基准槽和自动扩缩槽搭配使用

  8. 次要位置列表中,选择次要位置。

  9. 如需停用空闲槽共享并且仅使用指定的槽容量,请点击忽略空闲槽切换开关。

  10. 如需展开高级设置部分,请点击 展开箭头。

  11. 可选:如需设置目标作业并发,请点击开启替换自动目标作业并发切换开关,然后为目标作业并发输入值。槽明细显示在费用估算表中。预留摘要显示在容量摘要表中。

  12. 点击保存

新预留会显示在槽预留标签页中。

SQL

如需创建预留,请使用 CREATE RESERVATION 数据定义语言 (DDL) 语句

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,输入以下语句:

    CREATE RESERVATION
      `ADMIN_PROJECT_ID.region-LOCATION.RESERVATION_NAME`
    OPTIONS (
      slot_capacity = NUMBER_OF_SLOTS,
      edition = ENTERPRISE_PLUS,
      secondary_location = SECONDARY_LOCATION);
    

    替换以下内容:

    • ADMIN_PROJECT_ID:拥有预留资源的管理项目的项目 ID。
    • LOCATION:预留的位置。如果您选择 BigQuery Omni 位置,则您的版本选项仅限于企业版。
    • RESERVATION_NAME:预留的名称。

      该名称必须以小写字母或数字开头和结尾,并且只能包含小写字母、数字和短划线。

    • NUMBER_OF_SLOTS:要分配给此预留的槽数。承诺使用合约中必须有足够未分配的槽。您不能在同一预留中设置 slot_capacity 选项和 edition 选项。
    • SECONDARY_LOCATION:预留的次要位置。如果发生服务中断,则附加到此预留的任何数据集都会故障切换到此位置。

  3. 点击 运行

如需详细了解如何运行查询,请参阅运行交互式查询

更改现有预留

从下列选项中选择一项:

控制台

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

  2. 在导航面板中,转到容量管理部分。

  3. 点击槽预留标签页。

  4. 找到要更新的预留。

  5. 展开 操作选项。

  6. 点击修改

  7. 次要位置字段中,输入次要位置。

  8. 点击保存

SQL

如需对预留添加或更改次要位置,请使用 ALTER RESERVATION SET OPTIONS DDL 语句

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,输入以下语句:

    ALTER RESERVATION
      `ADMIN_PROJECT_ID.region-LOCATION.RESERVATION_NAME`
    SET OPTIONS (
      secondary_location = SECONDARY_LOCATION);
    

    替换以下内容:

    • ADMIN_PROJECT_ID:拥有预留资源的管理项目的项目 ID。
    • LOCATION:预留的位置,例如 europe-west9
    • RESERVATION_NAME:预留的名称。该名称必须以小写字母或数字开头和结尾,并且只能包含小写字母、数字和短划线。

    • SECONDARY_LOCATION:预留的次要位置。如果发生服务中断,则附加到此预留的任何数据集都会故障切换到此位置。

  3. 点击 运行

如需详细了解如何运行查询,请参阅运行交互式查询

将数据集附加到预留

如需为之前创建的预留启用灾难恢复,请完成以下步骤。数据集必须已配置为在与预留相同的主要和次要区域中进行复制。如需了解详情,请参阅跨区域数据集复制

控制台

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

  2. 在导航菜单中,点击容量管理,然后点击槽预留标签页。

  3. 点击要向其附加数据集的预留。

  4. 点击灾难恢复标签页。

  5. 点击添加关联的数据集

  6. 输入要与预留关联的数据集的名称。

  7. 点击添加

SQL

如需将数据集附加到预留,请使用 ALTER SCHEMA SET OPTIONS DDL 语句

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,输入以下语句:

    ALTER SCHEMA
      `DATASET_NAME`
    SET OPTIONS (
      failover_reservation = RESERVATION_NAME);
    

    替换以下内容:

    • DATASET_NAME:数据集的名称。

    • RESERVATION_NAME:您要将数据集关联到的预留的名称。

  3. 点击 运行

如需详细了解如何运行查询,请参阅运行交互式查询

启动故障切换

如果发生区域级服务中断,您必须手动将预留故障切换到副本所使用的位置。对预留进行故障切换还包括所有关联的数据集。如需手动对预留进行故障切换,请执行以下操作:

控制台

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

  2. 在导航菜单中,点击灾难恢复

  3. 点击要故障切换到的预留的名称。

  4. 点击故障切换

SQL

如需对预留添加或更改次要位置,请使用 ALTER RESERVATION SET OPTIONS DDL 语句并将 is_primary 设置为 TRUE

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,输入以下语句:

    ALTER RESERVATION
      `ADMIN_PROJECT_ID.region-LOCATION.RESERVATION_NAME`
    SET OPTIONS (
      is_primary = TRUE);
    

    替换以下内容:

    • ADMIN_PROJECT_ID:拥有预留资源的管理项目的项目 ID。
    • LOCATION:预留的位置,例如 europe-west9
    • RESERVATION_NAME:预留的名称。该名称必须以小写字母或数字开头和结尾,并且只能包含小写字母、数字和短划线。

    • PRIMARY_STATUS:一个布尔值状态,用于声明预留是否为主要副本。

  3. 点击 运行

如需详细了解如何运行查询,请参阅运行交互式查询

监控

如需确定副本的状态,请查询 INFORMATION_SCHEMA.SCHEMATA_REPLICAS 视图。例如:

SELECT
  schema_name,
  replica_name,
  creation_complete,
  replica_primary_assigned,
  replica_primary_assignment_complete
FROM
  `region-us`.INFORMATION_SCHEMA.SCHEMATA_REPLICAS
WHERE
  schema_name="project2.my_dataset"

以下查询返回过去七天内在其数据集为故障切换数据集时会失败的作业:

WITH
  non_epe_reservations AS (
    SELECT project_id, reservation_name
    FROM `PROJECT_ID.region-LOCATION`.INFORMATION_SCHEMA.RESERVATIONS
    WHERE edition != 'ENTERPRISE_PLUS'
  )
SELECT *
FROM
  (
    SELECT job_id
    FROM
      (
        SELECT
          job_id,
          reservation_id,
          ARRAY_CONCAT(referenced_tables, [destination_table]) AS all_referenced_tables,
          query
        FROM
          `PROJECT_ID.region-LOCATION`.INFORMATION_SCHEMA.JOBS
        WHERE
          creation_time
          BETWEEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
          AND CURRENT_TIMESTAMP()
      ) A,
      UNNEST(all_referenced_tables) AS referenced_table
  ) jobs
LEFT OUTER JOIN non_epe_reservations
  ON (
    jobs.reservation_id = CONCAT(
      non_epe_reservations.project_id, ':', 'LOCATION', '.', non_epe_reservations.reservation_name))
WHERE
  CONCAT(jobs.project_id, ':', jobs.dataset_id)
  IN UNNEST(
    [
      'PROJECT_ID:DATASET_ID',
      'PROJECT_ID:DATASET_ID']);

请替换以下内容:

  • PROJECT_ID:项目 ID。
  • DATASET_ID:数据集 ID。
  • LOCATION位置

后续步骤