從 MySQL 即時遷移資料

本文說明如何使用 Terraform 部署 Dataflow 和 Datastream,從來源 MySQL 執行個體遷移即時資料至 Spanner,並盡量減少停機時間。

執行即時資料遷移作業後,如果您確信所有資料都已轉移、程式碼和依附元件已遷移,且測試已完成,即可將應用程式切換為使用 Spanner,而非來源 MySQL 資料庫。

建立目標 Spanner 資料庫後,即可執行即時資料遷移。遷移資料前,您必須在目標資料庫中建立相容的結構定義。

運作方式

即時資料遷移作業包含下列兩個階段:

  • 回填遷移

    • 在回填移轉期間,Dataflow 會從來源 MySQL 資料庫讀取現有資料,並將資料移轉至目標 Spanner 資料庫。您需要使用大量遷移 Dataflow 範本,將資料從來源 MySQL 執行個體移至 Spanner。
    • 如果回填遷移作業無法將資料列寫入 Spanner,系統會將該資料列寫入 Cloud Storage 值區中的無效信件佇列目錄。您可以讓回填遷移作業重試將這些資料列寫入 Spanner。
  • 變更資料擷取 (CDC) 遷移

    • 這個階段會與回填遷移作業同時執行,即時擷取來源 MySQL 執行個體發生的變更。回填遷移作業完成後,這些變更就會套用至 Spanner。
    • 您需要使用 Datastream 即時擷取來源 MySQL 執行個體發生的變更,並將這些變更寫入 Cloud Storage bucket。
    • 回填遷移作業完成後,您需要使用 Dataflow 將 CDC 從 Cloud Storage 值區移至 Spanner。如果 Dataflow 因故無法將資料列寫入 Spanner,就會將該資料列寫入另一個 Cloud Storage 值區的無法傳送郵件佇列目錄。CDC 遷移作業會自動重試將無效信件佇列目錄中的資料列寫入 Spanner。

規劃即時資料遷移

您需要設定網路基礎架構,讓資料在來源 MySQL 執行個體、Datastream、Dataflow、Cloud Storage 值區和目標 Spanner 資料庫之間流動。建議您設定私人網路連線,確保遷移作業安全無虞。 視貴機構的法規遵循需求而定,您可能需要設定公用或私人網路連線。如要進一步瞭解 Datastream 連線,請參閱「網路連線選項」。

如要規劃即時資料遷移作業,您可能需要貴機構的網路管理員執行下列工作:

  • 使用預設虛擬私有雲,或在專案中建立符合下列條件的新虛擬私有雲:
    • 來源 MySQL 執行個體必須位於這個 VPC 中。您可能需要在這個虛擬私有雲上建立輸出防火牆規則,並在來源 MySQL 執行個體所在的虛擬私有雲上建立輸入防火牆規則。
    • 這個 VPC 必須提供 Datastream、Dataflow、Cloud Storage 值區和目標 Spanner 資料庫。
    • 您必須在來源 MySQL 執行個體上建立允許清單,才能允許來自虛擬私有雲的連線。
  • 在虛擬私有雲中決定並分配 Datastream 可用的 IP 位址範圍。
  • 在虛擬私有雲中建立子網路,供 Dataflow 用於完成回填移轉作業。
  • 在虛擬私有雲中建立子網路,供 Dataflow 稍後完成 CDC 遷移作業時使用。

您可以按照下列步驟執行即時資料遷移:

  1. 設定 CDC 遷移作業
  2. 執行回填遷移作業
  3. 在回填遷移作業完成後,完成 CDC 遷移作業

執行即時資料遷移作業需要部署及管理大量資源。Spanner 為每個即時資料遷移階段提供兩個範例 Terraform 範本。

即時遷移範本會分兩個階段執行 CDC 遷移作業:

  • 使用 Datastream 設定 CDC 遷移作業,將資料遷移至 Cloud Storage bucket。 您可以使用 Terraform 變數,防止範本建立 Dataflow 工作。
  • 使用 Dataflow 將 Cloud Storage 值區中的 CDC 遷移至 Spanner。只有在回填移轉 Terraform 範本完成回填移轉後,才能執行這個階段。

回填遷移 Terraform 範本會從來源 MySQL 執行個體執行回填遷移至 Spanner。

