アカウントオブジェクトのフェールオーバー

このトピックでは、障害復旧のために、異なる リージョン の複数のアカウントオブジェクトに複製されたデータベースをフェールオーバーするために必要なステップについて説明します。

フェールオーバーメカニズムの目的と使用時期については、 ビジネス継続性と障害復旧の概要 をご参照ください。

Prerequisites

  1. 同じ組織内の一連のアカウントで、1つのクラウドサービスプロバイダーの複数のリージョン間での、または異なるクラウドサービスプロバイダー間での、複製を有効にします。

  2. 複製するオブジェクトの種類を定義し、複製先のターゲットアカウントを指定する、プライマリフェールオーバーグループを作成します。たとえば、一部のデータベースを他のデータベースよりも頻繁に複製する必要がある場合などには、複製されたオブジェクトを複数のフェールオーバーグループに分割することができます。

  3. Create at least one secondary failover group (replica) of each primary failover group in one or more secondary accounts.

  4. フェールオーバーグループ内のオブジェクトに対する最新の更新で、各レプリカをリフレッシュ(同期)します。初期リフレッシュを実行し、各セカンダリアカウントに最新の変更を定期的に反映するスケジュールを設定します。

For instructions, see アカウントオブジェクトとデータベースの複製.

ソースアカウントとして使用するターゲットアカウントの昇格

Snowsight または SQL を使用して、ターゲットアカウントをソースアカウントに昇格させることができます(フェールオーバー)。

For more information about the kinds of objects you can specify in a failover group, see 複製グループとフェールオーバーグループ.

Promote a target account to serve as the source account using Snowsight

注釈

Only account administrators can edit a replication or failover group using Snowsight (see 複製設定にSnowsightを使用する場合の制限事項).

最も一貫性のある信頼性の高いフェールオーバーエクスペリエンスを得るには、該当するすべてのフェールオーバーグループと接続を選択し、すべてを同時に昇格させます。この操作を 一括フェールオーバー と呼びます。

To promote a target account to serve as the source account using Snowsight, follow these steps:

  1. Snowsight にサインインします。 確実にターゲットアカウントを使用してサインインしてください 。.

  2. ナビゲーションメニューで Admin » Accounts を選択します。

  3. Replication を選択してから、 Initiate failover を選択します。これを行うと、残りの選択を行うダイアログが表示されます。

  4. 昇格するフェールオーバーグループを選択します。 フェールオーバー後、それらのフェールオーバーグループで指定されたオブジェクトは、新しく昇格したプライマリアカウントで書き込み可能になります。これらのオブジェクトは、以前はプライマリアカウントで現在はセカンダリアカウントであるアカウントでは読み取り専用になります。

  5. Next を選択します。

  6. 昇格する接続を選択します。フェールオーバー後、これらの接続は新しいプライマリアカウントとして昇格したアカウントに接続します。

  7. Next を選択します。

  8. Select Fail over in the confirmation window.

  9. 選択したフェールオーバーグループでリフレッシュ操作が進行中の場合は、それらのリフレッシュが完了するのを待つか、フェールオーバーが緊急で優先する必要がある場合は、別のアプローチを選択できます。

    デフォルトのアクションは、リフレッシュが完了するのを待つことです。そうすることで、一括フェールオーバーの実行時にプライマリシステムとセカンダリシステムがすべて一貫した状態になります。Snowflakeは、現在選択されているウェアハウスを使用して、進行中のリフレッシュのステータスをポーリングします。選択したウェアハウスがない場合は、 Select warehouse オプションを使用してここで選択します。

    または、 Show advanced options を選択すると、すぐにフェールオーバーを続行できます。

    • 現在リフレッシュされていないフェールオーバーグループのみをフェールオーバーするには、 Exit with current progress を選択します。その場合は、一括フェールオーバー中にスキップされたグループに対して、後で追加のリフレッシュを実行します。

    • リフレッシュ操作をキャンセルしてフェールオーバーを続行するには、 Cancel refreshes and force failover を選択します。その場合、中断されたリフレッシュからセカンダリシステムの不整合をクリーンアップする必要がある可能性があります。

すべてのフェールオーバーグループに対してフェールオーバー操作が完了しなかった場合は、別の一括フェールオーバーを実行できます。または、 Promote a single failover group to serve as the primary using Snowsight のプロシージャを使用して、残りのフェールオーバーグループを1つずつフェールオーバーすることもできます。

Promote a single failover group to serve as the primary using Snowsight

注釈

Only account administrators can edit a replication or failover group using Snowsight (see 複製設定にSnowsightを使用する場合の制限事項).

Snowsight を使用して、単一のフェールオーバーグループをプライマリに昇格させるには、次のステップに従います。

  1. Snowsight にサインインします。 確実にターゲットアカウントを使用してサインインしてください 。.

  2. ナビゲーションメニューで Admin » Accounts を選択します。

  3. Replication を選択してから、 Groups を選択します。

  4. 昇格させたいフェールオーバーグループを探し、行の最後の列にある More メニュー(...)を選択します。

  5. Fail over を選択し、確認ウィンドウで Fail over を選択します。

