Como realizar a replicação a partir de um servidor externo (v1)

Nesta página, descreveremos como criar uma configuração que replica dados a partir de um servidor de banco de dados de origem para réplicas do MySQL.

O servidor de banco de dados de origem pode ser qualquer servidor MySQL que atenda a todos os requisitos de servidor, incluindo instâncias do Cloud SQL. As instâncias hospedadas por outros provedores de nuvem também podem servir como fonte de dados, desde que atendam a todos os requisitos, incluindo o suporte a GTID.

Para informações mais detalhadas sobre essa configuração, consulte Sobre a replicação de um servidor externo.

Antes de começar

Antes de configurar a replicação por um servidor externo, é necessário concluir as seguintes etapas:

  • Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  • In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  • Make sure that billing is enabled for your Google Cloud project.

  • In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  • Make sure that billing is enabled for your Google Cloud project.

  • Enable the Cloud SQL Admin API.

    Enable the API

  • Instale e autentique a CLI gcloud.
  • Verifique se os seus servidores atendem aos requisitos de servidor de banco de dados de origem.
  • Determine o nível de segurança necessário para as conexões entre a instância principal e a réplica e consiga os arquivos de certificado necessários.
  • Decida qual região do Google Cloud você quer usar para conter a réplica do Cloud SQL.
  • Reúna as informações necessárias sobre seu servidor de banco de dados de origem:

    • endereço IPv4 externo e número da porta

      Por padrão, o MySQL usa a porta 3306.

    • conta de usuário e senha de replicação do MySQL
    • número da versão do MySQL
    • localização de todos os certificados e chaves SSL/TLS necessários, dependendo do nível de segurança selecionado
  • Esteja preparado para atualizar o firewall de rede do seu servidor de banco de dados de origem para aceitar conexões da réplica do Cloud SQL.

    Esta etapa precisa ser concluída dentro de 30 minutos após a criação da réplica.

  • Se você não for um proprietário de projeto, precisará ter o papel Storage Admin.

Requisitos para o servidor de banco de dados de origem

Antes de replicar de um servidor externo para uma réplica do Cloud SQL, verifique se o servidor de banco de dados de origem atende a estes requisitos de configuração:

Processo de configuração

Para configurar a replicação de um servidor de banco de dados externo, execute as seguintes etapas:

  1. Crie um bucket do Cloud Storage para seus dados.
  2. Exporte seus dados para o Cloud Storage.
  3. Defina a configuração de replicação.
  4. Configure o servidor de banco de dados de origem para que aceite conexões da réplica.

  5. Restrinja o acesso ao usuário de replicação do MySQL.

  6. Finalize a configuração da réplica.

  7. Confirme o status de replicação.

  8. Limpe o armazenamento.

1. Crie um bucket do Cloud Storage para seus dados

Crie um bucket para reter temporariamente seus dados durante o processo de exportação ou use um bucket existente.

Para mais informações sobre como criar um bucket, consulte Como criar buckets de armazenamento. Para mais informações sobre o papel Administrador do Storage, consulte Papéis de IAM do Cloud Storage.

2. Exporte seus dados para o Cloud Storage

A réplica procura seus dados no Cloud Storage. Portanto, coloque uma cópia dos dados do servidor nele. Você pode continuar aceitando operações de gravação no seu servidor após a exportação. Depois que a réplica termina de importar o arquivo dump, é iniciado o processamento de todas as alterações que ocorreram desde que a exportação foi feita e, por fim, a principal é alcançada.

Em uma máquina com a CLI gcloud instalada e conectividade de rede com o servidor MySQL, execute o seguinte comando:

mysqldump \
    -h [PRIMARY_INSTANCE_IP] -P [PRIMARY_INSTANCE_PORT] -u [USERNAME] -p \
    --databases [DBS]  \
    --hex-blob  --skip-triggers  --master-data=1  \
    --order-by-primary --no-autocommit \
    --default-character-set=utf8mb4 \
    --single-transaction --set-gtid-purged=on | gzip | \
    gcloud storage cp - gs://[BUCKET]/[PATH_TO_DUMP]

