このページでは、リバース レプリケーションを使用して MySQL のフォールバックを設定する方法について説明します。フォールバックとは、Spanner で問題が発生した場合にソースの MySQL データベースに戻すための予備計画を指します。
リバース レプリケーションは、予期しない問題が発生し、サービスを中断せずに元の MySQL データベースにフォールバックする必要がある場合に便利です。リバース レプリケーションを使用すると、Spanner に書き込まれたデータをソースの MySQL データベースにレプリケートしてフォールバックできます。これにより、両方のデータベースの結果整合性が維持されます。
リバース レプリケーション フローは、Spanner_to_SourceDb Dataflow テンプレートによって実行される次のステップで構成されます。
Spanner 変更ストリームを使用して Spanner から変更を読み取る。
フィルタリング モードが
forward_migrationであることを確認する。Spanner 移行ツールを使用して、Spanner データを変換し、移行元のデータベース スキーマとの互換性を維持する。詳細については、カスタム変換をご覧ください。
指定された主キーの新しいデータがソース データベースにすでに含まれているかどうか確認する。
データをソース データベースに書き込む。
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 データベースに対する
INSERT、UPDATE、DELETEの権限があることを確認します。Dataflow Flex テンプレートを実行するために必要な IAM 権限があることを確認します。詳細については、Flex テンプレートをビルドして実行するをご覧ください。
Dataflow ワーカー VM 間の通信用にポート
12345が開いていることを確認します。
必要なロール
-
リバース レプリケーションの起動に必要な権限を取得するには、インスタンスに対する次の IAM ロールの付与を管理者に依頼してください。
-
Cloud Spanner データベース ユーザー(
roles/spanner.databaseUser) -
Dataflow デベロッパー(
roles/dataflow.developer)
-
Cloud Spanner データベース ユーザー(
-
コンピューティング エンジン サービス アカウントにリバース レプリケーションを開始するために必要な権限があることを確認するには、インスタンスに対する次の IAM ロールをコンピューティング エンジン サービス アカウントに付与するよう管理者に依頼してください。
-
Cloud Spanner データベース ユーザー(
roles/spanner.databaseUser) -
Secret Manager のシークレット アクセサー(
roles/secretmanager.secretAccessor) -
Secret Manager の閲覧者(
roles/secretmanager.viewer)
-
Cloud Spanner データベース ユーザー(
リバース レプリケーションを実行する
リバース レプリケーションの実行手順は次のとおりです。
セッション ファイルを Cloud Storage バケットにアップロードします。
DLQ ディレクトリの
retryフォルダの Pub/Sub 通知を作成します。これを行うには、そのトピックの Pub/Sub トピックと Pub/Sub サブスクリプションを作成します。Dataflow テンプレートをビルドしてステージングします。詳細については、テンプレートの作成をご覧ください。
次の 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 インスタンス IDdatabaseId: Spanner データベース IDspannerProjectId: 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>の形式で指定します。このパラメータを設定すると、システムはdeadLetterQueueDirectoryとdlqRetryMinutesを無視します。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。