Migrazione dei dati in tempo reale da MySQL

Questo documento spiega come eseguire una migrazione dei dati live da un'istanza MySQL di origine a Spanner con tempi di inattività minimi utilizzando Terraform per eseguire il deployment di Dataflow e Datastream.

Una volta eseguita la migrazione dei dati live e dopo 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.

Puoi eseguire una migrazione dei dati in tempo reale 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 dei dati live è costituita dalle seguenti due fasi:

  • Migrazione del 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 collettiva 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 di coda dei messaggi non recapitabili in un bucket Cloud Storage. Puoi fare in modo che la migrazione del backfill riprovi a scrivere queste righe in Spanner.
  • Migrazione di Change Data Capture (CDC):

    • Questa fase viene eseguita contemporaneamente alla migrazione del backfill, acquisendo le modifiche che si verificano nell'istanza MySQL di origine in tempo reale. Queste modifiche vengono quindi applicate a Spanner al termine della migrazione di backfill.
    • Devi utilizzare Datastream per acquisire le modifiche che si verificano nell'istanza MySQL di origine in tempo reale e scriverle in un bucket Cloud Storage.
    • Una volta completata la migrazione di backfill, devi utilizzare Dataflow per spostare 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 di coda dei messaggi non recapitabili in un bucket Cloud Storage diverso. La migrazione CDC riprova automaticamente a scrivere le righe dalla directory della coda dei messaggi non recapitabili a Spanner.

Pianificare la migrazione dei dati live

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 dei dati live, potresti aver bisogno dell'amministratore di rete della tua organizzazione per eseguire le seguenti attività:

  • Utilizza il VPC predefinito o creane uno nuovo nel tuo progetto con i seguenti requisiti:
    • L'istanza MySQL di origine deve essere disponibile su questo VPC. Potresti dover creare una regola firewall di uscita su questo VPC e una regola firewall di ingresso sul VPC in cui si trova l'istanza MySQL di origine.
    • Datastream, Dataflow, bucket Cloud Storage e il database Spanner di destinazione devono essere disponibili su 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 nella VPC da utilizzare per completare la migrazione di backfill.
  • Crea una subnet nel VPC da utilizzare per completare la migrazione CDC in un secondo momento.

Puoi eseguire la migrazione dei dati in tempo reale seguendo questi passaggi:

  1. Configura la migrazione CDC.
  2. Esegui la migrazione di backfill.
  3. Completa la migrazione CDC dopo il completamento della migrazione di backfill.

L'esecuzione della migrazione dei dati live richiede il deployment e la gestione di un numero significativo di risorse. Spanner fornisce due modelli Terraform di esempio per ogni fase della migrazione dei dati live.

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 di CDC a Spanner dal bucket Cloud Storage utilizzando Dataflow. Devi eseguire questa fase solo dopo che il modello Terraform di migrazione del backfill ha completato la migrazione del 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 dei dati live. Per saperne di più sulla creazione di un account di servizio, vedi Creare service account.
  • Per assicurarti che il account di servizio disponga delle autorizzazioni necessarie per eseguire la migrazione live, chiedi all'amministratore di concedere al account di servizio i seguenti ruoli IAM sul tuo progetto:

    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 all'account di servizio queste autorizzazioni con ruoli personalizzati o altri ruoli predefiniti.

Configurare la migrazione CDC

Spanner offre un modello Terraform che configura CDC e, in un secondo momento, completa la migrazione CDC. Puoi utilizzare una variabile Terraform per disattivare la creazione dei job Dataflow da parte del modello. Il modello Terraform esegue il deployment e gestisce le seguenti risorse per configurare la migrazione CDC:

  • Connessione privata Datastream: una connessione privata Datastream viene implementata nel 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 sottoscrizione Pub/Sub: il bucket Cloud Storage invia notifiche di oggetti all'argomento Pub/Sub e Dataflow utilizza la sottoscrizione Pub/Sub per scrivere i dati in Spanner.

  • Notifiche dei bucket Cloud Storage: una notifica del bucket Cloud Storage che viene pubblicata nell'argomento Pub/Sub.

