マネージド障害復旧

このドキュメントでは、BigQuery のマネージド障害復旧の概要と、データやワークロード用に障害復旧を実装する方法について説明します。

概要

BigQuery は、リージョン全体が停止した場合の障害復旧シナリオに対応しています。BigQuery の障害復旧では、クロスリージョン データセット レプリケーションによってストレージのフェイルオーバーが管理されます。ユーザーはセカンダリ リージョンでデータセット レプリカを作成した後、コンピューティングとストレージのフェイルオーバー動作を設定することにより、リージョンの停止中もビジネスの継続性を維持できます。フェイルオーバーの後は、昇格したリージョンでコンピューティング容量(スロット)とレプリケーションされたデータセットにアクセスできます。障害復旧は Enterprise Plus エディションでのみご利用いただけます。

マネージド障害復旧では、フェイルオーバーが開始されるとハード フェイルオーバーが実行されます。ハード フェイルオーバーでは、以前のプライマリ リージョンがダウンしていても、レプリケーションが完了していないデータのレプリケーションを待たずに、セカンダリ リージョン内の予約とデータセット レプリカがすぐにプライマリに昇格するため、データ損失が発生する可能性があります。レプリカの replication_time 値より前にソースリージョンでデータを commit したジョブは、フェイルオーバー後に宛先リージョンでの再実行が必要となる場合があります。

障害復旧を有効にするには、フェイルオーバーの前にデータセットが存在していたリージョン(プライマリ リージョン)で Enterprise Plus エディションの予約を作成する必要があります。ペアに設定されたリージョンのスタンバイ コンピューティング容量は、Enterprise Plus 予約に含まれます。この予約にデータセットを接続すると、そのデータセットでフェイルオーバーが有効になります。データセットを予約に接続できるのは、そのデータセットがバックフィルされ、プライマリとセカンダリのロケーション ペアが予約と同じである場合だけです。データセットがフェイルオーバー予約に接続された後は、Enterprise Plus 予約だけがそのデータセットに対して読み取りや書き込みを行えます。そのデータセットに対してクロスリージョン レプリケーション昇格を実行することはできません。予約の詳細については、ワークロード管理の概要をご覧ください。

フェイルオーバーの後は、プライマリ リージョンのコンピューティング容量がセカンダリ リージョンですぐに使用可能になります。この容量は、使用されているかどうかにかかわらず、予約のベースラインに適用されます。

テストの一環として行う場合や、実際の障害に対応する場合は、積極的にフェイルオーバーする必要がありますが、10 分間に 1 回を超える頻度ではフェイルオーバーしないでください。データ レプリケーションのシナリオにおいて、バックフィルとは、データセットのレプリカが作成される前またはアクティブになる前に存在していた過去のデータをレプリカに入力するプロセスを指します。データセットにフェイルオーバーする前に、そのデータセットのバックフィルを完了する必要があります。

次の図は、マネージド障害復旧のアーキテクチャを示しています。

マネージド障害復旧のアーキテクチャ。

制限事項

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. レプリケーション用に構成された既存のデータセットがあることを確認します。詳細については、データセットをレプリケーションするをご覧ください。

割り当て

フェイルオーバー予約を構成する前に、セカンダリ リージョンで選択したコンピューティング容量を確保する必要があります。セカンダリ リージョンで利用可能な割り当てがない場合は、予約を構成できません。詳細については、割り当てと上限をご覧ください。

料金

マネージド障害復旧を構成するには、次の料金プランが必要です。

  • コンピューティング容量: Enterprise Plus エディションを購入する必要があります。

  • ターボ レプリケーション: 障害復旧は、レプリケーション中にターボ レプリケーションを利用します。課金は、物理バイト数とレプリケーションされた物理 GB 数に基づいて行われます。詳細については、Cloud Storage の料金をご覧ください。

  • ストレージ: セカンダリ リージョンのストレージ バイトには、プライマリ リージョンのストレージ バイトと同じ料金が請求されます。詳細については、ストレージの料金をご覧ください。

コンピューティング容量の料金が請求されるのは、プライマリ リージョンの容量に対してのみです。セカンダリ リージョンでは、(予約ベースラインに基づく)セカンダリ コンピューティング容量を追加料金なしで使用できます。予約がフェイルオーバーされていない限り、アイドル スロットはセカンダリ コンピューティング容量を使用できません。