Tip

通常、このプロシージャは、1つのグループのフェールオーバーで問題が発生し、そのグループのフェールオーバーのみを再試行する必要がある場合に使用します。アカウント全体をプライマリに昇格させるには、複数のフェールオーバーグループと接続を選択し、一括フェールオーバーを実行します。詳細については、 Promote a target account to serve as the source account using Snowsight をご参照ください。

SQL を使用した、ソースアカウントとして使用するターゲットアカウントの昇格

To promote a target account to serve as the source account using SQL, you sign in to the target account and execute the ALTER FAILOVER GROUP ... PRIMARY command.

セカンダリフェールオーバーグループをプライマリフェールオーバーグループに昇格する

注釈

このセクションの例は、FAILOVER権限を持つロールによって実行する必要があります。

次の例では、現在の myorg 組織の myaccount2 を、フェールオーバーグループで指定されたオブジェクトの複製用ソースアカウントとして機能するように昇格します。

  1. ターゲットアカウント myaccount2 にサインインします。

  2. アカウント内のフェールオーバーグループを一覧表示します。

    SHOW FAILOVER GROUPS;
    
    Copy
  3. プライマリフェールオーバーグループとして機能するように昇格させたい各セカンダリフェールオーバーグループに対して、以下のステートメントを実行します。

    ALTER FAILOVER GROUP myfg PRIMARY;
    
    Copy

    注釈

    ソースリージョンで部分的な停止が発生しても、複製サービスは引き続き利用可能であり、ターゲットリージョンのセカンダリフェールオーバーグループをリフレッシュし続ける可能性があります。

    データの整合性を確保するため、Snowflakeはリフレッシュ操作が進行中の場合、フェールオーバーを防止します。つまり、セカンダリフェールオーバーグループが複製操作によってリフレッシュされている場合は、プライマリとして機能するようにセカンダリフェールオーバグループを昇格させることはできません。この場合、ALTER FAILOVER GROUP ... PRIMARY コマンドはエラーを返します。

進行中のリフレッシュ操作によるフェールオーバーステートメントの失敗の解決

昇格しようとしているセカンダリフェールオーバーグループに対して進行中のリフレッシュ操作がある場合、フェールオーバーステートメントでは以下のエラーが発生します。

Replication group "<GROUP_NAME>" cannot currently be set as primary because it is being
refreshed. Either wait for the refresh to finish or cancel the refresh and try again.

フェールオーバーを成功させるには、以下のステップを完了する必要があります。

  1. 以下のオプションのいずれかを選択し、完了します。

    重要

    SECONDARY_DOWNLOADING_METADATA または SECONDARY_DOWNLOADING_DATA フェーズでリフレッシュ操作を中断すると、ターゲットアカウントの状態が一貫しなくなることがあります。詳細については、 進行中のリフレッシュ操作の現在のフェーズの表示 をご参照ください。

    1. フェールオーバーグループの今後のリフレッシュ操作を中断します。進行中のリフレッシュ操作がある場合は、フェールオーバーする前にその操作が完了するまで待つ必要があります。

      ALTER FAILOVER GROUP myfg SUSPEND;
      
      Copy
    2. 今後のリフレッシュ操作を中断し、 また 現在進行中のスケジュールされたリフレッシュ操作(もしある場合)をキャンセルします。

      進行中のリフレッシュ操作が手動でトリガーされた場合は、 自動的にスケジュールされなかった、進行中のリフレッシュ操作をキャンセルします。 をご参照ください。

      ALTER FAILOVER GROUP myfg SUSPEND IMMEDIATE;
      
      Copy

      注釈

      ステートメントがリターンする時間と、リフレッシュ操作のキャンセルが終了する時間の間に、若干の遅延が発生する可能性があります。

  2. フェールオーバーグループ myfg のリフレッシュ操作が進行中でないことを確認します。次のクエリは結果を返しません:

    SELECT phase_name, start_time, job_uuid
      FROM TABLE(INFORMATION_SCHEMA.REPLICATION_GROUP_REFRESH_HISTORY('myfg'))
      WHERE phase_name <> 'COMPLETED' and phase_name <> 'CANCELED';
    
    Copy

    フェールオーバーグループ myfg のリフレッシュ操作のキャンセルを確認するには、以下のステートメントを実行します。

    SELECT phase_name, start_time, job_uuid
      FROM TABLE(INFORMATION_SCHEMA.REPLICATION_GROUP_REFRESH_HISTORY('myfg'))
      WHERE phase_name = 'CANCELED';
    
    Copy
  3. これで、セカンダリフェールオーバーグループ(myfg)をプライマリフェールオーバーグループに昇格できます。

    ALTER FAILOVER GROUP myfg PRIMARY;
    
    Copy

ターゲットアカウントでスケジュールされた複製を再開する

フェールオーバー時に、すべてのセカンダリフェールオーバーグループでスケジュールされた更新が中断されます。自動更新を再開するには、セカンダリフェールオーバーグループのある各 ターゲットアカウント で、 ALTER FAILOVER GROUP ... RESUME を実行する必要があります。

