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

Nesta página, descrevemos como criar uma configuração que replica dados de um servidor de banco de dados de origem em réplicas do Cloud SQL. Essa configuração às vezes é chamada de configuração do mestre externo.

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 origem de dados, desde que atendam a todos os requisitos, incluindo a compatibilidade com 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:

  • Faça login na sua Conta do Google.

    Se você ainda não tiver uma, inscreva-se.

  • No Console do Cloud, na página de seletor de projetos, selecione ou crie um projeto do Cloud.

    Acessar a página do seletor de projetos

  • Verifique se a cobrança está ativada para o seu projeto do Google Cloud. Saiba como confirmar se a cobrança está ativada para o seu projeto.

  • Ative a API Cloud SQL Admin.

    Ative a API

  • Instale e autentique a ferramenta de linha de comando 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 o mestre e as réplicas e providencie os arquivos de certificado necessários.
  • Decida em qual região do Google Cloud suas réplicas do Cloud SQL residirão.
  • 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
    • Local 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 aceitar conexões provenientes da réplica.

  5. Restrinja o acesso do 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 atual.

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 a importação do arquivo dump, ela inicia o processamento de todas as alterações que ocorreram desde que a exportação foi feita e, por fim, o mestre é alcançado.

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

mysqldump \
    -h [MASTER_IP] -P [MASTER_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 | \
    gsutil cp - gs://[BUCKET]/[PATH_TO_DUMP]

Se a origem da migração for um serviço de banco de dados relacional (RDS, na sigla em inglês) para MySQL, a sinalização de dados do mestre não será permitida. Esse comando pode se parecer com o seguinte exemplo:

mysqldump \
    -h [MASTER_IP] -P [MASTER_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 | \
    gsutil cp - gs://[BUCKET]/[PATH_TO_DUMP]

Além disso, configure instâncias RDS para reter binlogs por mais tempo. Esse comando pode se parecer com o seguinte exemplo:

// 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
[MASTER_IP] O endereço IPv4 do servidor de banco de dados de origem.
[MASTER_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 criado 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 | \
    gsutil cp - gs://export-bucket/hq-master1.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ó é compatível com a ferramenta de linha de comando gcloud e a API Cloud SQL Admin.

Console

Nesta etapa, você 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 de certificado SSL/TLS do servidor de origem.

    Para 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 o tipo de máquina de forma que ele seja semelhante 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 Avançar.

gcloud

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

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

    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 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 intervalo 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 servidor-cliente.
    [PRIVATE_KEY_PATH] O caminho local em que o arquivo de chave privada do certificado do cliente está armazenado. Necessário apenas para autenticação servidor-cliente.
    [MACHINE_TYPE] O tamanho da sua réplica. De modo geral, a réplica precisa ter 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-n1-standard-2. 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-master1 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-master1",
         "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 que carregou no Cloud Storage na etapa anterior.

Para fazer essa chamada de API, é necessário fornecer informações confidenciais. Portanto, você deve usar um arquivo JSON para transmitir seus dados ao 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 intervalo 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 de servidor e 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 de servidor e cliente. Cole a chave no corpo da solicitação.
[MACHINE_TYPE] O tamanho da sua réplica. De modo geral, a réplica precisa ter 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-n1-standard-2. 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 a importação inteira.
[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-master1.sql.gz",
            "caCertificate": "[SOURCE_SERVER_CA]",
            "clientCertificate": "[CLIENT_CERT]",
            "clientKey": "[PRIVATE_KEY]"
        }
    },
    "settings": {
        "tier": "db-n1-standard-4",
        "dataDiskSizeGb": "100"
    },
    "masterInstanceName": "hq-master1",
    "region": "us-central1",
    "databaseVersion": "MYSQL_5_7",
    "name": "hq-master1-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 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 da listagem de instâncias não deve mais estar girando e deve estar 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 de linha de comando 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 esta página.

    Para criar um usuário usando o Console do 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 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. É possível confirmar o status na página da listagem de instâncias do Console do 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 em Mostrar painel de informações e selecione Atraso da replicação na lista suspensa de métricas.

    O atraso de replicação precisa ser zero ou próximo disso. Caso não seja, será necessário tomar medidas para resolver esse problema.

8. Limpe seu armazenamento

  1. Exclua o arquivo de exportação:

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

    gsutil rm -r gs://[BUCKET]
    

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