本文說明如何使用 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 遷移作業時使用。
您可以按照下列步驟執行即時資料遷移:
執行即時資料遷移作業需要部署及管理大量資源。Spanner 為每個即時資料遷移階段提供兩個範例 Terraform 範本。
即時遷移範本會分兩個階段執行 CDC 遷移作業:
- 使用 Datastream 設定 CDC 遷移作業,將資料遷移至 Cloud Storage bucket。 您可以使用 Terraform 變數,防止範本建立 Dataflow 工作。
- 使用 Dataflow 將 Cloud Storage 值區中的 CDC 遷移至 Spanner。只有在回填移轉 Terraform 範本完成回填移轉後,才能執行這個階段。
回填遷移 Terraform 範本會從來源 MySQL 執行個體執行回填遷移至 Spanner。
事前準備
- 確認本機殼層已安裝 Terraform。
- 建立服務帳戶,以便執行即時資料遷移作業。如要進一步瞭解如何建立服務帳戶,請參閱「建立服務帳戶」。
-
為確保服務帳戶具備執行即時遷移的必要權限,請要求管理員將專案的下列 IAM 角色授予服務帳戶:
-
Dataflow 管理員 (
roles/dataflow.admin
) -
Datastream 管理員 (
roles/datastream.admin
) -
安全性管理員 (
roles/iam.securityAdmin
) -
服務帳戶管理員 (
roles/serviceAccountAdmin
) -
Pub/Sub 管理員 (
roles/pubsub.admin
) -
儲存空間管理員 (
roles/storage.admin
) -
Compute 網路管理員 (
roles/compute.networkAdmin
) -
檢視者 (
roles/viewer
)
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
這些預先定義的角色具備執行即時遷移所需的權限。如要查看確切的必要權限,請展開「必要權限」部分:
所需權限
如要執行即時遷移,您必須具備下列權限:
-
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
-
Dataflow 管理員 (
設定 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 Cloudregion
: 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 範本:
使用下列指令初始化 Terraform:
terraform init
使用下列指令驗證 Terraform 檔案:
terraform plan --var-file=terraform_simple.tfvars
使用下列指令執行 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 範本
如要執行回填遷移作業,請按照下列步驟操作:
使用下列指令初始化 Terraform:
terraform init
使用下列指令驗證 Terraform 檔案:
terraform plan --var-file=terraform_simple.tfvars
使用下列指令執行 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