Migration de données en direct depuis MySQL

Ce document explique comment effectuer une migration de données en direct d'une instance MySQL source vers Spanner avec un temps d'arrêt minimal à l'aide de Terraform pour déployer Dataflow et Datastream.

Une fois que vous avez effectué la migration des données en direct et que vous êtes sûr que toutes vos données ont été transférées, que vous avez migré votre code et vos dépendances, et que vous avez terminé les tests, vous pouvez basculer votre application pour qu'elle utilise Spanner au lieu de votre base de données MySQL source.

Vous pouvez effectuer une migration de données en direct après avoir créé votre base de données Spanner cible. Vous devez créer un schéma compatible sur votre base de données cible avant de migrer les données.

Fonctionnement

La migration des données en direct comprend les deux phases suivantes :

  • Migration des annonces de remplissage :

    • Lors de la migration par remplissage, Dataflow lit les données existantes de votre base de données MySQL source et les migre vers la base de données Spanner cible. Vous devez utiliser un modèle Dataflow de migration groupée pour déplacer les données de votre instance MySQL source vers Spanner.
    • Lorsque la migration de remplissage échoue à écrire une ligne dans Spanner, elle écrit cette ligne dans un répertoire de file d'attente de lettres mortes dans un bucket Cloud Storage. Vous pouvez demander à la migration de remplissage d'essayer à nouveau d'écrire ces lignes dans Spanner.
  • Migration de la capture de données modifiées (CDC) :

    • Cette phase s'exécute en même temps que la migration de remplissage. Elle permet de capturer les modifications apportées à l'instance MySQL source en temps réel. Ces modifications sont ensuite appliquées à Spanner une fois la migration de remplissage terminée.
    • Vous devez utiliser Datastream pour capturer les modifications apportées à votre instance MySQL source en temps réel et les écrire dans un bucket Cloud Storage.
    • Une fois la migration de remplissage terminée, vous devez utiliser Dataflow pour déplacer la CDC du bucket Cloud Storage vers Spanner. Si Dataflow ne parvient pas à écrire une ligne dans Spanner pour une raison quelconque, il l'écrit dans un répertoire de file d'attente de lettres mortes dans un autre bucket Cloud Storage. La migration CDC relance automatiquement l'écriture des lignes du répertoire de la file d'attente des messages non distribués dans Spanner.

Planifier la migration des données en direct

Vous devez configurer l'infrastructure réseau requise pour que les données circulent entre votre instance MySQL source, Datastream, Dataflow, les buckets Cloud Storage et la base de données Spanner cible. Nous vous recommandons de configurer une connectivité réseau privée pour une migration sécurisée. En fonction des exigences de conformité de votre organisation, vous devrez peut-être configurer la connectivité au réseau public ou privé. Pour en savoir plus sur la connectivité Datastream, consultez Options de connectivité réseau.

Pour planifier la migration des données en direct, vous devrez peut-être demander à l'administrateur réseau de votre organisation d'effectuer les tâches suivantes :

  • Utilisez le VPC par défaut ou créez-en un dans votre projet en respectant les exigences suivantes :
    • L'instance MySQL source doit être disponible sur ce VPC. Vous devrez peut-être créer une règle de pare-feu de sortie sur ce VPC et une règle de pare-feu d'entrée sur le VPC où se trouve l'instance MySQL source.
    • Datastream, Dataflow, les buckets Cloud Storage et la base de données Spanner cible doivent être disponibles sur ce VPC.
    • Vous devez créer une liste d'adresses autorisées sur votre instance MySQL source pour autoriser les connexions depuis le VPC.
  • Déterminez et allouez une plage d'adresses IP dans le VPC que Datastream peut utiliser.
  • Créez un sous-réseau dans le VPC que Dataflow utilisera pour effectuer la migration de remplissage.
  • Créez un sous-réseau dans le VPC pour que Dataflow puisse l'utiliser pour effectuer la migration CDC ultérieurement.

Pour migrer les données actives, procédez comme suit :

  1. Configurer la migration CDC
  2. Effectuez la migration de remplissage.
  3. Terminez la migration CDC une fois la migration de remplissage terminée.

La migration des données en direct nécessite le déploiement et la gestion d'un nombre important de ressources. Spanner fournit deux exemples de modèles Terraform pour chaque phase de la migration des données en direct.

