Como posso criptografar uma instância de banco de dados não criptografada do Amazon RDS para MySQL ou MariaDB com o mínimo de tempo de inatividade?

6 minuto de leitura
0

Tentei criar uma réplica de leitura criptografada da minha instância não criptografada do Amazon Relational Database Service (Amazon RDS) para MySQL ou MariaDB. No entanto, recebi um erro. Como posso resolver isso?

Breve descrição

O Amazon RDS tem as seguintes limitações para instâncias de banco de dados criptografadas:

  • Você não pode modificar uma instância de banco de dados não criptografada existente do Amazon RDS para criptografar a instância.
  • Você não pode criar uma réplica de leitura criptografada a partir de uma instância não criptografada.

Como você não pode criptografar uma instância existente do Amazon RDS, você deve criar uma nova instância criptografada. Caso contrário, ao criar uma réplica de leitura criptografada de uma instância não criptografada do Amazon RDS para MySQL, você receberá o seguinte erro:

"You cannot create an encrypted Read Replica from an unencrypted DB
            instance. (Service: AmazonRDS; Status Code: 400; Error Code:
            InvalidParameterCombination; Request ID:)"

Para criptografar uma instância de banco de dados não criptografada com o mínimo de tempo de inatividade, siga estas etapas:

1.    Criptografe um snapshot não criptografado obtido de uma réplica de leitura não criptografada da instância de banco de dados.

2.    Restaure uma nova instância de banco de dados a partir do snapshot criptografado para implantar uma nova instância de banco de dados criptografada.

3.    Use a replicação do MySQL para sincronizar as alterações da origem para a nova instância de banco de dados criptografada.

4.    Verifique se a nova instância de banco de dados criptografada está sincronizada com a instância de banco de dados de origem.

5.    Troque suas conexões e redirecione seu tráfego para a nova instância de banco de dados.

Resolução

Configuração de uma replicação com o mínimo de tempo de inatividade

1.    Crie uma réplica de leitura temporária para a instância de banco de dados do Amazon RDS não criptografada de origem. Neste exemplo, a instância de banco de dados não criptografada de origem é chamada de SOURCE-EU e a réplica de leitura temporária é chamada de TEMP-RR.

2.    Conecte-se a TEMP-RR e monitore o atraso da réplica até que Seconds_Behind_Master esteja estável no valor 0. Isso indica que TEMP-RR está sincronizada com SOURCE-EU:

mysql> SHOW SLAVE STATUS \G
Seconds_Behind_Master: 0

3.    Interrompa o processo de replicação em TEMP-RR.

MySQL > call mysql.rds_stop_replication;
+---------------------------+
| Message                   |
+---------------------------+
| Slave is down or disabled |
+---------------------------+

4.    Anote os valores de Relay_Master_Log_File e Exec_Master_Log_Pos referentes a TEMP-RR:

mysql> SHOW SLAVE STATUS \G
Relay_Master_Log_File: mysql-bin-changelog.000012
Exec_Master_Log_Pos: 123

5.    Em SOURCE-EU, defina o parâmetro de horas de retenção do log binário para preservar os logs binários pelo tempo necessário para concluir a operação. No exemplo a seguir, as horas de retenção do log binário estão definidas como 24 horas:

mysql> call mysql.rds_set_configuration('binlog retention hours', 24);

6.    Capture um snapshot deTEMP-RR. Opcionalmente, você pode excluir TEMP-RR depois de capturar o snapshot.

7.    Copie o snapshot de TEMP-RR e defina Ativar criptografia como Sim.

8.    Restaure uma nova instância de banco de dados a partir do snapshot copiado que tenha a criptografia ativada. Neste exemplo, a nova instância de banco de dados criptografada é chamada de NEW-RR-EN.

9.    Modifique as regras de entrada no grupo de segurança SOURCE-EU para permitir o tráfego a partir de NEW-RR-EN. Se você usar o mesmo grupo de segurança nas duas instâncias de banco de dados, poderá usar a mesma referência de ID do grupo de segurança que SOURCE-EU.

