Questo documento spiega come eseguire una migrazione live dei dati da un'istanza MySQL di origine a Spanner con tempi di inattività minimi utilizzando Terraform per eseguire il deployment di Dataflow e Datastream.
Dopo aver eseguito la migrazione live dei dati e aver verificato che tutti i dati siano stati trasferiti, che il codice e le dipendenze siano stati migrati e che i test siano stati completati, puoi passare all'utilizzo di Spanner anziché del database MySQL di origine per la tua applicazione.
Puoi eseguire una migrazione live dei dati dopo aver creato il database Spanner di destinazione. Prima di eseguire la migrazione dei dati, devi creare uno schema compatibile nel database di destinazione.
Come funziona
La migrazione live dei dati è composta dalle due fasi seguenti:
Migrazione di backfill:
- Durante la migrazione di backfill, Dataflow legge i dati esistenti dal database MySQL di origine ed esegue la migrazione dei dati al database Spanner di destinazione. Devi utilizzare un modello Dataflow di migrazione bulk per spostare i dati dall'istanza MySQL di origine a Spanner.
- Quando la migrazione di backfill non riesce a scrivere una riga in Spanner, la scrive in una directory della coda di messaggi non recapitabili in un bucket Cloud Storage. Puoi fare in modo che la migrazione di backfill riprovi a scrivere queste righe in Spanner.
Migrazione Change Data Capture (CDC):
- Questa fase viene eseguita contemporaneamente alla migrazione di backfill, acquisendo in tempo reale le modifiche che si verificano nell'istanza MySQL di origine. Queste modifiche vengono quindi applicate a Spanner al termine della migrazione di backfill.
- Devi utilizzare Datastream per acquisire in tempo reale le modifiche che si verificano nell'istanza MySQL di origine e scriverle in un bucket Cloud Storage.
- Al termine della migrazione di backfill, devi utilizzare Dataflow per spostare il CDC dal bucket Cloud Storage a Spanner. Se Dataflow non riesce a scrivere una riga in Spanner per qualsiasi motivo, la scrive in una directory della coda di messaggi non recapitabili in un bucket Cloud Storage diverso. La migrazione CDC riprova automaticamente a scrivere le righe dalla directory della coda di messaggi non recapitabili a Spanner.
Pianificare la migrazione live dei dati
Devi configurare l'infrastruttura di rete necessaria per il flusso di dati tra l'istanza MySQL di origine, Datastream, Dataflow, i bucket Cloud Storage e il database Spanner di destinazione. Per una migrazione sicura, ti consigliamo di configurare la connettività di rete privata. A seconda dei requisiti di conformità della tua organizzazione, potresti dover configurare la connettività di rete pubblica o privata. Per ulteriori informazioni sulla connettività di Datastream, consulta Opzioni di connettività di rete.
Per pianificare la migrazione live dei dati, potresti aver bisogno dell'amministratore di rete della tua organizzazione per eseguire le seguenti attività:
- Utilizza il VPC predefinito o crea un nuovo VPC nel tuo progetto con i seguenti requisiti:
- L'istanza MySQL di origine deve essere disponibile in questo VPC. Potresti dover creare una regola firewall in uscita su questo VPC e una regola firewall in entrata sul VPC in cui si trova l'istanza MySQL di origine.
- Datastream, Dataflow, i bucket Cloud Storage e il database Spanner di destinazione devono essere disponibili in questo VPC.
- Devi creare una lista consentita nell'istanza MySQL di origine per consentire le connessioni dal VPC.
- Determina e alloca un intervallo di indirizzi IP nel VPC che Datastream può utilizzare.
- Crea una subnet nel VPC da utilizzare per Dataflow per completare la migrazione di backfill.
- Crea una subnet nel VPC da utilizzare per Dataflow per completare la migrazione CDC in un secondo momento.
Per eseguire una migrazione live dei dati, segui questi passaggi:
- Configura la migrazione CDC.
- Esegui la migrazione di backfill.
- Completa la migrazione CDC al termine della migrazione di backfill.
L'esecuzione della migrazione live dei dati richiede il deployment e la gestione di un numero significativo di risorse. Spanner fornisce due modelli Terraform di esempio per ogni fase della migrazione live dei dati.
Il modello di migrazione live esegue la migrazione CDC in due fasi:
- Configura la migrazione CDC in un bucket Cloud Storage utilizzando Datastream. Puoi utilizzare una variabile Terraform per impedire al modello di creare i job Dataflow.
- Esegui la migrazione del CDC a Spanner dal bucket Cloud Storage utilizzando Dataflow. Devi eseguire questa fase solo dopo che il modello Terraform di migrazione di backfill ha completato la migrazione di backfill.
Il modello Terraform di migrazione di backfill esegue la migrazione di backfill dall'istanza MySQL di origine a Spanner.
Prima di iniziare
- Assicurati che Terraform sia installato nella shell locale.
- Crea un account di servizio per eseguire la migrazione live dei dati. Per ulteriori informazioni sulla creazione di un account di servizio, consulta Creazione di service account.
-
Per assicurarti che il account di servizio disponga delle autorizzazioni necessarie per eseguire la migrazione live, chiedi all'amministratore di concedere i seguenti ruoli IAM al account di servizio nel tuo progetto:
- Dataflow Admin (
roles/dataflow.admin) - Datastream Admin (
roles/datastream.admin) - Security Admin (
roles/iam.securityAdmin) - Service Account Admin (
roles/iam.serviceAccountAdmin) - Pub/Sub Admin (
roles/pubsub.admin) - Storage Admin (
roles/storage.admin) - Compute Network Admin (
roles/compute.networkAdmin) - Visualizzatore (
roles/viewer)
Per saperne di più sulla concessione dei ruoli, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.
Questi ruoli predefiniti contengono le autorizzazioni necessarie per eseguire la migrazione live. Per vedere quali sono esattamente le autorizzazioni richieste, espandi la sezione Autorizzazioni obbligatorie:
Autorizzazioni obbligatorie
Per eseguire la migrazione live sono necessarie le seguenti autorizzazioni:
-
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
L'amministratore potrebbe anche essere in grado di concedere al account di servizio queste autorizzazioni tramite ruoli personalizzati o altri ruoli predefiniti.
- Dataflow Admin (
Configurare la migrazione CDC
Spanner offre un modello Terraform per configurare il CDC e, in un secondo momento, completare la migrazione CDC. Puoi utilizzare una variabile Terraform per impedire al modello di creare i job Dataflow. Il modello Terraform esegue il deployment e la gestione delle seguenti risorse per configurare la migrazione CDC:
Connessione privata Datastream: una connessione privata Datastream connessione privata viene eseguito il deployment sul VPC configurato.
Profilo di connessione Datastream di origine: un profilo di connessione che consente a Datastream di connettersi all'istanza MySQL di origine.
Bucket Cloud Storage: un bucket Cloud Storage in cui Datastream scrive i dati.
Profilo di connessione Datastream di destinazione: questo profilo di connessione consente a Datastream di connettersi e scrivere nel bucket Cloud Storage.
Stream Datastream: uno stream Datastream che legge dall'istanza MySQL di origine e scrive nel bucket Cloud Storage come definito nei profili di connessione.
Argomento e abbonamento Pub/Sub: il bucket Cloud Storage invia notifiche degli oggetti all'argomento Pub/Sub e Dataflow utilizza l'abbonamento Pub/Sub per scrivere i dati in Spanner.
Notifiche dei bucket Cloud Storage: una notifica dei bucket Cloud Storage che pubblica nell'argomento Pub/Sub.
Preparare la configurazione Terraform CDC
Puoi preparare il modello Terraform in modo da includere le configurazioni delle variabili Dataflow, ma disattivare la creazione dei job 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"
}
}
Le variabili Terraform sono descritte nell'elenco seguente:
project: l'ID progetto. Google Cloudregion: la Google Cloud regione.mysql_host: l'indirizzo IP dell'istanza MySQL di origine.mysql_username: il nome utente dell'istanza MySQL di origine.mysql_password: la password dell'istanza MySQL di origine.mysql_port: il numero di porta dell'istanza MySQL di origine.database: il nome del database MySQL di origine nell'istanza.vpc_name: il nome di un VPC esistente utilizzato da Datastream.range: l'intervallo IP sul VPC che hai riservato per l'utilizzo di Datastream.skip_dataflow: imposta questo valore sutrueper impedire a Dataflow di creare job Dataflow.enable_backfill: imposta questo valore sufalseper impedire al modello Terraform di creare job Dataflow.spanner_database_id: l'ID del database Spanner di destinazione.spanner_instance_id: l'ID dell'istanza Spanner di destinazione.max_workers: determina il numero massimo di worker creati da Dataflow.min_workers: determina il numero massimo di worker creati da Dataflow.network: il nome di un VPC esistente che verrà utilizzato da Dataflow.subnetwork: il nome della subnet designata nel VPC in cui Dataflow può creare i worker.
Eseguire il modello Terraform CDC
Per eseguire la migrazione CDC, devi eseguire il modello Terraform:
Inizializza Terraform utilizzando il comando seguente:
terraform init
Convalida i file Terraform utilizzando il comando seguente:
terraform plan --var-file=terraform_simple.tfvars
Esegui la configurazione Terraform utilizzando il comando seguente:
terraform apply --var-file=terraform_simple.tfvars
La configurazione Terraform produce un output simile al seguente:
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 sta ora eseguendo lo streaming del CDC in un bucket Cloud Storage. Devi eseguire la migrazione di backfill e completare la migrazione CDC in un secondo momento.
Eseguire la migrazione di backfill
Spanner offre un modello Terraform per eseguire la migrazione di backfill. Il modello Terraform esegue il deployment e la gestione della seguente risorsa:
- Job Dataflow: il job Dataflow che legge dall' istanza MySQL di origine e scrive nel database Spanner di destinazione.
Preparare la configurazione Terraform di migrazione di backfill
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"
Le variabili Terraform sono descritte nell'elenco seguente:
job_name: il nome del job Dataflow.project: l'ID progetto in cui deve essere eseguito il job Dataflow. Google Cloudregion: la Google Cloud regione.working_directory_bucket: il bucket Cloud Storage per caricare il file di sessione e creare la directory di output.working_directory_prefix: il prefisso del bucket Cloud Storage per la directory di lavoro di Dataflow.source_config_url: l'indirizzo IP dell'istanza MySQL di origine.username: il nome utente dell'istanza MySQL di origine.password: la password dell'istanza MySQL di origine.instance_id: l'ID dell'istanza Spanner di destinazione.database_id: l'ID del database Spanner di destinazione.spanner_project_id: l'ID progetto in cui si trova l'istanza Spanner. Questo ID progetto può essere diverso dal progetto su cui stai eseguendo Dataflow.
Eseguire il modello Terraform di migrazione di backfill
Per eseguire la migrazione di backfill:
Inizializza Terraform utilizzando il comando seguente:
terraform init
Convalida i file Terraform utilizzando il comando seguente:
terraform plan --var-file=terraform_simple.tfvars
Esegui la configurazione Terraform utilizzando il comando seguente:
terraform apply --var-file=terraform_simple.tfvars
La configurazione Terraform produce un output simile al seguente:
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", ]
Quando la migrazione di backfill non riesce a scrivere una riga in Spanner, la scrive in una directory della coda di messaggi non recapitabili in un bucket Cloud Storage.
Puoi riprovare a scrivere queste righe dalla directory della coda di messaggi non recapitabili a Spanner prima di completare la migrazione CDC.
Per riprovare a scrivere queste righe dalla directory della coda di messaggi non recapitabili a Spanner prima di completare la migrazione CDC, esegui il comando seguente:
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"
Le variabili del comando gcloud CLI sono descritte nell'elenco seguente:
job_name: il nome del job Dataflow.region: la Google Cloud regione.inputFilePattern: il percorso del bucket Cloud Storage del pattern del file di input.datastreamSourceType: il tipo di origine, ad esempio MySQL.instanceId: l'ID dell'istanza Spanner di destinazione.databaseId: l'ID del database Spanner di destinazione.sessionFilePath: il percorso del bucket Cloud Storage del file di sessione.deadLetterQueueDirectory: il percorso del bucket Cloud Storage della directory DLQ.
Completare la migrazione CDC
Al termine della migrazione di backfill, puoi utilizzare Dataflow per eseguire la migrazione del CDC a Spanner. Il job Dataflow prende gli eventi di modifica dal bucket Cloud Storage e li scrive in Spanner.
Dopo che quasi tutti i dati del bucket Cloud Storage sono stati scritti in Spanner, interrompi le scritture sull'istanza MySQL di origine per consentire la scrittura delle modifiche rimanenti in Spanner.
Ciò causa un breve periodo di inattività mentre Spanner recupera l'istanza MySQL di origine. Una volta scritte tutte le modifiche in Spanner, l'applicazione può iniziare a utilizzare Spanner come database.
Per completare la migrazione CDC, modifica il valore del parametro skip_dataflow
Terraform in false ed esegui di nuovo il modello Terraform di migrazione live
.
Esegui la configurazione Terraform utilizzando il comando seguente:
terraform apply --var-file=terraform_simple.tfvars