Le modèle de migration à chaud effectue la migration CDC en deux phases :

  • Configurer la migration CDC vers un bucket Cloud Storage à l'aide de Datastream Vous pouvez utiliser une variable Terraform pour empêcher le modèle de créer les jobs Dataflow.
  • Migrez les données CDC vers Spanner depuis le bucket Cloud Storage à l'aide de Dataflow. Vous ne devez effectuer cette phase qu'une fois le modèle Terraform de migration du remplissage terminé.

Le modèle Terraform de migration par remplissage effectue la migration par remplissage de votre instance MySQL source vers Spanner.

Avant de commencer

  • Assurez-vous que Terraform est installé sur votre interface système locale.
  • Créez un compte de service pour exécuter la migration des données en direct. Pour en savoir plus sur la création d'un compte de service, consultez Créer des comptes de service.
  • Pour vous assurer que le compte de service dispose des autorisations nécessaires pour effectuer la migration en direct, demandez à votre administrateur d'attribuer au compte de service les rôles IAM suivants dans votre projet :

    Pour en savoir plus sur l'attribution de rôles, consultez Gérer l'accès aux projets, aux dossiers et aux organisations.

    Ces rôles prédéfinis contiennent les autorisations requises pour effectuer une migration en direct. Pour connaître les autorisations exactes requises, développez la section Autorisations requises :

    Autorisations requises

    Les autorisations suivantes sont requises pour effectuer une migration à chaud :

    • 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

    Votre administrateur peut également attribuer au compte de service ces autorisations avec des rôles personnalisés ou d'autres rôles prédéfinis.

Configurer la migration CDC

Spanner propose un modèle Terraform qui configure le CDC et termine la migration du CDC. Vous pouvez utiliser une variable Terraform pour empêcher le modèle de créer des jobs Dataflow. Le modèle Terraform déploie et gère les ressources suivantes pour configurer la migration CDC :

  • Connexion privée Datastream : une connexion privée Datastream est déployée sur votre VPC configuré.

  • Profil de connexion Datastream source : profil de connexion qui permet à Datastream de se connecter à votre instance MySQL source.

  • Bucket Cloud Storage : bucket Cloud Storage dans lequel Datastream écrit les données.

  • Profil de connexion Datastream cible : ce profil de connexion permet à Datastream de se connecter au bucket Cloud Storage et d'y écrire des données.

  • Flux Datastream : flux Datastream qui lit les données de votre instance MySQL source et les écrit dans le bucket Cloud Storage, comme défini dans les profils de connexion.

  • Sujet et abonnement Pub/Sub : les bucket Cloud Storage envoient des notifications d'objet au sujet Pub/Sub, et Dataflow utilise l'abonnement Pub/Sub pour écrire des données dans Spanner.

  • Notifications de bucket Cloud Storage : notification de bucket Cloud Storage qui publie sur le sujet Pub/Sub.

Préparer la configuration Terraform CDC

Vous pouvez préparer le modèle Terraform pour inclure les configurations de variables Dataflow, mais désactiver la création de jobs 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"
      }
    }
  

Les variables Terraform sont décrites dans la liste suivante :

  • project : ID du projet Google Cloud .
  • region : la région Google Cloud .
  • mysql_host : adresse IP de votre instance MySQL source.
  • mysql_username : nom d'utilisateur de votre instance MySQL source.
  • mysql_password : mot de passe de votre instance MySQL source.
  • mysql_port : numéro de port de l'instance MySQL source.
  • database : nom de votre base de données MySQL source dans l'instance.
  • vpc_name : nom d'un VPC existant utilisé par Datastream.
  • range : plage d'adresses IP du VPC que vous avez réservée pour que Datastream l'utilise.
  • skip_dataflow : définissez cette valeur sur true pour empêcher Dataflow de créer des jobs Dataflow.
  • enable_backfill : définissez cette valeur sur false pour empêcher le modèle Terraform de créer des jobs Dataflow.
  • spanner_database_id : ID de la base de données Spanner cible.
  • spanner_instance_id : ID de l'instance Spanner cible.
  • max_workers : détermine le nombre maximal de nœuds de calcul Dataflow créés.
  • min_workers : détermine le nombre maximal de nœuds de calcul Dataflow créés.
  • network : nom d'un VPC existant qui sera utilisé par Dataflow.
  • subnetwork : nom du sous-réseau désigné dans le VPC dans lequel Dataflow peut créer des nœuds de calcul.

Exécuter le modèle Terraform CDC

