Configure réplicas externas

Esta página descreve como configurar uma instância do Cloud SQL que replica para uma ou mais réplicas externas ao Cloud SQL e como rebaixar a instância principal numa configuração de réplica externa para reverter a configuração.

Para mais informações sobre a replicação, consulte o artigo Acerca da replicação no Cloud SQL.

Configure a configuração da réplica externa

Antes de começar

Antes de iniciar esta tarefa, tem de ter uma instância do Cloud SQL e uma instância externa do MySQL que cumpra os requisitos para réplicas externas.

Requisitos da instância de origem

A instância de origem de uma réplica de leitura externa tem de ser uma instância principal ou autónoma. Não pode usar uma réplica de leitura do Cloud SQL como a instância de origem para uma réplica de leitura externa. Por vezes, as réplicas de leitura são recriadas a partir do clone do disco da respetiva instância principal, e o respetivo estado de replicação para uma réplica de leitura externa não pode ser mantido pela réplica de leitura.

Configure a instância principal

  1. Aceda à página Instâncias do Cloud SQL na Google Cloud consola.
  2. Ative o acesso na instância principal para o endereço IP da réplica externa.

    Para obter informações sobre como ativar o acesso por IP, consulte o artigo Configurar o acesso para ligações IP.

  3. Registe o endereço IP público e o endereço IP público de saída da instância principal para utilização posterior. Pode encontrar estes valores na página Vista geral da instância.
  4. Clique no ícone do Cloud Shell no canto superior direito.
  5. Na linha de comandos do Cloud Shell, use o cliente MySQL incorporado para se ligar à instância principal:
       
    gcloud sql connect PRIMARY_INSTANCE_NAME \
    --user=root
       
       
  6. Introduza a sua palavra-passe de raiz. Em seguida, deve ver o comando mysql.
  7. Crie um utilizador especial para a replicação e conceda privilégios de replicação:
    CREATE USER 'REPLICATION_USER'@'%' IDENTIFIED BY 'REPLICATION_USER_PASSWORD';
    GRANT REPLICATION SLAVE ON *.* TO 'REPLICATION_USER'@'%';
       
  8. Se estiver a começar com uma nova base de dados, crie a mesma base de dados e tabelas nas instâncias principal e de réplica. Por exemplo:
    CREATE DATABASE test;
    
    USE test;
    
    CREATE TABLE replica_test (id SERIAL PRIMARY KEY, data text);
    INSERT INTO replica_test (data) VALUES ('apple'), ('banana'), ('cherry');
  9. Se já tiver uma base de dados na instância principal, tem de criar a mesma na réplica. Para o fazer, exporte a base de dados da instância principal para um contentor do Cloud Storage e importe-a para a réplica. Saiba mais sobre como exportar dados do Cloud SQL para um ficheiro de captura SQL no Cloud Storage.

Configure a réplica externa

Aviso: este procedimento substitui todos os dados alojados numa base de dados MySQL na réplica, incluindo utilizadores e palavras-passe, pelas definições e pelos dados da instância principal.
  1. Na máquina que aloja a réplica, inicialize a nova instância MySQL externa com o ficheiro de exportação que criou a partir da instância principal.

    Por exemplo, o comando seguinte carrega um ficheiro exportado com o nome mydump.sql:

    mysql --user=root --password < mydump.sql
    
  2. Determine o ID do servidor para este par principal-réplica.

    O ID do servidor é um valor numérico (por exemplo, "3") que tem de ser exclusivo na configuração da réplica externa (cada réplica tem de ter um ID do servidor exclusivo).

  3. Adicione as seguintes opções ao ficheiro de opções my.cnf da réplica:
    [mysqld]
    server-id=[SERVER_ID]
    gtid_mode=ON
    enforce_gtid_consistency=ON
    log_slave_updates=ON
    replicate-ignore-db=mysql
    binlog-format=ROW
    log_bin=mysql-bin
    expire_logs_days=1
    read_only=ON
    

    Para mais informações sobre as opções de replicação do MySQL, consulte o artigo Opções de replicação e registo binário.

  4. Reinicie o processo mysqld para que o ficheiro de configuração seja lido.
  5. Num cliente mysql na réplica, introduza o seguinte comando:
    CHANGE MASTER TO MASTER_HOST='MASTER_IP_ADDRESS', MASTER_USER='REPLICATION_USER',
    MASTER_PASSWORD='REPLICATION_PASSWORD', MASTER_AUTO_POSITION=1;
    
  6. Inicie a replicação na réplica:
    START SLAVE;
    
  7. Confirme o estado da replicação:

    SHOW SLAVE STATUS\G;
    

    Se vir "A aguardar que o mestre envie o evento", a replicação está a funcionar.