事前準備

  • 確認本機殼層已安裝 Terraform。
  • 建立服務帳戶,以便執行即時資料遷移作業。如要進一步瞭解如何建立服務帳戶,請參閱「建立服務帳戶」。
  • 為確保服務帳戶具備執行即時遷移的必要權限,請要求管理員將專案的下列 IAM 角色授予服務帳戶:

    如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。

    這些預先定義的角色具備執行即時遷移所需的權限。如要查看確切的必要權限,請展開「必要權限」部分:

    所需權限

    如要執行即時遷移,您必須具備下列權限:

    • compute.globalAddresses.create
    • compute.globalAddresses.createInternal
    • compute.globalAddresses.createInternal
    • compute.globalAddresses.delete
    • compute.globalAddresses.deleteInternal
    • compute.globalAddresses.get
    • compute.globalOperations.get
    • compute.networks.addPeering
    • compute.networks.get
    • compute.networks.listPeeringRoutes
    • compute.networks.removePeering
    • compute.networks.use
    • compute.routes.get
    • compute.routes.list
    • compute.subnetworks.get
    • compute.subnetworks.list
    • dataflow.jobs.cancel
    • dataflow.jobs.create
    • dataflow.jobs.updateContents
    • datastream.connectionProfiles.create
    • datastream.connectionProfiles.delete
    • datastream.privateConnections.create
    • datastream.privateConnections.delete
    • datastream.streams.create
    • datastream.streams.delete
    • datastream.streams.update
    • iam.roles.get
    • iam.serviceAccounts.actAs
    • pubsub.subscriptions.create
    • pubsub.subscriptions.delete
    • pubsub.topics.attachSubscription
    • pubsub.topics.create
    • pubsub.topics.delete
    • pubsub.topics.getIamPolicy
    • pubsub.topics.setIamPolicy
    • resourcemanager.projects.setIamPolicy
    • storage.buckets.create
    • storage.buckets.delete
    • storage.buckets.update
    • storage.objects.delete

    管理員或許還可透過自訂角色或其他預先定義的角色,將這些權限授予服務帳戶。

設定 CDC 遷移作業

Spanner 提供 Terraform 範本,可設定 CDC,並完成後續的 CDC 遷移作業。您可以使用 Terraform 變數,禁止範本建立 Dataflow 工作。Terraform 範本會部署及管理下列資源,以設定 CDC 遷移作業:

  • Datastream 私人連線:Datastream 私人連線會部署在您設定的虛擬私有雲。

  • 來源 Datastream 連線設定檔:連線設定檔,可讓 Datastream 連線至來源 MySQL 執行個體。

  • Cloud Storage bucket:Datastream 會將資料寫入這個 Cloud Storage bucket。

  • 目標 Datastream 連線設定檔:這個連線設定檔可讓 Datastream 連線並寫入 Cloud Storage 值區。

  • Datastream 串流:從來源 MySQL 執行個體讀取資料,並根據連線設定檔定義,將資料寫入 Cloud Storage 值區的 Datastream 串流。

  • Pub/Sub 主題和訂閱項目:Cloud Storage 值區會將物件通知傳送至 Pub/Sub 主題,而 Dataflow 會使用 Pub/Sub 訂閱項目將資料寫入 Spanner。

  • Cloud Storage 值區通知:發布至 Pub/Sub 主題的 Cloud Storage 值區通知。

準備 CDC Terraform 設定

您可以準備 Terraform 範本,加入 Dataflow 變數設定,但停用 Dataflow 工作建立作業:

    common_params = {
      project = "PROJECT_ID"
      region  = "GCP_REGION"
    }
    datastream_params = {
      mysql_host = "MYSQL_HOST_IP_ADDRESS"
      mysql_username = "MYSQL_USERNAME"
      mysql_password = "MYSQL_PASSWORD"
      mysql_port     = 3306
      mysql_database = {
        database = "DATABASE_NAME"
      }
      private_connectivity = {
        vpc_name = "VPC_NAME"
        range = "RESERVED_RANGE"
      }
    }
    dataflow_params = {
      skip_dataflow = false
      enable_backfill = false
      template_params = {
        spanner_database_id = "SPANNER_DATABASE_ID"
        spanner_instance_id = "SPANNER_INSTANCE_ID"
      }
      runner_params = {
        max_workers = 10
        num_workers = 4
        on_delete   = "cancel"
        network     = "VPC_NETWORK"
        subnetwork  = "SUBNETWORK_NAME"
      }
    }
  

