Migración de datos en vivo desde MySQL

En este documento, se explica cómo realizar una migración de datos en vivo desde una instancia de MySQL de origen a Spanner con un tiempo de inactividad mínimo usando Terraform para implementar Dataflow y Datastream.

Una vez que realices la migración de datos activos y tengas la certeza de que todos tus datos se transfirieron, migraste tu código y dependencias, y completaste las pruebas, puedes cambiar tu aplicación para que use Spanner en lugar de tu base de datos de MySQL de origen.

Puedes realizar una migración de datos en vivo después de crear tu base de datos de Spanner de destino. Debes crear un esquema compatible en tu base de datos de destino antes de migrar los datos.

Cómo funciona

La migración de datos en vivo consta de las siguientes dos fases:

  • Migración de reabastecimiento:

    • Durante la migración de carga inicial, Dataflow lee los datos existentes de tu base de datos de MySQL de origen y los migra a la base de datos de Spanner de destino. Debes usar una plantilla de Dataflow de migración masiva para transferir los datos de tu instancia de MySQL de origen a Spanner.
    • Cuando la migración de carga inicial no puede escribir una fila en Spanner, escribe esa fila en un directorio de cola de mensajes no entregados en un bucket de Cloud Storage. Puedes hacer que la migración de carga inicial vuelva a intentar escribir estas filas en Spanner.
  • Migración de la captura de datos modificados (CDC):

    • Esta fase se ejecuta de forma simultánea con la migración de reabastecimiento, y captura los cambios que se producen en la instancia de MySQL de origen en tiempo real. Luego, estos cambios se aplican a Spanner una vez que se completa la migración de reabastecimiento.
    • Debes usar Datastream para capturar los cambios que se producen en tu instancia de MySQL de origen en tiempo real y escribirlos en un bucket de Cloud Storage.
    • Una vez que se complete la migración de relleno, deberás usar Dataflow para mover los datos de CDC del bucket de Cloud Storage a Spanner. Si Dataflow no puede escribir una fila en Spanner por algún motivo, escribe esa fila en un directorio de cola de mensajes no entregados en un bucket diferente de Cloud Storage. La migración de CDC vuelve a intentar automáticamente escribir las filas del directorio de la cola de mensajes no entregados en Spanner.

Planifica la migración de datos en vivo

Debes configurar la infraestructura de red necesaria para que los datos fluyan entre tu instancia de MySQL de origen, Datastream, Dataflow, los buckets de Cloud Storage y la base de datos de Spanner de destino. Recomendamos configurar la conectividad de red privada para una migración segura. Según los requisitos de cumplimiento de tu organización, es posible que debas configurar la conectividad de red pública o privada. Para obtener más información sobre la conectividad de Datastream, consulta Opciones de conectividad de red.

Para planificar la migración de datos en vivo, es posible que necesites que el administrador de red de tu organización realice las siguientes tareas:

  • Usa la VPC predeterminada o crea una nueva en tu proyecto con los siguientes requisitos:
    • La instancia de MySQL de origen debe estar disponible en esta VPC. Es posible que debas crear una regla de firewall de salida en esta VPC y una regla de firewall de entrada en la VPC en la que se encuentra la instancia de MySQL de origen.
    • Datastream, Dataflow, los buckets de Cloud Storage y la base de datos de Spanner de destino deben estar disponibles en esta VPC.
    • Debes crear una lista de entidades permitidas en tu instancia de MySQL de origen para permitir conexiones desde la VPC.
  • Determina y asigna un rango de direcciones IP en la VPC que Datastream pueda usar.
  • Crea una subred en la VPC para que Dataflow la use para completar la migración de relleno.
  • Crea una subred en la VPC para que Dataflow la use y complete la migración de CDC más adelante.

Puedes realizar la migración de datos en vivo con los siguientes pasos:

  1. Configura la migración de CDC.
  2. Realiza la migración de relleno.
  3. Finaliza la migración de CDC después de que finalice la migración de relleno.

Realizar la migración de datos en vivo requiere implementar y administrar una cantidad significativa de recursos. Spanner proporciona dos plantillas de Terraform de muestra para cada fase de la migración de datos en vivo.

La plantilla de migración en vivo realiza la migración de CDC en dos fases:

  • Configura la migración de CDC a un bucket de Cloud Storage con Datastream. Puedes usar una variable de Terraform para evitar que la plantilla cree los trabajos de Dataflow.
  • Migra los datos de CDC a Spanner desde el bucket de Cloud Storage con Dataflow. Solo debes realizar esta fase después de que la plantilla de Terraform de migración de datos históricos finalice la migración de datos históricos.

