MySQL のフォールバックを構成する

このページでは、リバース レプリケーションを使用して MySQL のフォールバックを設定する方法について説明します。フォールバックとは、Spanner で問題が発生した場合にソースの MySQL データベースに戻すための予備計画を指します。

リバース レプリケーションは、予期しない問題が発生し、サービスを中断せずに元の MySQL データベースにフォールバックする必要がある場合に便利です。リバース レプリケーションを使用すると、Spanner に書き込まれたデータをソースの MySQL データベースにレプリケートしてフォールバックできます。これにより、両方のデータベースの結果整合性が維持されます。

リバース レプリケーション フローは、Spanner_to_SourceDb Dataflow テンプレートによって実行される次のステップで構成されます。

  1. Spanner 変更ストリームを使用して Spanner から変更を読み取る。

  2. フィルタリング モードが forward_migration であることを確認する。

  3. Spanner 移行ツールを使用して、Spanner データを変換し、移行元のデータベース スキーマとの互換性を維持する。詳細については、カスタム変換をご覧ください。

  4. 指定された主キーの新しいデータがソース データベースにすでに含まれているかどうか確認する。

  5. データをソース データベースに書き込む。

Spanner_to_SourceDb Dataflow テンプレートを使用する

Dataflow テンプレートは、主キーレベルで整合性を確保します。このテンプレートは、Spanner にメタデータ テーブル(シャドウ テーブル)を作成します。このテーブルには、特定のテーブルのシャードに対する最後の書き込みトランザクションの commit タイムスタンプが含まれています。

書き込みは、主キーの commit タイムスタンプまで一貫しています。

リバース レプリケーションを実行する Dataflow ジョブは、次のいずれかのモードで実行するように構成できます。

  • 通常: デフォルト モードです。Dataflow ジョブは、Spanner 変更ストリームからイベントを読み取り、ソースのデータベース スキーマと互換性のあるデータ型に変換して、ソース データベースに適用します。ジョブはエラーを自動的に再試行します。再試行が完了すると、エラーは Cloud Storage バケットのデッドレター キュー(DLQ)ディレクトリの severe フォルダに移動されます。また、すべての永続エラーが severe フォルダに移動されます。

  • RetryDLQ: このモードでは、Dataflow ジョブは DLQ の severe フォルダからイベントを読み取り、再試行します。このモードは、すべての永続エラーを修正した後に実行します。このモードでは、DLQ からのみ読み取ります。Spanner 変更ストリームからは読み取りません。severe フォルダから処理されたレコードが retry フォルダに移動されると、ジョブはそれらのレコードを再試行します。

始める前に

  • ソース MySQL データベースと、Dataflow ジョブが実行されるGoogle Cloud プロジェクト間のネットワーク接続を確保します。

  • 宛先の MySQL インスタンスで Dataflow ワーカーの IP アドレスを許可リストに登録します。

  • MySQL 認証情報が source shards file で正しく指定されていることを確認します。

  • MySQL インスタンスがオンラインで実行されていることを確認します。

  • MySQL ユーザーに MySQL データベースに対する INSERTUPDATEDELETE の権限があることを確認します。

  • Dataflow Flex テンプレートを実行するために必要な IAM 権限があることを確認します。詳細については、Flex テンプレートをビルドして実行するをご覧ください。

  • Dataflow ワーカー VM 間の通信用にポート 12345 が開いていることを確認します。

必要なロール

  • コンピューティング エンジン サービス アカウントにリバース レプリケーションを開始するために必要な権限があることを確認するには、インスタンスに対する次の IAM ロールをコンピューティング エンジン サービス アカウントに付与するよう管理者に依頼してください。

リバース レプリケーションを実行する