If the source of the migration is a Relational Database Service (RDS) for MySQL,
the master-data flag is not supported and should not be specified.
This command might look like the following example:

mysqldump \
    -h [PRIMARY_INSTANCE_IP] -P [PRIMARY_INSTANCE_PORT] -u [USERNAME] -p \
    --databases [DBS]  \
    --hex-blob  --skip-triggers \
    --order-by-primary --no-autocommit \
    --default-character-set=utf8mb4 \
    --single-transaction --set-gtid-purged=on | gzip | \
    gcloud storage cp - gs://[BUCKET]/[PATH_TO_DUMP]

Additionally, you should configure RDS instances to retain binlogs for a
a longer period of time.
This command might look like the following example:

// Sets the retention period to one day.
call mysql.rds_set_configuration('binlog retention hours', 24);

Substitua [PROPERTIES_IN_BRACKETS] pelos seguintes valores:

Propriedade Valor
[PRIMARY_INSTANCE_IP] O endereço IPv4 do servidor de banco de dados de origem.
[PRIMARY_INSTANCE_PORT] A porta do servidor de banco de dados de origem.
[USERNAME] A conta do usuário de replicação do MySQL.
[PASSWORD] A senha da conta de usuário de replicação do MySQL.
[DBS] Lista separada por espaço com todos os bancos de dados do servidor de origem, exceto os bancos de dados do sistema (sys, mysql, performance_schema e information_schema). Use o comando SHOW DATABASES MySQL para listar seus bancos de dados.
[BUCKET] O nome do bucket que você criou para reter o arquivo de exportação.
[PATH_TO_DUMP] O caminho do arquivo de exportação.

Caso seja exibido um aviso sobre despejos parciais e GTIDs, isso é esperado.

Esse comando pode se parecer com o seguinte exemplo:

mysqldump \
    -h 192.0.2.1 -P 3306 -u replicationUser \
    --databases guestbook  \
    --hex-blob  --skip-triggers  --master-data=1  \
    --order-by-primary --no-autocommit \
    --default-character-set=utf8mb4 \
    --single-transaction --set-gtid-purged=on | gzip | \
    gcloud storage cp - gs://export-bucket/hq-primary1.sql.gz

3. Crie a configuração de replicação

Se a réplica estiver usando um IP particular, o servidor de banco de dados de origem precisará ser configurado para acesso pela VPC da réplica. A criação de réplicas em VPCs particulares só é suportada pelo CLI gcloud e pela API Cloud SQL Admin.

Console

Esta etapa cria a réplica do Cloud SQL e a instância de representação de origem.

  1. Abra a lista de instâncias do Cloud SQL no Console do Google Cloud.

    Abrir a lista de instâncias

  2. Clique em Migrar dados na barra de botões para abrir o Cloud SQL Migration Assistant.

  3. Clique em Iniciar migração.

  4. No campo Nome do banco de dados de origem, forneça um nome para a configuração de replicação no Cloud SQL.

    Esse nome é uma referência para a configuração, use qualquer nome válido de instância do Cloud SQL.

  5. Digite o endereço IP e o número da porta do seu servidor de banco de dados de origem.

  6. Informe o nome e a senha do usuário do MySQL que serão usados para a conexão de replicação.

  7. Selecione a versão do MySQL do seu servidor de banco de dados de origem.

  8. Se você estiver usando SSL/TLS para a conexão entre a réplica e o servidor de banco de dados de origem (recomendado), selecione Ativar segurança de SSL/TLS e forneça as informações do certificado de SSL/TLS para seu servidor de origem.

    Para saber mais informações sobre opções de SSL/TLS, consulte Opções de SSL/TLS.

  9. Clique em Avançar e preencha os detalhes da sua réplica.

    Para garantir que a importação aconteça da maneira mais eficiente possível, configure a réplica com armazenamento suficiente para conter o banco de dados. Dimensione os núcleos e a memória de forma que eles sejam semelhantes ao servidor de origem.

  10. Informe o caminho do arquivo dump que você enviou para o Cloud Storage anteriormente.

  11. Clique em Criar para criar a réplica.

  12. Clique em Próxima.