ALTER FAILOVER GROUP myfg RESUME;
Copy

進行中のリフレッシュ操作の現在のフェーズの表示

リフレッシュ操作は、リフレッシュ操作のほとんどの段階で安全にキャンセルすることができます。ただし、 SECONDARY_DOWNLOADING_METADATA または SECONDARY_DOWNLOADING_DATA フェーズでリフレッシュ操作をキャンセルすると、ターゲットアカウントの状態が一貫しなくなる可能性があります。 リフレッシュ操作がこれらのフェーズのいずれかを開始した場合、ソースアカウントの可用性に関係なく、完了まで進みます。フェールオーバーする前にフェーズを完了させることで、レプリカが一貫した状態になるようにします。レプリカが一貫性のある状態になったら、インジェストおよび変換パイプラインを再開または再生して、レプリカを現在の状態に更新できます。

フェールオーバーグループの進行中のリフレッシュ操作の現在のフェーズを表示するには、Information Schema REPLICATION_GROUP_REFRESH_PROGRESS, REPLICATION_GROUP_REFRESH_PROGRESS_BY_JOB, REPLICATION_GROUP_REFRESH_PROGRESS_ALL テーブル関数を使用します。

例えば、フェールオーバーグループ myfg の進行中のリフレッシュ操作の現在のフェーズを表示するには、以下の文を実行します。

SELECT phase_name, start_time, end_time
  FROM TABLE(
    INFORMATION_SCHEMA.REPLICATION_GROUP_REFRESH_PROGRESS('myfg')
  );
Copy

リフレッシュ操作のフェーズのリストについては、その関数の 使用上の注意 をご参照ください。

自動的にスケジュールされなかった、進行中のリフレッシュ操作をキャンセルします。

複製スケジュールによって自動的にトリガーされなかった進行中のリフレッシュ操作をキャンセルするには、 SYSTEM$CANCEL_QUERY 関数を使用する必要があります。

  1. 以下のオプションのいずれかを使用して、リフレッシュ処理を実行するクエリIDまたはJOB_UUIDを検索します。

    1. 実行中のすべてのリフレッシュ操作のクエリIDsを検索します。

      SELECT query_id, query_text
        FROM TABLE(INFORMATION_SCHEMA.QUERY_HISTORY())
        WHERE query_type = 'REFRESH REPLICATION GROUP'
        AND execution_status = 'RUNNING'
        ORDER BY start_time;
      
      Copy

      QUERY_TEXT列を使用して、リストからフェールオーバーグループのリフレッシュ操作用のQUERY_IDを識別します。

    2. 特定のフェールオーバーグループ myfg の進行中のリフレッシュ操作の JOB_UUID を検索します。

      SELECT phase_name, start_time, job_uuid
        FROM TABLE(INFORMATION_SCHEMA.REPLICATION_GROUP_REFRESH_HISTORY('myfg'))
        WHERE phase_name <> 'COMPLETED' and phase_name <> 'CANCELED';
      
      Copy
  2. SYSTEM$CANCEL_QUERY 関数と QUERY_ID または JOB_UUID を使用して、リフレッシュ操作をキャンセルします。

    SELECT SYSTEM$CANCEL_QUERY('<QUERY_ID | JOB_UUID>');
    
    Copy

    次の出力を返します。

    query [<QUERY_ID>] terminated.
    
  3. 進行中のリフレッシュ操作をキャンセルしたら、 次のステップ に進みます。

Snowpipe Streamingのためのアクティブチャネルを新しく昇格したソースアカウントで再度開く

Snowpipe Streamingによって 投入されたプライマリデータベースのテーブルは、セカンダリデータベースに複製されます。フェールオーバー後、テーブルのアクティブなSnowpipe Streamingチャネルを再度開き、チャネルの不足しているデータ行を再挿入します。

  1. openChannel API を呼び出して、テーブルのアクティブチャネルを再度開きます。

  2. オフセットトークンをフェッチします。

    1. getLatestCommittedOffsetToken API を呼び出す、 または

    2. SHOW CHANNELS コマンドを実行し、テーブルのアクティブチャネルのリストを取得します。

  3. フェッチしたオフセットトークンからチャネルのデータ行を再挿入します。

注釈

これらの手順は、Snowflake Ingest SDK を使用したSnowpipe Streamingにのみ適用され、Kafkaコネクタを使用したSnowpipe Streamingには適用されません。フェールオーバー後にKafkaコネクタを再起動するには、 以下の手順 に従います。

Snowpipe StreamingとKafkaコネクタ

KafkaコネクタとSnowpipe Streamingを使用している場合は、フェールオーバー後に以下のステップに従います。

  1. Kafkaコネクタの構成を更新して、新しく昇格したソースアカウントをポイントするようにします。

  2. SHOW CHANNELS コマンドを実行して、アクティブチャネルのリストとオフセットトークンを取得します。各チャネルはKafkaトピックの単一のパーティションに属します。

  3. これらの各パーティション(チャネル)用に、Kafkaトピックでオフセットを手動でリセットします。

  4. Kafkaコネクタを再起動します。

For more information, see: