Migração de dados em tempo real do MySQL

Este documento explica como realizar uma migração de dados em tempo real de uma instância de origem do MySQL para o Spanner com tempo de inatividade mínimo usando o Terraform para implantar o Dataflow e o Datastream.

Depois de realizar a migração de dados em tempo real e ter certeza de que todos os dados foram transferidos, o código e as dependências foram migrados e os testes foram concluídos, você pode mudar o aplicativo para usar o Spanner em vez do banco de dados MySQL de origem.

É possível realizar uma migração de dados em tempo real depois de criar o banco de dados de destino do Spanner. É necessário criar um esquema compatível no banco de dados de destino antes de migrar os dados.

Como funciona

A migração de dados em tempo real consiste nas duas fases a seguir:

  • Migração de preenchimento:

    • Durante a migração de preenchimento, o Dataflow lê os dados atuais do banco de dados MySQL de origem e os migra para o banco de dados de destino do Spanner. É necessário usar um modelo do Dataflow de migração em massa para mover os dados da instância de origem do MySQL para o Spanner.
    • Quando a migração de preenchimento não consegue gravar uma linha no Spanner, ela grava essa linha em um diretório de fila de mensagens não entregues em um bucket do Cloud Storage. É possível fazer com que a migração de preenchimento tente gravar essas linhas no Spanner novamente.
  • Migração de captura de dados alterados (CDC):

    • Essa fase é executada simultaneamente com a migração de preenchimento, capturando as mudanças que ocorrem na instância de origem do MySQL em tempo real. Essas mudanças são aplicadas ao Spanner após a conclusão da migração de preenchimento.
    • É necessário usar o Datastream para capturar as mudanças que ocorrem na instância de origem do MySQL em tempo real e gravá-las em um bucket do Cloud Storage.
    • Depois que a migração de preenchimento for concluída, use o Dataflow para mover o CDC do bucket do Cloud Storage para o Spanner. Se o Dataflow não conseguir gravar uma linha no Spanner por qualquer motivo, ele gravará essa linha em um diretório de fila de mensagens não entregues em um bucket diferente do Cloud Storage. A migração de CDC tenta gravar automaticamente as linhas do diretório de fila de mensagens não entregues no Spanner.

Planejar a migração de dados em tempo real

É necessário configurar a infraestrutura de rede necessária para que os dados fluam entre a instância de origem do MySQL, o Datastream, o Dataflow, os buckets do Cloud Storage e o banco de dados de destino do Spanner. Recomendamos configurar a conectividade de rede privada para uma migração segura. Dependendo dos requisitos de conformidade da sua organização, talvez seja necessário configurar a conectividade de rede pública ou privada. Para mais informações sobre a conectividade do Datastream, consulte Opções de conectividade de rede.

Para planejar a migração de dados em tempo real, talvez seja necessário que o administrador de rede da sua organização realize as seguintes tarefas:

  • Use a VPC padrão ou crie uma nova VPC no projeto com os seguintes requisitos:
    • A instância de origem do MySQL precisa estar disponível nessa VPC. Talvez seja necessário criar uma regra de firewall de saída nessa VPC e uma regra de firewall de entrada na VPC em que a instância de origem do MySQL está localizada.
    • O Datastream, o Dataflow, os buckets do Cloud Storage e o banco de dados de destino do Spanner precisam estar disponíveis nessa VPC.
    • É necessário criar uma lista de permissões na instância de origem do MySQL para permitir conexões da VPC.
  • Determine e aloque um intervalo de endereços IP na VPC que o Datastream possa usar.
  • Crie uma sub-rede na VPC para o Dataflow usar para concluir a migração de preenchimento.
  • Crie uma sub-rede na VPC para o Dataflow usar para concluir a migração de CDC mais tarde.

Para realizar uma migração de dados em tempo real, siga estas etapas:

  1. Configure a migração de CDC.
  2. Realize a migração de preenchimento.
  3. Conclua a migração de CDC após a migração de preenchimento.

A realização da migração de dados em tempo real exige a implantação e o gerenciamento de um número significativo de recursos. O Spanner oferece dois modelos de exemplo do Terraform para cada fase da migração de dados em tempo real.

O modelo de migração em tempo real realiza a migração de CDC em duas fases:

  • Configure a migração de CDC para um bucket do Cloud Storage usando o Datastream. É possível usar uma variável do Terraform para impedir que o modelo crie os jobs do Dataflow.
  • Migre o CDC para o Spanner do bucket do Cloud Storage usando o Dataflow. Essa fase só pode ser realizada depois que o modelo do Terraform de migração de preenchimento for concluído.

O modelo do Terraform de migração de preenchimento realiza a migração de preenchimento da instância de origem do MySQL para o Spanner.

Antes de começar

  • Verifique se o Terraform está instalado no shell local.
  • Crie uma conta de serviço para executar a migração de dados em tempo real. Para mais informações sobre como criar uma conta de serviço, consulte Criar contas de serviço.
  • Para garantir que a conta de serviço tenha as permissões necessárias para realizar a migração em tempo real, peça ao administrador para conceder os seguintes papéis do IAM à conta de serviço no projeto:

    Para mais informações sobre a concessão de papéis, consulte Gerenciar o acesso a projetos, pastas e organizações.

    Esses papéis predefinidos contêm as permissões necessárias para realizar a migração em tempo real. Para acessar as permissões exatas que são necessárias, expanda a seção Permissões necessárias:

    Permissões necessárias

    As permissões a seguir são necessárias para realizar a migração em tempo real:

    • 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

    O administrador também pode conceder essas permissões à conta de serviço com papéis personalizados ou outros papéis predefinidos.

Configurar a migração de CDC

O Spanner oferece um modelo do Terraform que configura o CDC e, mais tarde, conclui a migração de CDC. É possível usar uma variável do Terraform para impedir que o modelo crie os jobs do Dataflow. O modelo do Terraform implanta e gerencia os seguintes recursos para configurar a migração de CDC:

  • Conexão privada do Datastream: uma conexão privada do Datastream conexão privada é implantada na VPC configurada.

  • Perfil de conexão de origem do Datastream: um perfil de conexão que permite que o Datastream se conecte à instância de origem do MySQL.

  • Bucket do Cloud Storage: um bucket do Cloud Storage em que o Datastream grava os dados.

  • Perfil de conexão de destino do Datastream: esse perfil de conexão permite que o Datastream se conecte e grave no bucket do Cloud Storage.

  • Stream do Datastream: um stream do Datastream que lê da instância de origem do MySQL e grava no bucket do Cloud Storage conforme definido nos perfis de conexão.

  • Tópico e assinatura do Pub/Sub: o bucket do Cloud Storage envia notificações de objetos para o tópico do Pub/Sub, e o Dataflow consome a assinatura do Pub/Sub para gravar dados no Spanner.

  • Notificações de bucket do Cloud Storage: uma notificação de bucket do Cloud Storage que é publicada no tópico do Pub/Sub.

Como preparar a configuração do Terraform do CDC

É possível preparar o modelo do Terraform para incluir configurações de variáveis do Dataflow, mas desativar a criação de jobs do 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"
      }
    }
  

As variáveis do Terraform são descritas na lista a seguir:

  • project: o ID do projeto. Google Cloud
  • region: a Google Cloud região.
  • mysql_host: o endereço IP da instância de origem do MySQL.
  • mysql_username: o nome de usuário da instância de origem do MySQL.
  • mysql_password: a senha da instância de origem do MySQL.
  • mysql_port: o número da porta da instância de origem do MySQL.
  • database: o nome do banco de dados de origem do MySQL na instância.
  • vpc_name: o nome de uma VPC atual usada pelo Datastream.
  • range: o intervalo de IP na VPC que você reservou para o Datastream usar.
  • skip_dataflow: defina esse valor como true para impedir que o Dataflow crie jobs do Dataflow.
  • enable_backfill: defina esse valor como false para impedir que o modelo do Terraform crie jobs do Dataflow.
  • spanner_database_id: o ID do banco de dados de destino do Spanner.
  • spanner_instance_id: o ID da instância de destino do Spanner.
  • max_workers: determina o número máximo de workers que o Dataflow cria.
  • min_workers: determina o número máximo de workers que o Dataflow cria.
  • network: o nome de uma VPC atual que será usada pelo Dataflow.
  • subnetwork: o nome da sub-rede designada na VPC em que o Dataflow pode criar workers.

Executar o modelo do Terraform do CDC

Para realizar a migração de CDC, é necessário executar o modelo do Terraform:

  1. Inicialize o Terraform usando o comando a seguir:

      terraform init
    

  2. Valide os arquivos do Terraform usando o comando a seguir:

      terraform plan --var-file=terraform_simple.tfvars
    

  3. Execute a configuração do Terraform usando o comando a seguir:

      terraform apply --var-file=terraform_simple.tfvars
    

    A configuração do Terraform produz uma saída semelhante a esta:

    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"
    }
    

O Datastream agora está transmitindo o CDC para um bucket do Cloud Storage. É necessário realizar a migração de preenchimento e concluir a migração de CDC mais tarde.

Realizar a migração de preenchimento

O Spanner oferece um modelo do Terraform para realizar a migração de preenchimento. O modelo do Terraform implanta e gerencia o seguinte recurso:

  • Job do Dataflow: o job do Dataflow que lê da instância de origem do MySQL e grava no banco de dados de destino do Spanner.

Como preparar a configuração do Terraform de migração de preenchimento

    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"
  

As variáveis do Terraform são descritas na lista a seguir:

  • job_name: o nome do job do Dataflow.
  • project: o ID do projeto em que o job do Dataflow precisa ser executado. Google Cloud
  • region: a Google Cloud região.
  • working_directory_bucket: o bucket do Cloud Storage para fazer upload do arquivo de sessão e criar o diretório de saída.
  • working_directory_prefix: o prefixo do bucket do Cloud Storage para o diretório de trabalho do Dataflow.
  • source_config_url: o endereço IP da instância de origem do MySQL.
  • username: o nome de usuário da instância de origem do MySQL.
  • password: a senha da instância de origem do MySQL.
  • instance_id: o ID da instância de destino do Spanner.
  • database_id: o ID do banco de dados de destino do Spanner.
  • spanner_project_id: o ID do projeto em que a instância do Spanner está. Esse ID do projeto pode ser diferente do projeto em que você está executando o Dataflow.

Executar o modelo do Terraform de migração de preenchimento

Para realizar a migração de preenchimento, faça o seguinte:

  1. Inicialize o Terraform usando o comando a seguir:

      terraform init
    

  2. Valide os arquivos do Terraform usando o comando a seguir:

      terraform plan --var-file=terraform_simple.tfvars
    

  3. Execute a configuração do Terraform usando o comando a seguir:

      terraform apply --var-file=terraform_simple.tfvars
    

    A configuração do Terraform produz uma saída semelhante a esta:

    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 a migração de preenchimento não consegue gravar uma linha no Spanner, ela grava essa linha em um diretório de fila de mensagens não entregues em um bucket do Cloud Storage.

É possível tentar gravar essas linhas do diretório de fila de mensagens não entregues no Spanner antes de concluir a migração de CDC.

Para tentar gravar essas linhas do diretório de fila de mensagens não entregues no Spanner antes de concluir a migração de CDC, execute o comando a seguir:

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"

As variáveis de comando da CLI gcloud são descritas na lista a seguir:

  • job_name: o nome do job do Dataflow.
  • region: a Google Cloud região.
  • inputFilePattern: o local do bucket do Cloud Storage do padrão de arquivo de entrada.
  • datastreamSourceType: o tipo de origem, por exemplo, MySQL.
  • instanceId: o ID da instância de destino do Spanner.
  • databaseId: o ID do banco de dados de destino do Spanner.
  • sessionFilePath: o caminho do bucket do Cloud Storage para o arquivo de sessão.
  • deadLetterQueueDirectory: o caminho do bucket do Cloud Storage para o diretório de DLQ.

Concluir a migração de CDC

Depois que a migração de preenchimento for concluída, use o Dataflow para migrar o CDC para o Spanner. O job do Dataflow extrai os eventos de mudança do bucket do Cloud Storage e os grava no Spanner.

Depois que quase todos os dados do bucket do Cloud Storage forem gravados no Spanner, interrompa as gravações na instância de origem do MySQL para permitir que as mudanças restantes sejam gravadas no Spanner.

Isso causa um breve período de inatividade enquanto o Spanner acompanha a instância de origem do MySQL. Depois que todas as mudanças forem gravadas no Spanner, o aplicativo poderá começar a usar o Spanner como banco de dados.

Para concluir a migração de CDC, mude o valor do parâmetro skip_dataflow do Terraform para false e execute novamente o modelo do Terraform de migração em tempo real .

Execute a configuração do Terraform usando o comando a seguir:

      terraform apply --var-file=terraform_simple.tfvars
    

A seguir