gcloud

  1. Crie a instância de representação de origem.

    gcloud beta sql instances create [REPLICA_NAME] \
        --region=[REGION] --database-version=[MYSQL_VERSION] \
        --source-ip-address=[SOURCE_IP] --source-port=[SOURCE_PORT]
    

    Se a réplica estiver usando um endereço IP particular, adicione também: --network=[VPC_NETWORK_NAME]

    Substitua [PROPERTIES_IN_BRACKETS] pelos seguintes valores:

    Propriedade Valor
    [SOURCE_REPRESENTATION_NAME] O nome da instância de representação de origem. Use qualquer nome válido de instância do Cloud SQL.
    [REGION] A região onde você quer que suas réplicas do Cloud SQL fiquem.
    [MYSQL_VERSION] A versão do MySQL em execução no seu servidor de banco de dados de origem: MYSQL_5_6 ou MYSQL_5_7.
    [SOURCE_IP] O endereço IPv4 acessível externamente do servidor de banco de dados de origem.
    [SOURCE_PORT] A porta acessível externamente do servidor de banco de dados de origem.
  2. Crie a réplica do Cloud SQL:

    gcloud beta sql instances create [REPLICA_NAME] \
        --master-instance-name=[SOURCE_REPRESENTATION_NAME] \
        --master-username=[USERNAME] --prompt-for-master-password \
        --master-dump-file-path=gs://[BUCKET]/[PATH_TO_DUMP] \
        --master-ca-certificate-path=[SOURCE_SERVER_CA_PATH] \
        --client-certificate-path=[CLIENT_CERT_PATH] \
        --client-key-path=[PRIVATE_KEY_PATH] \
        --tier=[MACHINE_TYPE] --storage-size=[DISK_SIZE]
    

    Se a réplica estiver usando um endereço IP particular, adicione também: --network=[VPC_NETWORK_NAME]

    Substitua [PROPERTIES_IN_BRACKETS] pelos seguintes valores:

    Propriedade Valor
    [REPLICA_NAME] O nome da réplica de leitura do Cloud SQL. Use qualquer nome válido de instância do Cloud SQL.
    [SOURCE_REPRESENTATION_NAME] O nome da instância de representação de origem que você criou na etapa anterior.
    [USERNAME] A conta do usuário de replicação do MySQL no servidor de banco de dados de origem.
    [BUCKET] O nome do bucket que você criou para reter o arquivo de exportação.
    [PATH_TO_DUMP] O caminho do arquivo de exportação.
    [SOURCE_SERVER_CA_PATH] O caminho local de onde o certificado de CA do servidor de banco de dados de origem está armazenado. Necessário apenas para SSL/TLS.
    [CLIENT_CERT_PATH] O caminho local de onde o certificado do cliente está armazenado. Necessário apenas para autenticação de servidor e cliente.
    [PRIVATE_KEY_PATH] O caminho local onde o arquivo de chave privada do certificado do cliente está armazenado. Necessário apenas para autenticação de servidor e cliente.
    [MACHINE_TYPE] O tamanho da sua réplica. Geralmente, a réplica tem aproximadamente o mesmo tamanho que o servidor de banco de dados de origem. Se você não tiver certeza de qual tipo de máquina usar, comece com db-custom-2-7680. Será possível alterar o tamanho mais tarde, se necessário.
    [DISK_SIZE] O tamanho de armazenamento da réplica em GB. Para ter o melhor desempenho, crie a réplica com armazenamento suficiente para conter o arquivo de importação inteiro.
    [VPC_NETWORK_NAME] VPC no formato de: projects/[PROJECT_ID]/global/networks/[NETWORK_NAME]

cURL

1. Crie a instância de representação de origem do Cloud SQL