Terraform 變數說明如下:

  • project:專案 ID。 Google Cloud
  • region: Google Cloud 區域。
  • mysql_host:來源 MySQL 執行個體 IP 位址。
  • mysql_username:來源 MySQL 執行個體的使用者名稱。
  • mysql_password:來源 MySQL 執行個體密碼。
  • mysql_port:來源 MySQL 執行個體通訊埠號碼。
  • database:執行個體中的來源 MySQL 資料庫名稱。
  • vpc_name:Datastream 使用的現有 VPC 名稱。
  • range:您為 Datastream 保留的虛擬私有雲 IP 範圍。
  • skip_dataflow:將這個值設為 true,即可禁止 Dataflow 建立 Dataflow 工作。
  • enable_backfill:將這個值設為 false,即可禁止 Terraform 範本建立 Dataflow 工作。
  • spanner_database_id:目標 Spanner 資料庫 ID。
  • spanner_instance_id:目標 Spanner 執行個體 ID。
  • max_workers:決定 Dataflow 建立的工作站數量上限。
  • min_workers:決定 Dataflow 建立的工作站數量上限。
  • network:Dataflow 將使用的現有 VPC 名稱。
  • subnetwork:虛擬私有雲中指定子網路的名稱,Dataflow 可在其中建立工作站。

執行 CDC Terraform 範本

如要執行 CDC 遷移作業,請執行 Terraform 範本:

  1. 使用下列指令初始化 Terraform:

      terraform init
    

  2. 使用下列指令驗證 Terraform 檔案:

      terraform plan --var-file=terraform_simple.tfvars
    

  3. 使用下列指令執行 Terraform 設定:

      terraform apply --var-file=terraform_simple.tfvars
    

    Terraform 設定會產生類似以下的輸出內容:

    Outputs:
    resource_ids = {
      "datastream_source_connection_profile" = "source-mysql-thorough-wombat"
      "datastream_stream" = "mysql-stream-thorough-wombat"
      "datastream_target_connection_profile" = "target-gcs-thorough-wombat"
      "gcs_bucket" = "live-migration-thorough-wombat"
      "pubsub_subscription" = "live-migration-thorough-wombat-sub"
      "pubsub_topic" = "live-migration-thorough-wombat"
    }
    resource_urls = {
      "datastream_source_connection_profile" = "https://console.cloud.google.com/datastream/connection-profiles/locations/us-central1/instances/source-mysql-thorough-wombat?project=your-project-here"
      "datastream_stream" = "https://console.cloud.google.com/datastream/streams/locations/us-central1/instances/mysql-stream-thorough-wombat?project=your-project-here"
      "datastream_target_connection_profile" = "https://console.cloud.google.com/datastream/connection-profiles/locations/us-central1/instances/target-gcs-thorough-wombat?project=your-project-here"
      "gcs_bucket" = "https://console.cloud.google.com/storage/browser/live-migration-thorough-wombat?project=your-project-here"
      "pubsub_subscription" = "https://console.cloud.google.com/cloudpubsub/subscription/detail/live-migration-thorough-wombat-sub?project=your-project-here"
      "pubsub_topic" = "https://console.cloud.google.com/cloudpubsub/topic/detail/live-migration-thorough-wombat?project=your-project-here"
    }
    

Datastream 現在會將 CDC 串流至 Cloud Storage bucket。您必須執行回填遷移作業,並在稍後完成 CDC 遷移作業。

執行回填遷移作業

Spanner 提供 Terraform 範本,可執行回填遷移作業。Terraform 範本會部署及管理下列資源:

  • Dataflow 工作:從來源 MySQL 執行個體讀取資料,並寫入目標 Spanner 資料庫的 Dataflow 工作。

準備回填遷移作業的 Terraform 設定

    job_name = "JOB_NAME"
    project = "PROJECT_ID"
    region = "GCP_REGION"
    working_directory_bucket = "WORKING_DIRECTORY_BUCKET"
    working_directory_prefix = "WORKING_DIRECTORY_PREFIX"
    source_config_url = "SOURCE_CONFIG_URL"
    username = "USERNAME"
    password = "PASSWORD"
    instance_id = "SPANNER_INSTANCE_ID"
    database_id  = "SPANNER_DATABASE_ID"
    spanner_project_id = "SPANNER_PROJECT_ID"
  