リバース レプリケーションの実行手順は次のとおりです。

  1. セッション ファイルを Cloud Storage バケットにアップロードします。

  2. DLQ ディレクトリの retry フォルダの Pub/Sub 通知を作成します。これを行うには、そのトピックの Pub/Sub トピックPub/Sub サブスクリプションを作成します。

  3. Dataflow テンプレートをビルドしてステージングします。詳細については、テンプレートの作成をご覧ください。

  4. 次の Google Cloud CLI コマンドを使用して、リバース レプリケーションの Dataflow テンプレートを実行します。

      gcloud dataflow flex-template run "spanner-to-sourcedb-job" \
      --project "PROJECT" \
      --region "REGION" \
      --template-file-gcs-location "TEMPLATE_SPEC_GCSPATH" \
      --parameters "changeStreamName=CHANGE_STREAM_NAME" \
      --parameters "instanceId=INSTANCE_ID" \
      --parameters "databaseId=DATABASE_ID" \
      --parameters "spannerProjectId=SPANNER_PROJECT_ID" \
      --parameters "metadataInstance=METADATA_INSTANCE" \
      --parameters "metadataDatabase=METADATA_DATABASE" \
      --parameters "sourceShardsFilePath=SOURCE_SHARDS_FILE_PATH" \
      --parameters "startTimestamp=START_TIMESTAMP" \
      --parameters "endTimestamp=END_TIMESTAMP" \
      --parameters "shadowTablePrefix=SHADOW_TABLE_PREFIX" \
      [--parameters "sessionFilePath=SESSION_FILE_PATH"] \
      [--parameters "filtrationMode=FILTRATION_MODE"] \
      [--parameters "shardingCustomJarPath=SHARDING_CUSTOM_JAR_PATH"] \
      [--parameters "shardingCustomClassName=SHARDING_CUSTOM_CLASS_NAME"] \
      [--parameters "shardingCustomParameters=SHARDING_CUSTOM_PARAMETERS"] \
      [--parameters "sourceDbTimezoneOffset=SOURCE_DB_TIMEZONE_OFFSET"] \
      [--parameters "dlqGcsPubSubSubscription=DLQ_GCS_PUB_SUB_SUBSCRIPTION"] \
      [--parameters "skipDirectoryName=SKIP_DIRECTORY_NAME"] \
      [--parameters "maxShardConnections=MAX_SHARD_CONNECTIONS"] \
      [--parameters "deadLetterQueueDirectory=DEAD_LETTER_QUEUE_DIRECTORY"] \
      [--parameters "dlqMaxRetryCount=DLQ_MAX_RETRY_COUNT"] \
      [--parameters "runMode=RUN_MODE"] \
      [--parameters "dlqRetryMinutes=DLQ_RETRY_MINUTES"] \
      [--parameters "sourceType=SOURCE_TYPE"] \
      [--parameters "transformationJarPath=TRANSFORMATION_JAR_PATH"] \
      [--parameters "transformationClassName=TRANSFORMATION_CLASS_NAME"] \
      [--parameters "transformationCustomParameters=TRANSFORMATION_CUSTOM_PARAMETERS"] \
      [--parameters "filterEventsDirectoryName=FILTER_EVENTS_DIRECTORY_NAME"]
    

    必須の変数は次のとおりです。

    • project: Google Cloud プロジェクト ID。
    • region: Google Cloud のリージョン。
    • template-file-gcs-location: Dataflow テンプレートをステージングした Cloud Storage ファイルのパス。
    • changeStreamName: ジョブが読み取る Spanner 変更ストリームの名前。
    • instanceId: Spanner インスタンス ID
    • databaseId: Spanner データベース ID
    • spannerProjectId: Spanner インスタンスが存在するプロジェクト ID。
    • metadataInstance: コネクタが変更ストリーム API データの使用量を制御するために使用するメタデータを保存するインスタンス。
    • metadataDatabase: コネクタが変更ストリーム API データの使用量を制御するために使用するメタデータを保存するデータベース。
    • sourceShardsFilePath: ソースシャードの接続プロファイル情報を含む Cloud Storage ファイルのパス。

    オプション変数は次のとおりです。

    • startTimestamp: 変更の読み取りを開始するタイムスタンプ。デフォルトは空です。
    • endTimestamp: 変更を読み取るタイムスタンプ。タイムスタンプを指定しない場合、プロセスは変更を無期限に読み取ります。デフォルトは空です。
    • shadowTablePrefix: シャドウ テーブルの命名に使用する接頭辞。デフォルトは shadow_ です。
    • sessionFilePath: Spanner 移行ツールのマッピング情報を含む Cloud Storage 内のセッション ファイルのパス。
    • filtrationMode: 条件に基づいてレコードをフィルタリングする方法を決定するモード。サポートされているモードは none または forward_migration です。
    • shardingCustomJarPath: シャード ID を取得するロジックを含むカスタム JAR ファイルの Cloud Storage 内の場所(パス)。デフォルトは空です。
    • shardingCustomClassName: カスタム シャード ID の実装を含む完全修飾クラス名。shardingCustomJarPath が指定されている場合、このフィールドは必須です。デフォルトは空です。
    • shardingCustomParameters: カスタム シャーディング クラスに渡すカスタム パラメータが含まれる文字列。デフォルトは空です。
    • sourceDbTimezoneOffset: ソース データベースのタイムゾーン(UTC からのオフセット)。例: +10:00。デフォルト: +00:00。
    • dlqGcsPubSubSubscription: regular モードで実行されている場合に、DLQ 再試行ディレクトリ用の Cloud Storage 通知ポリシーで使用される Pub/Sub サブスクリプション。名前は projects/<PROJECT_ID>/subscriptions/<SUBSCRIPTION_ID> の形式で指定します。このパラメータを設定すると、システムは deadLetterQueueDirectorydlqRetryMinutes を無視します。
    • skipDirectoryName: リバース レプリケーション中にスキップしたレコードが書き込まれるディレクトリ。デフォルト: skip
    • maxShardConnections: シャードごとに許可される最大接続数。デフォルト: 10000。
    • deadLetterQueueDirectory: DLQ 出力を保存するパス。デフォルトは、Dataflow ジョブの一時保存場所の下のディレクトリです。
    • dlqMaxRetryCount: システムが DLQ を介して一時的なエラーを再試行する最大回数。デフォルト: 500。
    • runMode: 実行モードのタイプ。regular または retryDLQ を指定できます。重大な DLQ レコードのみを再試行するには、retryDLQ を使用します。デフォルト: regular
    • dlqRetryMinutes: DLQ の再試行間隔(分)。デフォルト: 10。
    • sourceType: リバース レプリケーションの宛先となるソース データベースのタイプ。デフォルト: mysql
    • transformationJarPath: リバース レプリケーションでレコードを処理するカスタム変換ロジックを含むカスタム JAR ファイルの Cloud Storage 内の場所(パス)。デフォルトは空です。
    • transformationClassName: カスタム変換ロジックを含む完全修飾クラス名。transformationJarPath が指定されている場合、このフィールドは必須です。デフォルトは空です。
    • transformationCustomParameters: カスタム変換クラスに渡すカスタム パラメータが含まれる文字列。デフォルトは空です。
    • filterEventsDirectoryName: リバース レプリケーション中にスキップしたレコードが書き込まれるディレクトリ。デフォルト: skip

次のステップ