Preparazione della configurazione Terraform CDC

Puoi preparare il modello Terraform per includere le configurazioni delle variabili Dataflow, ma disattivare la creazione di 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 nel seguente elenco:

  • project: l' Google Cloud ID progetto.
  • region: 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 da parte di Datastream.
  • skip_dataflow: imposta questo valore su true per impedire a Dataflow di creare job Dataflow.
  • enable_backfill: imposta questo valore su false per impedire al modello Terraform di creare job Dataflow.
  • spanner_database_id: l'ID del database Spanner di destinazione.
  • spanner_instance_id: l'ID 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 worker.

Esegui il modello Terraform CDC

Per eseguire la migrazione CDC, devi eseguire il modello Terraform:

  1. Inizializza Terraform utilizzando questo comando:

      terraform init
    

  2. Convalida i file Terraform utilizzando il comando seguente:

      terraform plan --var-file=terraform_simple.tfvars
    

  3. Esegui la configurazione di Terraform utilizzando il seguente comando:

      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 ora trasmette in streaming la CDC a un bucket Cloud Storage. Devi eseguire la migrazione di backfill e completare la migrazione CDC in un secondo momento.

Esegui la migrazione di backfill

Spanner offre un modello Terraform per eseguire la migrazione di backfill. Il modello Terraform esegue il deployment e gestisce la seguente risorsa:

  • Job Dataflow: il job Dataflow che legge dall'istanza MySQL di origine e scrive nel database Spanner di destinazione.

Preparazione della configurazione Terraform per la 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 nel seguente elenco:

  • job_name: il nome del job Dataflow.
  • project: l'ID progetto Google Cloud in cui deve essere eseguito il job Dataflow.
  • region: la Google Cloud regione.
  • working_directory_bucket: il bucket Cloud Storage per il caricamento del file di sessione e la creazione della 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 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 da quello in cui esegui Dataflow.

Esegui il modello Terraform di migrazione del backfill

Per eseguire la migrazione del backfill:

  1. Inizializza Terraform utilizzando questo comando:

      terraform init
    

  2. Convalida i file Terraform utilizzando il comando seguente:

      terraform plan --var-file=terraform_simple.tfvars
    

  3. Esegui la configurazione di Terraform utilizzando il seguente comando:

      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 del backfill non può scrivere una riga in Spanner, la scrive in una directory di coda dei messaggi non recapitabili in un bucket Cloud Storage.

Puoi riprovare a scrivere queste righe dalla directory della coda dei messaggi non recapitabili a Spanner prima di completare la migrazione CDC.

Per riprovare a scrivere queste righe dalla directory della coda dei messaggi non recapitabili a Spanner prima di completare la migrazione CDC, esegui questo comando:

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 nel seguente elenco:

  • job_name: il nome del job Dataflow.
  • region: la Google Cloud regione.
  • inputFilePattern: la posizione del bucket Cloud Storage del pattern del file di input.
  • datastreamSourceType: il tipo di origine, ad esempio MySQL.
  • instanceId: l'ID istanza Spanner di destinazione.
  • databaseId: l'ID del database Spanner di destinazione.
  • sessionFilePath: il percorso del bucket Cloud Storage al file di sessione.
  • deadLetterQueueDirectory: il percorso del bucket Cloud Storage alla directory DLQ.

Completa la migrazione CDC

Una volta completata la migrazione del backfill, puoi utilizzare Dataflow per eseguire la migrazione di 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 nell'istanza MySQL di origine per consentire la scrittura delle modifiche rimanenti in Spanner.

Ciò causa un breve periodo di inattività mentre Spanner si aggiorna all'istanza MySQL di origine. Dopo che tutte le modifiche sono state scritte in Spanner, la tua applicazione può iniziare a utilizzare Spanner come database.

Per completare la migrazione CDC, modifica il valore del parametro Terraform skip_dataflow in false ed esegui di nuovo il modello Terraform di migrazione live.

Esegui la configurazione di Terraform utilizzando il seguente comando:

      terraform apply --var-file=terraform_simple.tfvars
    

Passaggi successivi