Terraform 變數說明如下:

  • job_name:Dataflow 工作名稱。
  • project:Dataflow 工作需要執行的 Google Cloud 專案 ID。
  • region: Google Cloud 區域。
  • working_directory_bucket:用於上傳工作階段檔案及建立輸出目錄的 Cloud Storage 值區。
  • working_directory_prefix:Dataflow 工作目錄的 Cloud Storage 值區前置字元。
  • source_config_url:來源 MySQL 執行個體 IP 位址。
  • username:來源 MySQL 執行個體的使用者名稱。
  • password:來源 MySQL 執行個體密碼。
  • instance_id:目標 Spanner 執行個體 ID。
  • database_id:目標 Spanner 資料庫 ID。
  • spanner_project_id:Spanner 執行個體所在的專案 ID。這個專案 ID 可能與您執行 Dataflow 的專案不同。

執行回填遷移 Terraform 範本

如要執行回填遷移作業,請按照下列步驟操作:

  1. 使用下列指令初始化 Terraform:

      terraform init
    

  2. 使用下列指令驗證 Terraform 檔案:

      terraform plan --var-file=terraform_simple.tfvars
    

  3. 使用下列指令執行 Terraform 設定:

      terraform apply --var-file=terraform_simple.tfvars
    

    Terraform 設定會產生類似以下的輸出內容:

    Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
    Outputs:
    dataflow_job_id = [
      "2024-06-05_00_41_11-4759981257849547781",
    ]
    dataflow_job_url = [
      "https://console.cloud.google.com/dataflow/jobs/gcp-region/2024-06-05_00_41_11-4759981257849547781",
    ]
    

如果回填遷移作業無法將資料列寫入 Spanner,就會將該資料列寫入 Cloud Storage 值區中的無效信件佇列目錄。

在完成 CDC 遷移作業前,您可以從死信佇列目錄重試將這些資料列寫入 Spanner。

如要在完成 CDC 遷移前,將這些資料列從死信佇列目錄重新寫入 Spanner,請執行下列指令:

gcloud dataflow flex-template run JOB_NAME \
--region=GCP_REGION \
--template-file-gcs-location=gs://dataflow-templates/latest/flex/Cloud_Datastream_to_Spanner \
--additional-experiments=use_runner_v2 \
--parameters inputFilePattern=inputFilePattern,streamName="ignore", \
--datastreamSourceType=SOURCE_TYPE\
instanceId=INSTANCE_ID,databaseId=DATABASE_ID,sessionFilePath=SESSION_FILE_PATH, \
deadLetterQueueDirectory=DLQ_DIRECTORY,runMode="retryDLQ"

gcloud CLI 指令變數說明如下:

  • job_name:Dataflow 工作名稱。
  • region: Google Cloud 區域。
  • inputFilePattern:輸入檔案模式的 Cloud Storage 值區位置。
  • datastreamSourceType:來源類型,例如 MySQL。
  • instanceId:目標 Spanner 執行個體 ID。
  • databaseId:目標 Spanner 資料庫 ID。
  • sessionFilePath:工作階段檔案的 Cloud Storage 值區路徑。
  • deadLetterQueueDirectory:DLQ 目錄的 Cloud Storage bucket 路徑。

完成 CDC 遷移作業

回填遷移作業完成後,您可以使用 Dataflow 將 CDC 遷移至 Spanner。Dataflow 工作會從 Cloud Storage 值區擷取變更事件,並將這些事件寫入 Spanner。

將 Cloud Storage 值區中的資料寫入 Spanner 後,請停止在來源 MySQL 執行個體上寫入資料,讓剩餘的變更寫入 Spanner。

Spanner 趕上來源 MySQL 執行個體時,會造成短暫停機。所有變更都寫入 Spanner 後,應用程式即可開始使用 Spanner 做為資料庫。

如要完成 CDC 遷移作業,請將 skip_dataflow Terraform 參數的值變更為 false,然後重新執行即時遷移 Terraform 範本

使用下列指令執行 Terraform 設定:

      terraform apply --var-file=terraform_simple.tfvars
    

後續步驟