En este documento se explica cómo realizar una migración de datos activa desde una instancia de MySQL de origen a Spanner con un tiempo de inactividad mínimo mediante Terraform para implementar Dataflow y Datastream.
Una vez que hayas realizado la migración de datos activos y estés seguro de que se han transferido todos los datos, hayas migrado el código y las dependencias, y hayas completado las pruebas, puedes cambiar tu aplicación para que use Spanner en lugar de la base de datos MySQL de origen.
Puedes realizar una migración de datos activos después de crear la base de datos de Spanner de destino. Antes de migrar los datos, debe crear un esquema compatible en la base de datos de destino.
Cómo funciona
La migración de datos activos consta de dos fases:
Migración de relleno:
- Durante la migración de relleno, Dataflow lee los datos de la base de datos MySQL de origen y los migra a la base de datos Spanner de destino. Debes usar una plantilla de Dataflow de migración masiva para mover los datos de tu instancia de MySQL de origen a Spanner.
- Cuando la migración de relleno no puede escribir una fila en Spanner, escribe esa fila en un directorio de cola de mensajes fallidos en un segmento de Cloud Storage. Puedes hacer que la migración de relleno intente escribir estas filas en Spanner de nuevo.
Migración de captura de datos de cambios (CDC):
- Esta fase se ejecuta simultáneamente con la migración de reposición, capturando los cambios que se producen en la instancia de MySQL de origen en tiempo real. Estos cambios se aplican a Spanner una vez que se completa la migración de relleno.
- Debes usar Datastream para capturar los cambios que se produzcan en tu instancia de MySQL de origen en tiempo real y escribirlos en un segmento de Cloud Storage.
- Una vez completada la migración de relleno, debes usar Dataflow para mover el CDC del segmento de Cloud Storage a Spanner. Si Dataflow no puede escribir una fila en Spanner por cualquier motivo, escribe esa fila en un directorio de cola de mensajes fallidos en otro segmento de Cloud Storage. La migración de CDC vuelve a intentar automáticamente escribir las filas del directorio de la cola de mensajes fallidos en Spanner.
Planificar la migración de datos activos
Debe configurar la infraestructura de red necesaria para que los datos fluyan entre su instancia de MySQL de origen, Datastream, Dataflow, los segmentos de Cloud Storage y la base de datos de Spanner de destino. Te recomendamos que configures la conectividad de red privada para que la migración sea segura. En función de los requisitos de cumplimiento de tu organización, puede que tengas que configurar la conectividad de red pública o privada. Para obtener más información sobre la conectividad de Datastream, consulta las opciones de conectividad de red.
Para planificar la migración de datos activos, es posible que necesites que el administrador de la red de tu organización realice las siguientes tareas:
- Usa la VPC predeterminada o crea una en tu proyecto que cumpla los siguientes requisitos:
- La instancia de MySQL de origen debe estar disponible en esta VPC. Es posible que tengas que crear una regla de cortafuegos de salida en esta VPC y una regla de cortafuegos de entrada en la VPC en la que se encuentre la instancia de MySQL de origen.
- Datastream, Dataflow, los segmentos de Cloud Storage y la base de datos de Spanner de destino deben estar disponibles en esta VPC.
- Debes crear una lista de permitidos en tu instancia de MySQL de origen para permitir las conexiones desde la VPC.
- Determina y asigna un intervalo 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 relleno.
- 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 activos, sigue estos pasos:
- Configura la migración de CDC.
- Realiza la migración de relleno.
- Finaliza la migración de CDC después de que se haya completado la migración de relleno.
Para llevar a cabo la migración de datos activos, es necesario implementar y gestionar un número considerable de recursos. Spanner proporciona dos plantillas de Terraform de ejemplo para cada fase de la migración de datos activos.
La plantilla de migración activa realiza la migración de CDC en dos fases:
- Configura la migración de CDC a un segmento de Cloud Storage mediante Datastream. Puedes usar una variable de Terraform para evitar que la plantilla cree las tareas de Dataflow.
- Migra el CDC a Spanner desde el segmento de Cloud Storage con Dataflow. Solo debes realizar esta fase después de que la plantilla de Terraform de migración de relleno haya completado la migración de relleno.
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 empezar
- Asegúrate de que Terraform esté instalado en tu shell local.
- Crea una cuenta de servicio para ejecutar la migración de datos activos. Para obtener más información sobre cómo crear una cuenta de servicio, consulta el artículo Crear cuentas de servicio.
-
Para asegurarte de que la cuenta de servicio tiene los permisos necesarios para realizar la migración en directo, pide a tu administrador que le conceda los siguientes roles de gestión de identidades y accesos en tu proyecto:
-
Administrador de Dataflow (
roles/dataflow.admin
) -
Administrador de Datastream (
roles/datastream.admin
) -
Administrador de seguridad (
roles/iam.securityAdmin
) -
Administrador de cuentas de servicio (
roles/serviceAccountAdmin
) -
Administrador de Pub/Sub (
roles/pubsub.admin
) -
Administrador de almacenamiento (
roles/storage.admin
) -
Administrador de red de Compute (
roles/compute.networkAdmin
) -
Lector (
roles/viewer
)
Para obtener más información sobre cómo conceder roles, consulta el artículo Gestionar el acceso a proyectos, carpetas y organizaciones.
Estos roles predefinidos contienen los permisos necesarios para realizar la migración en directo. Para ver los permisos exactos que se necesitan, despliega la sección Permisos necesarios:
Permisos obligatorios
Para realizar una migración en directo, se necesitan los siguientes permisos:
-
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 conceder estos permisos a la cuenta de servicio con roles personalizados u otros roles predefinidos.
-
Administrador de Dataflow (
Configurar la migración de CDC
Spanner ofrece una plantilla de Terraform para configurar el CDC y, más adelante, completar la migración del CDC. Puedes usar una variable de Terraform para inhabilitar la plantilla y evitar que cree las tareas de Dataflow. La plantilla de Terraform despliega y gestiona los siguientes recursos para configurar la migración de CDC:
Conexión privada de Datastream: una conexión privada de Datastream se implementa en la VPC que hayas configurado.
Perfil de conexión de Datastream de origen: un perfil de conexión que permite a Datastream conectarse a tu instancia de MySQL de origen.
Segmento de Cloud Storage: segmento 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 segmento de Cloud Storage.
Flujo de Datastream: flujo de Datastream que lee datos de la instancia de MySQL de origen y los escribe en el segmento de Cloud Storage tal 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 cubos de Cloud Storage: una notificación de cubo de Cloud Storage que se publica en el tema de Pub/Sub.
Preparar la configuración de Terraform de CDC
Puedes preparar la plantilla de Terraform para incluir configuraciones de variables de Dataflow, pero inhabilita la creación de tareas 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. Google Cloudregion
: la Google Cloud región.mysql_host
: la dirección IP de la instancia de MySQL de origen.mysql_username
: nombre de usuario de la instancia de MySQL de origen.mysql_password
: la contraseña de tu instancia de MySQL de origen.mysql_port
: número de puerto de la instancia de MySQL de origen.database
: el nombre de la base de datos MySQL de origen en la instancia.vpc_name
: el nombre de una VPC que ya existe y que usa Datastream.range
: el intervalo de IPs de la VPC que ha reservado para que lo use Datastream.skip_dataflow
: asigna el valortrue
para inhabilitar la creación de trabajos de Dataflow.enable_backfill
: asigna el valorfalse
para inhabilitar la creación de tareas de Dataflow mediante la plantilla de Terraform.spanner_database_id
: el ID de la base de datos de Spanner de destino.spanner_instance_id
: el ID de la instancia de Spanner de destino.max_workers
: determina el número máximo de trabajadores que crea Dataflow.min_workers
: determina el número máximo de trabajadores que crea Dataflow.network
: el nombre de una VPC que va a usar Dataflow.subnetwork
: nombre de la subred designada en la VPC en la que Dataflow puede crear trabajadores.
Ejecutar la plantilla de Terraform de CDC
Para realizar la migración de CDC, debes ejecutar la plantilla de Terraform:
Inicializa Terraform con el siguiente comando:
terraform init
Valida los archivos de Terraform con el siguiente comando:
terraform plan --var-file=terraform_simple.tfvars
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 está transmitiendo el CDC a un segmento de Cloud Storage. Debes realizar la migración de relleno y terminar la migración de CDC más adelante.
Realizar la migración de relleno
Spanner ofrece una plantilla de Terraform para realizar la migración de relleno. La plantilla de Terraform implementa y gestiona el siguiente recurso:
- Tarea de Dataflow: tarea de Dataflow que lee de la instancia de MySQL de origen y escribe en la base de datos de Spanner de destino.
Preparar la configuración de Terraform de 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
: nombre de la tarea de Dataflow.project
: el ID del proyecto Google Cloud en el que se debe ejecutar el trabajo de Dataflow.region
: la Google Cloud región.working_directory_bucket
: el bucket de Cloud Storage para subir el archivo de sesión y crear el directorio de salida.working_directory_prefix
: prefijo del segmento de Cloud Storage del directorio de trabajo de Dataflow.source_config_url
: la dirección IP de la instancia de MySQL de origen.username
: nombre de usuario de la instancia de MySQL de origen.password
: la contraseña de tu instancia de MySQL de origen.instance_id
: el ID de la instancia de Spanner de destino.database_id
: el ID de la base de datos de Spanner de destino.spanner_project_id
: 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.
Ejecutar la plantilla de Terraform de migración de relleno
Para llevar a cabo la migración de relleno, siga estos pasos:
Inicializa Terraform con el siguiente comando:
terraform init
Valida los archivos de Terraform con el siguiente comando:
terraform plan --var-file=terraform_simple.tfvars
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:
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 relleno no puede escribir una fila en Spanner, escribe esa fila en un directorio de cola de mensajes fallidos en un segmento de Cloud Storage.
Puedes volver a escribir estas filas desde el directorio de la cola de mensajes fallidos en Spanner antes de finalizar la migración de CDC.
Para volver a escribir estas filas del directorio de la cola de mensajes fallidos 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
: nombre de la tarea de Dataflow.region
: la Google Cloud región.inputFilePattern
: la ubicación del segmento de Cloud Storage del patrón de archivo de entrada.datastreamSourceType
: el tipo de origen, por ejemplo, MySQL.instanceId
: el ID de la instancia de Spanner de destino.databaseId
: el ID de la base de datos de Spanner de destino.sessionFilePath
: la ruta del segmento de Cloud Storage al archivo de sesión.deadLetterQueueDirectory
: la ruta del segmento de Cloud Storage al directorio de la cola de mensajes fallidos.
Finalizar la migración de CDC
Una vez que se haya completado la migración de relleno, puedes usar Dataflow para migrar el CDC a Spanner. La tarea de Dataflow toma los eventos de cambio del segmento de Cloud Storage y los escribe en Spanner.
Cuando se hayan escrito en Spanner casi todos los datos del bucket de Cloud Storage, detén las escrituras en la instancia de MySQL de origen para que se puedan escribir los cambios restantes 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 se hayan escrito todos los cambios en Spanner, tu aplicación podrá empezar a usar Spanner como base de datos.
Para finalizar la migración de CDC, cambia el valor del parámetro de Terraform skip_dataflow
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