La plantilla de Terraform de migración de relleno realiza la migración de relleno desde tu instancia de MySQL de origen a Spanner.

Antes de comenzar

  • Asegúrate de que Terraform esté instalado en tu shell local.
  • Crea una cuenta de servicio para ejecutar la migración de datos en vivo. Para obtener más información sobre cómo crear una cuenta de servicio, consulta Crea cuentas de servicio.
  • Para garantizar que la cuenta de servicio tenga los permisos necesarios para realizar la migración en vivo, pídele a tu administrador que le otorgue a la cuenta de servicio los siguientes roles de IAM en tu proyecto:

    Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.

    Estos roles predefinidos contienen los permisos necesarios para realizar la migración en vivo. Para ver los permisos exactos que son necesarios, expande la sección Permisos requeridos:

    Permisos necesarios

    Se requieren los siguientes permisos para realizar la migración en vivo:

    • 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

    Es posible que tu administrador también pueda otorgar estos permisos a la cuenta de servicio con roles personalizados o con otros roles predefinidos.

Configura la migración de CDC

Spanner ofrece una plantilla de Terraform que configura el CDC y, luego, completa la migración del CDC. Puedes usar una variable de Terraform para inhabilitar la plantilla y evitar que cree los trabajos de Dataflow. La plantilla de Terraform implementa y administra los siguientes recursos para configurar la migración de CDC:

  • Conexión privada de Datastream: Se implementa una conexión privada de Datastream en tu VPC configurada.

  • Perfil de conexión de Datastream de origen: Es un perfil de conexión que permite que Datastream se conecte a tu instancia de MySQL de origen.

  • Bucket de Cloud Storage: Es un bucket de Cloud Storage en el que Datastream escribe los datos.

  • Perfil de conexión de Datastream de destino: Este perfil de conexión permite que Datastream se conecte y escriba en el bucket de Cloud Storage.

  • Transmisión de Datastream: Es una transmisión de Datastream que lee desde tu instancia de MySQL de origen y escribe en el bucket de Cloud Storage según se define en los perfiles de conexión.

  • Tema y suscripción de Pub/Sub: El bucket de Cloud Storage envía notificaciones de objetos al tema de Pub/Sub, y Dataflow consume la suscripción de Pub/Sub para escribir datos en Spanner.

  • Notificaciones de bucket de Cloud Storage: Una notificación de bucket de Cloud Storage que se publica en el tema de Pub/Sub

Prepara la configuración de Terraform de CDC

Puedes preparar la plantilla de Terraform para incluir configuraciones de variables de Dataflow, pero inhabilitar la creación de trabajos de 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"
      }
    }
  

Las variables de Terraform se describen en la siguiente lista:

  • project: El ID del proyecto de Google Cloud .
  • region: Es la Google Cloud región.
  • mysql_host: La dirección IP de tu instancia de MySQL de origen.
  • mysql_username: Es el nombre de usuario de tu instancia de MySQL de origen.
  • mysql_password: Es la contraseña de tu instancia de MySQL de origen.
  • mysql_port: Es el número de puerto de la instancia de MySQL de origen.
  • database: Es el nombre de tu base de datos de MySQL de origen en la instancia.
  • vpc_name: Es el nombre de una VPC existente que usa Datastream.
  • range: Es el rango de IP en la VPC que reservaste para que use Datastream.
  • skip_dataflow: Establece este valor en true para inhabilitar la creación de trabajos de Dataflow.
  • enable_backfill: Establece este valor en false para inhabilitar la creación de trabajos de Dataflow con la plantilla de Terraform.
  • spanner_database_id: Es el ID de la base de datos de Spanner de destino.
  • spanner_instance_id: Es el ID de la instancia de Spanner de destino.
  • max_workers: Determina la cantidad máxima de trabajadores que crea Dataflow.
  • min_workers: Determina la cantidad máxima de trabajadores que crea Dataflow.
  • network: Es el nombre de una VPC existente que Dataflow usará.
  • subnetwork: Es el nombre de la subred designada en la VPC en la que Dataflow puede crear trabajadores.

Ejecuta la plantilla de Terraform de CDC

Para realizar la migración de CDC, debes ejecutar la plantilla de Terraform:

  1. Inicializa Terraform con el siguiente comando:

      terraform init
    

  2. Valida los archivos de Terraform con el siguiente comando:

      terraform plan --var-file=terraform_simple.tfvars
    

  3. Ejecuta la configuración de Terraform con el siguiente comando:

      terraform apply --var-file=terraform_simple.tfvars
    

    La configuración de Terraform genera un resultado similar al siguiente:

    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 ahora transmite el CDC a un bucket de Cloud Storage. Debes realizar la migración de carga inicial y finalizar la migración de CDC más adelante.

