Migración de datos en vivo desde MySQL

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

Una vez que realices la migración de datos en vivo y tengas la seguridad de que todos tus datos se transfirieron, migraste tu código y tus dependencias, y completaste las pruebas, puedes cambiar tu aplicación para usar 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 reabastecimiento, 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 para la migración masiva para mover los datos de tu instancia de MySQL de origen a Spanner.
    • Cuando la migración de reabastecimiento 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 hacer que la migración de reabastecimiento 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 fuente en tiempo real y escribirlos en un bucket de Cloud Storage.
    • Una vez que se complete la migración de reabastecimiento, debes usar Dataflow para mover la CDC del bucket de Cloud Storage a Spanner. Si Dataflow no puede escribir una fila en Spanner por algún motivo, la escribe en un directorio de cola de mensajes no entregados en un bucket de Cloud Storage diferente. La migración de CDC vuelve a intentar escribir automáticamente las filas del directorio de la fila 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 realizar una migración segura. Según los requisitos de cumplimiento de tu organización, es posible que tengas que 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 donde 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 las conexiones desde la VPC.
  • Determina y asigna un rango de direcciones IP en la VPC que pueda usar Datastream.
  • Crea una subred en la VPC para que Dataflow la use para completar la migración de reabastecimiento.
  • Crea una subred en la VPC para que Dataflow la use para completar la migración de CDC más adelante.

Para realizar la migración de datos en tiempo real, sigue estos pasos:

  1. Configura la migración de CDC.
  2. Realiza la migración de reabastecimiento.
  3. Finaliza la migración de CDC después de que se complete la migración de reabastecimiento.

Para realizar la migración de datos en vivo, debes 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 del 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 el CDC a Spanner desde el bucket de Cloud Storage con Dataflow. Debes realizar esta fase solo después de que la plantilla de Terraform de migración de reabastecimiento termine con la migración de reabastecimiento.

La plantilla de Terraform de migración de reabastecimiento realiza la migración de reabastecimiento 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 impedir que la plantilla 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 de tu instancia de MySQL de origen y escribe en el bucket de Cloud Storage como 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 del 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: El nombre de la 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 de la VPC que reservaste para que use Datastream.
  • skip_dataflow: Establece este valor en true para inhabilitar que Dataflow cree trabajos de Dataflow.
  • enable_backfill: Establece este valor en false para inhabilitar la plantilla de Terraform para que no cree trabajos de Dataflow.
  • 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 usará Dataflow.
  • 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. Usa el siguiente comando para validar los archivos de Terraform:

      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:

    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 reabastecimiento y terminar 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 reabastecimiento. La plantilla de Terraform implementa y administra el siguiente recurso:

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

Prepara la configuración de Terraform para la migración de reabastecimiento

    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: El ID del proyecto de 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 de proyecto puede ser diferente del proyecto en el que ejecutas Dataflow.

Ejecuta la plantilla de Terraform de migración de reabastecimiento

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

  1. Inicializa Terraform con el siguiente comando:

      terraform init
    

  2. Usa el siguiente comando para validar los archivos de Terraform:

      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 reabastecimiento 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 del directorio de la cola de buzón devuelto en Spanner antes de terminar la migración de los CDC.

Para volver a intentar escribir estas filas del directorio de la fila de mensajes no entregados en Spanner antes de terminar 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 comando 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 CDC

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

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

Esto genera un tiempo de inactividad breve mientras Spanner se pone al día con la instancia de MySQL de origen. Después de que todos los cambios se escriban en Spanner, tu aplicación puede 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 activa.

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

      terraform apply --var-file=terraform_simple.tfvars
    

¿Qué sigue?