Observação: certifique-se de permitir o tráfego de saída para SOURCE-EU a partir de NEW-RR-EN.

10.    Faça login em SOURCE-EU, configure um usuário de replicação e conceda as permissões necessárias ao usuário:

mysql> create user 'repl_user'@'%' identified by 'password123';
mysql> grant replication slave, replication client on *.* to 'repl_user'@'%';
mysql> show grants for 'repl_user'@'%';

Observação: substitua repl_user por seu próprio nome de usuário de replicação e senha123 por sua própria senha.

11.    Conecte-se a NEW-RR-EN e estabeleça uma conexão de replicação com SOURCE-EU:

mysql> CALL mysql.rds_set_external_master ( 'rds-endpoint' , 3306 , 'repl_user' , 'password123' , 'mysql-bin.000012' , 123 , 0 );

O rds-endpoint é o endpoint da instância de banco de dados de SOURCE-EU.

O nome de usuário (repl_user) e a senha (senha123) são o nome de usuário e a senha que você criou na Etapa 10. Use os valores capturados de Relay_Master_Log_File e Exec_Master_Log_Pos da Etapa 4 para configurar a replicação com o procedimento mysql.rds_set_external_master.

Observação: se SOURCE-EU estiver acessível ao público e NEW-RR-EN (nova instância de banco de dados criptografada) estiver definida como "privada", use o endereço IP privado (de SOURCE-EU) em vez de rds-endpoint.

12.    Em NEW-RR-EN, inicie a replicação:

mysql > CALL mysql.rds_start_replication;

13.    Em NEW-RR-EN, confirme se a replicação obteve êxito e está sincronizada entre SOURCE-EU e NEW-RR-EN.

mysql> SHOW SLAVE STATUS \G

Se sua conexão entre a instância de banco de dados de origem e a réplica de leitura obtiver êxito, sua saída ficará assim:

Slave_IO_State: Waiting for master to send event
Seconds Behind master: 0

14.    Depois que Seconds_Behind_Master estiver estável no valor 0, interrompa o tráfego e feche as conexões em SOURCE-EU. Em seguida, começa o tempo de inatividade.

Observação: interrompa todos os servidores e clientes de aplicativos que se conectam a SOURCE-EU para garantir que nenhuma nova alteração seja feita em SOURCE-EU. Opcionalmente, você pode bloquear temporariamente o grupo de segurança usado por SOURCE-EU. Isso evita o tráfego de entrada de qualquer aplicação ou cliente, exceto de NEW-RR-EN e do host do qual o usuário está realizando essas ações.

15.    Como usuário mestre do banco de dados, conecte-se a NEW-RR-EN e, em seguida, interrompa a replicação:

MySQL > call mysql.rds_stop_replication;

Importante: depois de executar esse comando, NEW-RR-EN não replicará mais os dados de SOURCE-EU.

16.    Promova NEW-RR-ENcomo um servidor autônomo interrompendo a relação de replicação entre SOURCE-EU e NEW-RR-EN:

MySQL > call mysql.rds_reset_external_master;

17.    Aponte todas as aplicações, clientes e conexões de banco de dados para NEW-RR-EN especificando o endpoint DNS NEW-RR-EN em todas as strings de conexão. Ou renomeie SOURCE-EU e modifique NEW-RR-EN para usar o mesmo nome usado por SOURCE-EU.

18.    Confirme se as regras do grupo de segurança em NEW-RR-EN permitem tráfego de entrada das aplicações e clientes apropriados.

19.    Depois de apontar as aplicações e clientes para NEW-RR-EN e testar o ambiente, exclua SOURCE-EU.

Dica: é uma prática recomendada testar essa operação em uma instância de teste antes de aplicar essa operação em um ambiente de produção.


Informações relacionadas

Trabalhando com réplicas de leitura

Como criptografar snapshots do Amazon RDS?

Solução de problemas de replicação na documentação do MySQL

Configurar a replicação da posição do arquivo de log binário com uma instância mestre externa