Realiza la migración de reabastecimiento

Spanner ofrece una plantilla de Terraform para realizar la migración de relleno. La plantilla de Terraform implementa y administra el siguiente recurso:

  • Trabajo de Dataflow: Es el trabajo de Dataflow que lee desde la instancia de MySQL de origen y escribe en la base de datos de Spanner de destino.

Cómo preparar la configuración de Terraform para la migración de relleno

    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"
  

Las variables de Terraform se describen en la siguiente lista:

  • job_name: Es el nombre del trabajo de Dataflow.
  • project: Es el ID del proyecto Google Cloud en el que se debe ejecutar el trabajo de Dataflow.
  • region: Es la Google Cloud región.
  • working_directory_bucket: Es el bucket de Cloud Storage para subir el archivo de sesión y crear el directorio de salida.
  • working_directory_prefix: Es el prefijo del bucket de Cloud Storage para el directorio de trabajo de Dataflow.
  • source_config_url: La dirección IP de tu instancia de MySQL de origen.
  • username: Es el nombre de usuario de tu instancia de MySQL de origen.
  • password: Es la contraseña de tu instancia de MySQL de origen.
  • instance_id: Es el ID de la instancia de Spanner de destino.
  • database_id: Es el ID de la base de datos de Spanner de destino.
  • spanner_project_id: Es el ID del proyecto en el que se encuentra tu instancia de Spanner. Este ID puede ser diferente del proyecto en el que ejecutas Dataflow.

Ejecuta la plantilla de Terraform de migración de relleno

Para realizar la migración de reabastecimiento, haz lo siguiente:

  1. Inicializa Terraform con el siguiente comando:

      terraform init
    

  2. Valida los archivos de Terraform con el siguiente comando:

      terraform plan --var-file=terraform_simple.tfvars
    

  3. Ejecuta la configuración de Terraform con el siguiente comando:

      terraform apply --var-file=terraform_simple.tfvars
    

    La configuración de Terraform produce un resultado similar al siguiente:

    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",
    ]
    

Cuando la migración de carga inicial no puede escribir una fila en Spanner, la escribe en un directorio de cola de mensajes no entregados en un bucket de Cloud Storage.

Puedes volver a intentar escribir estas filas desde el directorio de la cola de mensajes no entregados en Spanner antes de finalizar la migración de CDC.

Para volver a intentar escribir estas filas desde el directorio de la cola de mensajes no entregados en Spanner antes de finalizar la migración de CDC, ejecuta el siguiente 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"

Las variables de los comandos de gcloud CLI se describen en la siguiente lista:

  • job_name: Es el nombre del trabajo de Dataflow.
  • region: Es la Google Cloud región.
  • inputFilePattern: Es la ubicación del bucket de Cloud Storage del patrón de archivo de entrada.
  • datastreamSourceType: Es el tipo de fuente, por ejemplo, MySQL.
  • instanceId: Es el ID de la instancia de Spanner de destino.
  • databaseId: Es el ID de la base de datos de Spanner de destino.
  • sessionFilePath: Es la ruta de acceso del bucket de Cloud Storage al archivo de sesión.
  • deadLetterQueueDirectory: Es la ruta de acceso del bucket de Cloud Storage al directorio de la DLQ.

Finaliza la migración de la CDC

Una vez que se complete la migración de relleno, puedes usar Dataflow para migrar la CDC a Spanner. El trabajo de Dataflow toma los eventos de cambio del bucket de Cloud Storage y los escribe en Spanner.

Después de que se escriban casi todos los datos del bucket de Cloud Storage en Spanner, detén las escrituras en la instancia de MySQL de origen para permitir que los cambios restantes se escriban en Spanner.

Esto provoca un breve tiempo de inactividad mientras Spanner se pone al día con la instancia de MySQL de origen. Una vez que todos los cambios se escriban en Spanner, tu aplicación podrá comenzar a usar Spanner como su base de datos.

Para finalizar la migración de CDC, cambia el valor del parámetro skip_dataflow de Terraform a false y vuelve a ejecutar la plantilla de Terraform de migración en vivo.

Ejecuta la configuración de Terraform con el siguiente comando:

      terraform apply --var-file=terraform_simple.tfvars
    

¿Qué sigue?