セカンダリ リージョンでステイル読み取りを行う必要がある場合は、セカンダリ リージョンで追加の Enterprise コンピューティング容量を購入できます。

Enterprise Plus 予約を作成または変更する

データセットを予約に接続する前に、Enterprise Plus 予約を作成するか、既存の予約を変更して障害復旧用に構成する必要があります。

予約を作成する

次のいずれかの方法を選択します。

コンソール

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

    [BigQuery] に移動

  2. ナビゲーション メニューで、[容量管理]、[予約を作成] の順にクリックします。

  3. [予約名] フィールドに、予約の名前を入力します。

  4. [場所] リストで、ロケーションを選択します。

  5. [エディション] リストで、Enterprise Plus エディションを選択します。

  6. [最大予約サイズ セレクタ] リストで、最大予約サイズを選択します。

  7. 省略可: [ベースライン スロット数] フィールドに、予約用のベースライン スロット数を入力します。

    使用可能な自動スケーリング スロットの数は、[最大予約サイズ セレクタ] の値から [ベースライン スロット数] の値を引いた数になります。たとえば、ベースライン スロットを 100 個、最大予約サイズを 400 個として予約を作成した場合、その予約には 300 個の自動スケーリング スロットがあります。ベースライン スロットの詳細については、ベースライン スロットと自動スケーリング スロットとともに予約を使用するをご覧ください。

  8. [セカンダリ ロケーション] リストで、セカンダリ ロケーションを選択します。

  9. アイドル スロットの共有を無効にして、指定したスロット容量のみを使用するには、[アイドル スロットを無視する] トグルをクリックします。

  10. [詳細設定] セクションを開くには、 展開矢印をクリックします。

  11. 省略可: ターゲット ジョブの同時実行を設定するには、[自動のターゲット ジョブ同時実行をオーバーライドする] トグルをクリックしてオンに切り替えた後、[ターゲット ジョブ同時実行] の値を入力します。スロットの内訳が [費用予測] テーブルに表示され、予約の概要が [容量の概要] テーブルに表示されます。

  12. [保存] をクリックします。

新しい予約が [スロットの予約] タブに表示されます。

SQL

予約を作成するには、データ定義言語(DDL)ステートメントの CREATE RESERVATION を使用します。

  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 のロケーションを選択した場合、エディション オプションは Enterprise エディションに限定されます。
    • RESERVATION_NAME: 予約の名前。

      名前に使用できるのは英小文字、数字、ダッシュのみです。先頭と末尾は英小文字または数字にしてください。

    • NUMBER_OF_SLOTS: 予約に割り当てるスロットの数。コミットメントには、十分な数の未割り当てのスロットが必要です。slot_capacity オプションと edition オプションを同じ予約内で設定することはできません。
    • SECONDARY_LOCATION: 予約のセカンダリ ロケーション。リージョンが停止した場合は、この予約に接続されているすべてのデータセットがこのロケーションにフェイルオーバーします。

  3. [実行] をクリックします。

クエリの実行方法の詳細については、インタラクティブ クエリを実行するをご覧ください。

既存の予約を変更する

次のいずれかの方法を選択します。

コンソール

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

    [BigQuery] に移動

  2. ナビゲーション パネルで [容量管理] セクションに移動します。

  3. [スロットの予約] タブをクリックします。

  4. 更新する予約を見つけます。

  5. [アクション] オプションを開きます。

  6. [編集] をクリックします。

  7. [セカンダリ ロケーション] フィールドに、セカンダリ ロケーションを入力します。

  8. [保存] をクリックします。

SQL

予約のセカンダリ ロケーションを追加または変更するには、DDL ステートメントの ALTER RESERVATION SET OPTIONS を使用します。

  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

データセットを予約に接続するには、DDL ステートメントの ALTER SCHEMA SET OPTIONS を使用します。

  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

予約のセカンダリ ロケーションを追加または変更するには、DDL ステートメントの ALTER RESERVATION SET OPTIONS を使用して is_primaryTRUE に設定します。

  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"

次のクエリを実行すると、過去 7 日間のジョブのうち、データセットがフェイルオーバー データセットだった場合に失敗するジョブが返されます。

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: ロケーション

次のステップ