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, você migrou o código e as dependências e concluiu os testes, você pode mudar seu 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 do Spanner de destino. É 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 seguintes duas fases:

  • 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 do Spanner de destino. É necessário usar um modelo de migração em massa do Dataflow para mover os dados da instância de origem do MySQL para o Spanner.
    • Quando a migração de preenchimento falha na gravação de uma linha no Spanner, ela grava essa linha em um diretório de fila de mensagens inativas em um bucket do Cloud Storage. É possível fazer com que a migração de preenchimento de lacunas tente gravar essas linhas no Spanner.
  • Migração da captura de dados alterados (CDC):

    • Essa fase é executada simultaneamente à migração de preenchimento, capturando as mudanças ocorrentes na instância MySQL de origem em tempo real. Essas mudanças são aplicadas ao Spanner depois que a migração de preenchimento é concluída.
    • É necessário usar o Datastream para capturar as mudanças que ocorrem na instância do MySQL de origem 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 vai gravar essa linha em um diretório de fila de mensagens inativas em um bucket diferente do Cloud Storage. A migração do CDC tenta gravar automaticamente as linhas do diretório da fila de mensagens mortas 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 do MySQL de origem, o Datastream, o Dataflow, os buckets do Cloud Storage e o banco de dados do Spanner de destino. Recomendamos configurar a conectividade de rede particular para uma migração segura. Dependendo dos requisitos de compliance 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 seu 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 do MySQL de origem está localizada.
    • O Datastream, o Dataflow, os buckets do Cloud Storage e o banco de dados de destino do Spanner precisam estar disponíveis nesta VPC.
    • É necessário criar uma lista de permissões na instância do MySQL de origem 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 que o Dataflow use para concluir a migração de preenchimento.
  • Crie uma sub-rede na VPC para que o Dataflow a use para concluir a migração do CDC mais tarde.

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

  1. Configurar a migração do CDC.
  2. Faça a migração de preenchimento.
  3. Conclua a migração do CDC depois que a migração de preenchimento for concluída.

A execuçã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 fornece 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 executa a migração do 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. Você só precisa realizar essa fase depois que o modelo do Terraform da migração de preenchimento for concluído.

O modelo de terraform de migração de preenchimento executa 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 ativa, peça ao administrador para conceder à conta de serviço os seguintes papéis do IAM 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 ativa. Para conferir as permissões exatas necessárias, expanda a seção Permissões necessárias:

    Permissões necessárias

    As seguintes permissões 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 do CDC

O Spanner oferece um modelo do Terraform para configurar o CDC e, posteriormente, concluir a migração do CDC. É possível usar uma variável do Terraform para desativar a criação de jobs do Dataflow pelo modelo. O modelo do Terraform implanta e gerencia os seguintes recursos para configurar a migração do CDC:

  • Conexão particular do Datastream: uma conexão particular do Datastream é 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 MySQL de origem.

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

  • Perfil de conexão de destino do Datastream: 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 MySQL de origem 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 objeto 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 CDC Terraform

É 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 do MySQL de origem.
  • mysql_password: sua senha de instância do MySQL de origem.
  • mysql_port: o número da porta da instância de origem do MySQL.
  • database: o nome do banco de dados MySQL de origem na instância.
  • vpc_name: o nome de uma VPC atual que é usada pelo Datastream.
  • range: o intervalo de IP na VPC que você reservou para uso do Datastream.
  • skip_dataflow: defina esse valor como true para impedir que o Dataflow crie jobs.
  • 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 do Spanner de destino.
  • spanner_instance_id: o ID da instância do Spanner de destino.
  • 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 que o Dataflow pode usar para criar workers.

Executar o modelo do CDC no Terraform

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

  1. Use o seguinte comando para inicializar o Terraform:

      terraform init
    

  2. Valide os arquivos do Terraform usando o seguinte comando:

      terraform plan --var-file=terraform_simple.tfvars
    

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

      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 transmite o CDC para um bucket do Cloud Storage. Você precisa realizar a migração de preenchimento e concluir a migração do 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 do MySQL de origem e grava no banco de dados do Spanner de destino.

Como preparar a configuração do Terraform para a 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 Google Cloud projeto em que o job do Dataflow precisa ser executado.
  • 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 do MySQL de origem.
  • password: sua senha de instância do MySQL de origem.
  • instance_id: o ID da instância do Spanner de destino.
  • database_id: o ID do banco de dados do Spanner de destino.
  • spanner_project_id: o ID do projeto em que sua instância do Spanner está. Esse ID pode ser diferente do projeto em que você está executando o Dataflow.

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

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

  1. Use o seguinte comando para inicializar o Terraform:

      terraform init
    

  2. Valide os arquivos do Terraform usando o seguinte comando:

      terraform plan --var-file=terraform_simple.tfvars
    

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

      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 inativas em um bucket do Cloud Storage.

Tente gravar essas linhas do diretório da fila de mensagens inativas no Spanner antes de concluir a migração do CDC.

Para tentar gravar essas linhas do diretório da fila de mensagens inativas no Spanner antes de concluir a migração do CDC, execute o seguinte 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"

As variáveis de comando da gcloud CLI 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 do Spanner de destino.
  • databaseId: o ID do banco de dados do Spanner de destino.
  • 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 DLQ.

Concluir a migração da 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 demais mudanças sejam gravadas no Spanner.

Isso causa um breve período de inatividade enquanto o Spanner alcança a instância do MySQL de origem. 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 do CDC, mude o valor do parâmetro skip_dataflow do Terraform para false e execute novamente a migração ativa do modelo do Terraform.

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

      terraform apply --var-file=terraform_simple.tfvars
    

A seguir