gcloud auth login
ACCESS_TOKEN="$(gcloud auth print-access-token)"
curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
     --header 'Content-Type: application/json' \
     --data '{
         "name": "[SOURCE_REPRESENTATION_NAME]",
         "region": "[REGION]",
         "databaseVersion": "[MYSQL_VERSION]",
         "onPremisesConfiguration": {
             "hostPort": "[SOURCE_SERVER_IP]:[SOURCE_SERVER_PORT]"
         }
     }' \
     -X POST \
     https://www.googleapis.com/sql/v1beta4/projects/[PROJECT-ID]/instances

Substitua [PROPERTIES_IN_BRACKETS] pelos seguintes valores:

Propriedade Valor
[SOURCE_REPRESENTATION_NAME] O nome da instância de representação de origem. Use qualquer nome válido de instância do Cloud SQL.
[REGION] A região onde você quer que suas réplicas do Cloud SQL fiquem.
[MYSQL_VERSION] A versão do MySQL em execução no seu servidor de banco de dados de origem: MYSQL_5_6 ou MYSQL_5_7.
[SOURCE_SERVER_IP] O endereço IPv4 acessível externamente do servidor de banco de dados de origem.
[SOURCE_SERVER_PORT] A porta acessível externamente do servidor de banco de dados de origem.
[PROJECT_ID] O ID do projeto do Google Cloud.

Por exemplo, para criar uma instância de representação de origem denominada hq-primary1 para um servidor de banco de dados de origem com o endereço IP 192.0.2.0 aberto na porta 3306, em execução no MySQL 5.7, para réplicas do Cloud SQL no projeto MyProject e na região us-central1, você usa os seguintes comandos:

gcloud auth login
ACCESS_TOKEN="$(gcloud auth print-access-token)"
curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
     --header 'Content-Type: application/json' \
     --data '{
         "name": "hq-primary1",
         "region": "us-central1",
         "databaseVersion": "MYSQL_5_7",
         "onPremisesConfiguration": {
             "hostPort": "192.0.2.0:3306"
         }
     }' \
     -X POST \
     https://www.googleapis.com/sql/v1beta4/projects/MyProject/instances

2. Crie a réplica do Cloud SQL

Nesta etapa, você cria uma réplica de leitura do Cloud SQL usando o servidor de representação de origem para representar esse servidor e fornece a réplica com os dados carregados no Cloud Storage na etapa anterior.

Como essa chamada de API requer que você forneça informações confidenciais, use um arquivo JSON para fornecer seus dados para cURL, em vez de fornecê-los na linha de comando.

Crie o arquivo de dados:

{
    "replicaConfiguration": {
        "mysqlReplicaConfiguration": {
            "username": "[USERNAME]",
            "password": "[PASSWORD]",
            "dumpFilePath": "gs://[BUCKET]/[PATH_TO_DUMP]",
            "caCertificate": "[SOURCE_SERVER_CA]",
            "clientCertificate": "[CLIENT_CERT]",
            "clientKey": "[PRIVATE_KEY]"
        }
     },
     "settings": {
         "tier": "[MACHINE_TYPE]",
         "dataDiskSizeGb": "[DISK_SIZE]"
     },
     "masterInstanceName": "[SOURCE_REPRESENTATION_NAME]",
     "region": "[REGION]",
     "databaseVersion": "[MYSQL_VERSION]",
     "name": "[REPLICA_NAME]"
}

Se a réplica estiver usando um endereço IP particular, adicione também às configurações: "ipConfiguration.privateNetwork" com o valor no formato "projects/[PROJECT_ID]/global/networks/[NETWORK_NAME]".

Substitua [PROPERTIES_IN_BRACKETS] pelos seguintes valores:

Propriedade Valor
[USERNAME] A conta do usuário de replicação do MySQL no servidor de banco de dados de origem.
[PASSWORD] A senha da conta de usuário de replicação do MySQL.
[BUCKET] O nome do bucket que você criou para reter o arquivo de exportação.
[PATH_TO_DUMP] O caminho do arquivo de exportação.
[SOURCE_SERVER_CA] O certificado de CA do servidor de banco de dados de origem. Necessário apenas para SSL/TLS. Cole o certificado no corpo da solicitação.
[CLIENT_CERT] O certificado do cliente. Necessário apenas para autenticação servidor-cliente. Cole o certificado no corpo da solicitação.
[PRIVATE_KEY] O arquivo de chave privada para o certificado do cliente. Necessário apenas para autenticação servidor-cliente. Cole a chave no corpo da solicitação.
[MACHINE_TYPE] O tamanho da sua réplica. Geralmente, a réplica tem aproximadamente o mesmo tamanho que o servidor de banco de dados de origem. Se você não tiver certeza de qual tipo de máquina usar, comece com db-custom-2-7680. Será possível alterar o tamanho mais tarde, se necessário.
[DISK_SIZE] O tamanho de armazenamento da réplica em GB. Para ter o melhor desempenho, crie a réplica com armazenamento suficiente para conter o arquivo de importação inteiro.
[SOURCE_REPRESENTATION_NAME] O nome da instância de representação de origem que você criou anteriormente.
[REGION] A região onde você criou a instância de representação de origem. As réplicas de leitura precisam estar na mesma região que a instância de representação de origem.
[MYSQL_VERSION] A versão do MySQL em execução no seu servidor de banco de dados de origem: MYSQL_5_6 ou MYSQL_5_7.
[REPLICA_NAME] O nome da réplica de leitura do Cloud SQL. Use qualquer nome válido de instância do Cloud SQL.

Na linha de comando, chame a API:

gcloud auth login
ACCESS_TOKEN="$(gcloud auth print-access-token)"
curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
     --header 'Content-Type: application/json' \
     --data @[PATH_TO_DATA_FILE] \
     -X POST \
     https://www.googleapis.com/sql/v1beta4/projects/[PROJECT-ID]/instances

Para a instância de representação de origem e o bucket criados anteriormente, o arquivo de dados data.json pode ter a seguinte aparência:

{
    "replicaConfiguration": {
        "mysqlReplicaConfiguration": {
            "username": "replicationUser",
            "password": "486#@%*@",
            "dumpFilePath": "gs://export-bucket/hq-primary1.sql.gz",
            "caCertificate": "[SOURCE_SERVER_CA]",
            "clientCertificate": "[CLIENT_CERT]",
            "clientKey": "[PRIVATE_KEY]"
        }
    },
    "settings": {
        "tier": "db-custom-4-15360",
        "dataDiskSizeGb": "100"
    },
    "masterInstanceName": "hq-primary1",
    "region": "us-central1",
    "databaseVersion": "MYSQL_5_7",
    "name": "hq-primary1-replica1"
}

O comando cURL ficaria assim:

curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
     --header 'Content-Type: application/json' \
     --data @./data.json
     -X POST \
     https://www.googleapis.com/sql/v1beta4/projects/MyProject/instances

Quando a réplica de leitura puder acessar o arquivo dump, ela iniciará o processo de importação. A duração do processo de importação depende do tamanho do arquivo dump, do tipo de máquina de réplica e do esquema do banco de dados. Como uma estimativa geral, espere que a réplica importe de 25 a 50 GB por hora.

A réplica permanecerá no estado PENDING_CREATE até que o processo de importação seja concluído. Em seguida, a réplica passará para o estado RUNNABLE.

4. Configure o servidor do banco de dados de origem para aceitar conexões da réplica

A réplica precisa se conectar ao servidor de banco de dados de origem para que a replicação seja bem-sucedida. Se o servidor de banco de dados de origem estiver protegido por firewall ou alguma outra restrição de rede, será preciso permitir o acesso à rede para a réplica, usando o endereço IP OUTGOING da réplica. Observe que não se trata do endereço IP exibido na listagem principal da réplica no console do Google Cloud. Para recuperar o endereço IP OUTGOING, passe o cursor sobre a dica Mais informações do endereço IP ou use o comando gcloud abaixo.

  1. Recupere os endereços IP da réplica de leitura:

    gcloud sql instances describe [REPLICA_NAME] --format="default(ipAddresses)"
  2. Configure o firewall da rede, se necessário, para que seu servidor de banco de dados de origem aceite conexões do endereço IP OUTGOING.
  3. Confirme se a réplica foi conectada com êxito ao servidor de banco de dados de origem.

    1. O ícone da réplica na página de listagem de instâncias não está mais girando e está verde.
    2. Acesse o visualizador de registros no console do Google Cloud:

      Acessar o Visualizador de registros

    3. Selecione a réplica no menu suspenso Instância.
    4. Selecione o arquivo de registros replication-setup.log.

      Se a réplica não conseguir se conectar ao servidor de banco de dados de origem, confirme os seguintes itens:

      • Qualquer firewall no servidor do banco de dados de origem está configurado para permitir conexões a partir do endereço IP OUTGOING da réplica.
      • Sua configuração SSL/TLS está correta.
      • Seu usuário, host e senha de replicação estão corretos.

