Este documento explica como realizar uma migração de dados ativos 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 ativos e ter certeza de que todos os dados foram transferidos, migre o código e as dependências e conclua os testes. Em seguida, mude o aplicativo para usar o Spanner em vez do banco de dados MySQL de origem.
Você pode realizar uma migração de dados ativos 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 ativos consiste nas duas fases a seguir:
Migração de preenchimento:
- Durante a migração de backfill, o Dataflow lê os dados existentes do banco de dados MySQL de origem e os migra para o banco de dados Spanner de destino. Você precisa 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 backfill 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. É possível fazer com que a migração de backfill tente novamente gravar essas linhas no Spanner.
Migração da 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 depois que a migração de preenchimento é concluída.
- Você precisa usar o Datastream para capturar as mudanças que ocorrem na sua instância de origem do MySQL em tempo real e gravá-las em um bucket do Cloud Storage.
- Depois que a migração de backfill 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 de CDC tenta automaticamente gravar as linhas do diretório da fila de mensagens mortas no Spanner.
Planejar a migração de dados ativos
Você precisa 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 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 ativos, 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.
- Crie uma lista de permissões na sua 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 pode usar.
- Crie uma sub-rede na VPC para o Dataflow usar para concluir a migração de backfill.
- Crie uma sub-rede na VPC para o Dataflow usar e concluir a migração de CDC mais tarde.
Você pode fazer a migração de dados ativos seguindo estas etapas:
- Configurar a migração de CDC.
- Faça a migração de preenchimento.
- Conclua a migração de CDC depois que a migração de backfill terminar.
Para fazer a migração de dados ativos, é necessário implantar e gerenciar um número significativo de recursos. O Spanner oferece dois modelos de exemplo do Terraform para cada fase da migração de dados ativos.
O modelo de migração em tempo real realiza a migração de CDC em duas fases:
- Configurar 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. Realize essa fase somente depois que o modelo do Terraform de migração de backfill for concluído.
O modelo do Terraform de migração de backfill executa a migração de backfill 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 ativos. 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 dinâmica, peça ao administrador para conceder a ela os seguintes papéis do IAM no seu projeto:
-
Administrador do Dataflow (
roles/dataflow.admin
) -
Administrador do Datastream (
roles/datastream.admin
) -
Administrador de segurança (
roles/iam.securityAdmin
) -
Administrador da conta de serviço (
roles/serviceAccountAdmin
) -
Administrador do Pub/Sub (
roles/pubsub.admin
) -
Administrador do Storage (
roles/storage.admin
) -
Administrador de rede do Compute (
roles/compute.networkAdmin
) -
Leitor (
roles/viewer
)
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 dinâmica. 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.
-
Administrador do Dataflow (
Configurar a migração de CDC
O Spanner oferece um modelo do Terraform que configura a CDC e, mais tarde, conclui a migração da 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 de CDC:
Conexão privada do Datastream: uma conexão privada do Datastream é implantada na sua VPC configurada.
Perfil de conexão do Datastream de origem: um perfil de conexão que permite que o Datastream se conecte à sua 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 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 publica no tópico do Pub/Sub.
Como preparar a configuração do Terraform para CDC
Você pode 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 do 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 sua 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 MySQL de origem na instância.vpc_name
: o nome de uma VPC usada pelo Datastream.range
: o intervalo de IP na VPC que você reservou para o Datastream usar.skip_dataflow
: defina esse valor comotrue
para impedir que o Dataflow crie jobs.enable_backfill
: defina esse valor comofalse
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 de CDC
Para realizar a migração da CDC, execute o modelo do Terraform:
Inicialize o Terraform usando o seguinte comando:
terraform init
Valide os arquivos do Terraform usando o seguinte comando:
terraform plan --var-file=terraform_simple.tfvars
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 está transmitindo a CDC para um bucket do Cloud Storage. Você precisa fazer a migração de backfill e concluir a migração de CDC mais tarde.
Fazer a migração de preenchimento
O Spanner oferece um modelo do Terraform para realizar a migração de backfill. 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 para a migração de backfill
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 Google Cloud 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 de origem do MySQL.password
: a senha da sua 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 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 de migração de backfill
Para fazer a migração de preenchimento, faça o seguinte:
Inicialize o Terraform usando o seguinte comando:
terraform init
Valide os arquivos do Terraform usando o seguinte comando:
terraform plan --var-file=terraform_simple.tfvars
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 backfill 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.
É possível tentar gravar essas linhas do diretório da fila de mensagens inativas no Spanner antes de concluir a migração de CDC.
Para tentar gravar novamente essas linhas do diretório da fila de mensagens inativas no Spanner antes de concluir a migração de 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 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 da DLQ.
Concluir a migração da CDC
Depois que a migração de backfill for concluída, use o Dataflow para migrar o CDC para o Spanner. O job do Dataflow usa 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 alcança 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 ativa.
Execute a configuração do Terraform usando o seguinte comando:
terraform apply --var-file=terraform_simple.tfvars