設定 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 中建立中繼資料表 (又稱「陰影資料表」),其中包含特定資料表上分片的最後一次寫入交易修訂時間戳記。

寫入作業會與主鍵的修訂時間戳記保持一致。

您可以將執行反向複製作業的 Dataflow 工作設定為下列任一模式:

  • 一般:這是預設模式。Dataflow 作業會從 Spanner 變更串流讀取事件,將事件轉換為與來源資料庫結構定義相容的資料類型,然後將這些事件套用至來源資料庫。作業會自動重試錯誤。重試次數用盡後,系統會將錯誤移至 Cloud Storage bucket 中無效信件佇列 (DLQ) 目錄的 severe 資料夾。這項工作也會將所有永久錯誤移至 severe 資料夾。

  • RetryDLQ:在此模式下,Dataflow 工作會從 DLQ 的 severe 資料夾讀取事件,然後重試。修正所有永久錯誤後,請執行這個模式。這個模式只會從 DLQ 讀取資料,不會從 Spanner 變更串流讀取資料。如果從 severe 資料夾處理的記錄移至 retry 資料夾,工作會重試這些記錄。

事前準備

  • 確認來源 MySQL 資料庫與Google Cloud 專案之間的網路連線,Dataflow 工作將在該專案中執行。

  • 在目的地 MySQL 執行個體上,將 Dataflow 工作站 IP 位址加入許可清單。

  • 確認 MySQL 憑證在 source shards file 中指定正確。

  • 確認 MySQL 執行個體已連上網路並正在執行。

  • 確認 MySQL 使用者在 MySQL 資料庫中具有 INSERTUPDATEDELETE 權限。

  • 確認您具備執行 Dataflow 彈性範本的必要 IAM 權限。詳情請參閱「建構及執行彈性範本」。

  • 確認通訊埠 12345 已開啟,可供 Dataflow 工作人員 VM 之間的通訊。

必要的角色

  • 為確保 Compute Engine 服務帳戶具備啟動反向複製作業的必要權限,請要求管理員在執行個體中,將下列 IAM 角色授予 Compute Engine 服務帳戶:

執行反向複製作業

如要執行反向複製,請按照下列步驟操作:

  1. 工作階段檔案上傳至 Cloud Storage bucket。

  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:Cloud Storage 中工作階段檔案的路徑,內含 Spanner 遷移工具的對應資訊。
    • filtrationMode:根據條件篩選記錄的方式。支援的模式為 noneforward_migration
    • shardingCustomJarPath:Cloud Storage 中自訂 JAR 檔案的位置 (路徑),該檔案包含擷取分片 ID 的邏輯。 預設為空白。
    • shardingCustomClassName:具有自訂分片 ID 實作項目的完整類別名稱。如果指定 shardingCustomJarPath,則必須填寫這個欄位。預設為空白。
    • shardingCustomParameters:字串,內含要傳遞至自訂分片類別的任何自訂參數。預設為空白。
    • sourceDbTimezoneOffset:來源資料庫與世界標準時間的時區偏移量。例如:+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:執行模式類型。選項為 regularretryDLQ。使用 retryDLQ 僅重試嚴重 DLQ 記錄。預設值:regular
    • dlqRetryMinutes:重試 DLQ 的間隔分鐘數。預設值為 10。
    • sourceType:要反向複製的來源資料庫類型。預設值:mysql
    • transformationJarPath:Cloud Storage 中自訂 JAR 檔案的位置 (路徑),該檔案含有自訂轉換邏輯,可處理反向複製中的記錄。預設為空白。
    • transformationClassName:具有自訂轉換邏輯的完整類別名稱。如果指定 transformationJarPath,則必須填寫這個欄位。預設為空白。
    • transformationCustomParameters:字串,內含要傳遞至自訂轉換類別的任何自訂參數。預設為空白。
    • filterEventsDirectoryName:系統在反向複製期間略過記錄時,會將記錄寫入這個目錄。預設值:skip

後續步驟