5. Restrinja o acesso ao usuário de replicação do MySQL

Esta etapa é opcional, mas recomendada por questões de segurança.

O usuário de replicação do MySQL no servidor de banco de dados de origem está configurado para aceitar conexões de qualquer host (%). Atualize essa conta de usuário para aceitar conexões somente do endereço IP OUTGOING da réplica:

    UPDATE mysql.user SET Host='[OUTGOING_IP]' WHERE Host='%' AND User='[USERNAME]';
    FLUSH PRIVILEGES;

6. Finalize a configuração da réplica

  1. Configure uma conta de usuário na réplica.

    Para isso, use o Console do Google Cloud, a ferramenta CLI gcloud ou a API Cloud SQL. No entanto, não é possível usar o cliente mysql. Para mais informações sobre usuários do MySQL, consulte usuários do MySQL.

    Para criar um usuário com o console do Google Cloud:

    1. Acesse a página "Instâncias" do Cloud SQL no Console do Google Cloud.
      Acessar a página "Instâncias" do Cloud SQL
    2. Clique no nome da instância para abrir a página Detalhes da instância.
    3. Selecione a guia Usuários.
    4. Clique em Criar conta de usuário.
    5. Na caixa de diálogo Criar conta de usuário, especifique os detalhes do seu usuário.
    6. Clique em Criar.
  2. Autorize o acesso à réplica proveniente de qualquer cliente que você planeje usar para se conectar à réplica usando endereços IP públicos.

    Para instruções, consulte Como adicionar um endereço ou intervalo de endereços autorizado. Para se conectar à réplica, use o endereço IP PRIMARY da réplica. Esse endereço IP é exibido no console do Google Cloud.

    É possível usar qualquer outro método de conexão para se conectar à réplica.

7. Confirme o status de replicação

Quando a réplica termina a importação do arquivo dump, ela se conecta ao servidor local e aplica todas as atualizações feitas após a exportação.

É importante verificar o status da replicação antes de promover a réplica para uma instância autônoma. Se o processo de replicação não estiver concluído e bem-sucedido, uma réplica promovida não terá todas as alterações da instância externa dela.

8. (Opcional) Promova a réplica a uma instância autônoma

Depois de verificar o status da replicação, se você quiser substituir completamente (migrar) o servidor de banco de dados de origem pelo Cloud SQL, promova a réplica para que ela se torne uma instância principal e independente. Depois que a réplica se torna a instância principal, ela não está mais conectada ao servidor original do banco de dados de origem.

Crie uma nova réplica para a nova instância principal e reinicie os aplicativos de conexão para que eles apontem para a nova instância principal (no caso de operações de gravação) ou para a nova réplica (no caso de operações de leitura).

9. Limpe seu armazenamento

  1. Exclua o arquivo de exportação:

    gcloud storage rm gs://[BUCKET]/[PATH_TO_DUMP]
    
  2. Caso você não precise mais do bucket, exclua-o:

    gcloud storage rm gs://[BUCKET] --recursive
    

Para mais informações, consulte a documentação do Cloud Storage sobre Como excluir objetos e Como excluir buckets.

Atualizar a configuração

Para atualizar as definições de configuração posteriormente, edite a instância de representação de origem. Se você precisar atualizar as definições de configuração local, saiba que não é possível atualizar hostPort e type.

A seguir