Rebaixar a instância principal de uma réplica externa

Quando tem uma instância do Cloud SQL com uma réplica externa, pode inverter a configuração, o que faz com que ocorram as seguintes alterações:

  • A réplica externa torna-se a nova instância principal.
  • A instância do Cloud SQL torna-se uma réplica de leitura, replicando a partir do servidor que era anteriormente a réplica externa (agora denominado servidor de base de dados de origem).

Para reverter a configuração da réplica externa:

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

    Esta instância representa o servidor de base de dados de origem para a réplica do Cloud SQL após a conclusão da operação de rebaixamento.

    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": "EXTERNAL_SERVER_DATABASE_VERSION",
             "onPremisesConfiguration": {
                 "hostPort": "EXTERNAL_SERVER_IP:EXTERNAL_SERVER_PORT"
             }
         }' \
         -X POST \
         https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT-ID/instances
    

    Use a região onde quer que a réplica do Cloud SQL resida.

  2. Inicie o processo de rebaixamento.

    Uma vez que esta chamada API requer que faculte informações confidenciais, deve usar um ficheiro JSON para facultar os seus dados ao cURL, em vez de os facultar na linha de comandos.

    Crie o ficheiro de dados:

    {
        "demoteMasterContext": {
            "replicaConfiguration": {
                "mysqlReplicaConfiguration": {
                    "username": "REPLICATION_USERNAME",
                    "password": "PASSWORD",
                    "caCertificate": "EXTERNAL_SERVER_CA",
                    "clientCertificate": "CLIENT_CERT",
                    "clientKey": "PRIVATE_KEY"
                }
            },
            "masterInstanceName": "SOURCE_REPRESENTATION_NAME",
        },
    }
    

    Em seguida, chame a API.

    curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
         --header 'Content-Type: application/json' \
         --data @PATH_TO_DATA_FILE \
         https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT-ID/instances/INSTANCE_NAME/demoteMaster
    

    Para mais informações sobre as suas opções de SSL/TLS, consulte o artigo Opções de SSL/TLS. Para mais informações sobre as propriedades usadas pelo objeto replicaConfiguration, consulte Replicação a partir de um servidor externo.

  3. Aguarde que a réplica externa conclua todas as transações pendentes da instância principal.

    Quando a réplica está atualizada, o comando SHOW SLAVE STATUS mostra Seconds Behind Master como 0 e o valor Executed_Gtid_Set é idêntico entre a réplica externa e a instância principal do Cloud SQL.

  4. Use o cliente mysql para parar a replicação na réplica externa:

    STOP SLAVE
    RESET SLAVE ALL
    
  5. Aguarde que a instância do Cloud SQL comece a replicar a partir do servidor externo, que é agora o servidor de base de dados de origem.

    A execução do comando SHOW SLAVE STATUS na instância do Cloud SQL fornece o estado da replicação.

  6. Quando a instância do Cloud SQL estiver a replicar com êxito a partir do servidor de base de dados de origem, defina a flag read_only no servidor de base de dados de origem como off e atualize as suas aplicações para apontarem para o servidor de base de dados de origem.

Resolver problemas

Problema Resolução de problemas
Mensagem de erro: The slave is connecting ... master has purged binary logs containing GTIDs that the slave requires. A instância principal do Cloud SQL tem cópias de segurança automáticas e registos binários, e a recuperação num determinado momento está ativada, pelo que deve ter registos suficientes para que a réplica consiga acompanhar. No entanto, neste caso, embora os registos binários existam, a réplica não sabe a partir de que linha deve começar a ler.

Crie um novo ficheiro de despejo com as definições de flags corretas e configure a réplica externa com esse ficheiro

  1. Ligue-se ao seu cliente mysql através de uma instância do Compute Engine.
  2. Execute mysqldump e use as flags --master-data=1 e --flush-privileges.

    Importante: não inclua a --set-gtid-purged=OFF sinalização.

    Saiba mais.

  3. Certifique-se de que o ficheiro de despejo acabado de criar contém a linha SET @@GLOBAL.GTID_PURGED='...'.
  4. Carregue o ficheiro de despejo para um contentor do Cloud Storage e configure a réplica com o ficheiro de despejo.

O que se segue?