Pour effectuer la migration CDC, vous devez exécuter le modèle Terraform :

  1. Initialisez Terraform à l'aide de la commande suivante :

      terraform init
    

  2. Validez les fichiers Terraform à l'aide de la commande suivante :

      terraform plan --var-file=terraform_simple.tfvars
    

  3. Exécutez la configuration Terraform à l'aide de la commande suivante :

      terraform apply --var-file=terraform_simple.tfvars
    

    La configuration Terraform produit un résultat semblable à celui-ci :

    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 diffuse désormais le CDC dans un bucket Cloud Storage. Vous devez effectuer la migration du remplissage et terminer la migration CDC ultérieurement.

Effectuer la migration du remplissage

Spanner propose un modèle Terraform pour effectuer la migration de remplissage. Le modèle Terraform déploie et gère la ressource suivante :

  • Tâche Dataflow : tâche Dataflow qui lit les données de l'instance MySQL source et les écrit dans la base de données Spanner cible.

Préparer la configuration Terraform pour la migration de remplissage

    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"
  

Les variables Terraform sont décrites dans la liste suivante :

  • job_name : nom de la tâche Dataflow.
  • project : ID du projet Google Cloud dans lequel la tâche Dataflow doit s'exécuter.
  • region : la région Google Cloud .
  • working_directory_bucket : bucket Cloud Storage pour importer le fichier de session et créer le répertoire de sortie.
  • working_directory_prefix : préfixe du bucket Cloud Storage pour le répertoire de travail Dataflow.
  • source_config_url : adresse IP de votre instance MySQL source.
  • username : nom d'utilisateur de votre instance MySQL source.
  • password : mot de passe de votre instance MySQL source.
  • instance_id : ID de l'instance Spanner cible.
  • database_id : ID de la base de données Spanner cible.
  • spanner_project_id : ID du projet dans lequel se trouve votre instance Spanner. Cet ID de projet peut être différent de celui sur lequel vous exécutez Dataflow.

Exécuter le modèle Terraform de migration de remplissage

Pour effectuer la migration du remplissage, procédez comme suit :

  1. Initialisez Terraform à l'aide de la commande suivante :

      terraform init
    

  2. Validez les fichiers Terraform à l'aide de la commande suivante :

      terraform plan --var-file=terraform_simple.tfvars
    

  3. Exécutez la configuration Terraform à l'aide de la commande suivante :

      terraform apply --var-file=terraform_simple.tfvars
    

    La configuration Terraform produit un résultat semblable à celui-ci :

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

Lorsque la migration de remplissage ne peut pas écrire de ligne dans Spanner, elle écrit cette ligne dans un répertoire de file d'attente de lettres mortes dans un bucket Cloud Storage.

Vous pouvez réessayer d'écrire ces lignes à partir du répertoire de la file d'attente des messages non distribués dans Spanner avant de terminer la migration CDC.

Pour réessayer d'écrire ces lignes à partir du répertoire de la file d'attente des lettres mortes dans Spanner avant de terminer la migration CDC, exécutez la commande suivante :

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"

Les variables de la commande gcloud CLI sont décrites dans la liste suivante :

  • job_name : nom de la tâche Dataflow.
  • region : la région Google Cloud .
  • inputFilePattern : emplacement du bucket Cloud Storage du modèle de fichier d'entrée.
  • datastreamSourceType : type de source (par exemple, MySQL).
  • instanceId : ID de l'instance Spanner cible.
  • databaseId : ID de la base de données Spanner cible.
  • sessionFilePath : chemin bucket Cloud Storage au fichier de session.
  • deadLetterQueueDirectory : chemin d'accès au répertoire DLQ du bucket Cloud Storage.

Terminer la migration de la CDC

Une fois la migration du remplissage terminée, vous pouvez utiliser Dataflow pour migrer le CDC vers Spanner. Le job Dataflow récupère les événements de modification du bucket Cloud Storage et les écrit dans Spanner.

Une fois que la quasi-totalité des données du bucket Cloud Storage a été écrite dans Spanner, arrêtez les opérations d'écriture sur l'instance MySQL source pour permettre aux modifications restantes d'être écrites dans Spanner.

Cela entraîne un bref temps d'arrêt pendant que Spanner rattrape l'instance MySQL source. Une fois toutes les modifications écrites dans Spanner, votre application peut commencer à utiliser Spanner comme base de données.

Pour terminer la migration CDC, définissez la valeur du paramètre Terraform skip_dataflow sur false, puis réexécutez le modèle Terraform de migration en direct.

Exécutez la configuration Terraform à l'aide de la commande suivante :

      terraform apply --var-file=terraform_simple.tfvars
    

Étapes suivantes