MariaDB
 sql >> Base de Dados >  >> RDS >> MariaDB

Meu DBA está doente - Dicas de failover de banco de dados para SysAdmins

O melhor cenário é que, em caso de falha do banco de dados, você tenha um bom Plano de Recuperação de Desastres (DRP) e um ambiente altamente disponível com um processo de failover automático, mas… o que acontece se ele falhar por algum motivo inesperado? E se você precisar executar um failover manual? Neste blog, compartilharemos algumas recomendações a serem seguidas caso você precise fazer failover de seu banco de dados.

Verificações de verificação

Antes de realizar qualquer alteração, você precisa verificar algumas coisas básicas para evitar novos problemas após o processo de failover.

Status da replicação

Pode ser possível que, no momento da falha, o nó escravo não esteja atualizado, devido a uma falha de rede, carga alta ou outro problema, então você precisa ter certeza de que seu slave tem todas (ou quase todas) as informações. Se você tiver mais de um nó escravo, também deve verificar qual é o nó mais avançado e escolhê-lo para failover.

ex:Vamos verificar o status da replicação em um servidor MariaDB.

MariaDB [(none)]> SHOW SLAVE STATUS\G

*************************** 1. row ***************************

Slave_IO_State: Waiting for master to send event

Master_Host: 192.168.100.110

Master_User: rpl_user

Master_Port: 3306

Connect_Retry: 10

Master_Log_File: binlog.000014

Read_Master_Log_Pos: 339

Relay_Log_File: relay-bin.000002

Relay_Log_Pos: 635

Relay_Master_Log_File: binlog.000014

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

Last_Errno: 0

Skip_Counter: 0

Exec_Master_Log_Pos: 339

Relay_Log_Space: 938

Until_Condition: None

Until_Log_Pos: 0

Master_SSL_Allowed: No

Seconds_Behind_Master: 0

Master_SSL_Verify_Server_Cert: No

Last_IO_Errno: 0

Last_SQL_Errno: 0

Replicate_Ignore_Server_Ids:

Master_Server_Id: 3001

Using_Gtid: Slave_Pos

Gtid_IO_Pos: 0-3001-20

Parallel_Mode: conservative

SQL_Delay: 0

SQL_Remaining_Delay: NULL

Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it

Slave_DDL_Groups: 0

Slave_Non_Transactional_Groups: 0

Slave_Transactional_Groups: 0

1 row in set (0.000 sec)

No caso do PostgreSQL, é um pouco diferente, pois você precisa verificar o status dos WALs e comparar os aplicados com os buscados.

postgres=# SELECT CASE WHEN pg_last_wal_receive_lsn()=pg_last_wal_replay_lsn()

postgres-# THEN 0

postgres-# ELSE EXTRACT (EPOCH FROM now() - pg_last_xact_replay_timestamp())

postgres-# END AS log_delay;

 log_delay

-----------

         0

(1 row)

Credenciais

Antes de executar o failover, você deve verificar se seu aplicativo/usuários poderão acessar seu novo mestre com as credenciais atuais. Se você não estiver replicando os usuários do banco de dados, talvez as credenciais tenham sido alteradas, portanto, você precisará atualizá-las nos nós escravos antes de qualquer alteração.

por exemplo:Você pode consultar a tabela de usuários no banco de dados mysql para verificar as credenciais do usuário em um MariaDB/MySQL Server:

MariaDB [(none)]> SELECT Host,User,Password FROM mysql.user;

+-----------------+--------------+-------------------------------------------+

| Host            | User | Password                                  |

+-----------------+--------------+-------------------------------------------+

| localhost       | root | *CD7EC70C2F7DCE88643C97381CB42633118AF8A8 |

| localhost       | mysql | invalid                                   |

| 127.0.0.1       | backupuser | *AC01ED53FA8443BFD3FC7C448F78A6F2C26C3C38 |

| 192.168.100.100 | cmon         | *F80B5EE41D1FB1FA67D83E96FCB1638ABCFB86E2 |

| 127.0.0.1       | root | *CD7EC70C2F7DCE88643C97381CB42633118AF8A8 |

| ::1             | root | *CD7EC70C2F7DCE88643C97381CB42633118AF8A8 |

| localhost       | backupuser | *AC01ED53FA8443BFD3FC7C448F78A6F2C26C3C38 |

| 192.168.100.112 | user1        | *CD7EC70C2F7DCE88643C97381CB42633118AF8A8 |

| localhost       | cmonexporter | *0F7AD3EAF21E28201D311384753810C5066B0964 |

| 127.0.0.1       | cmonexporter | *0F7AD3EAF21E28201D311384753810C5066B0964 |

| ::1             | cmonexporter | *0F7AD3EAF21E28201D311384753810C5066B0964 |

| 192.168.100.110 | rpl_user     | *EEA7B018B16E0201270B3CDC0AF8FC335048DC63 |

+-----------------+--------------+-------------------------------------------+

12 rows in set (0.001 sec)

No caso do PostgreSQL, você pode usar o comando ‘\du’ para conhecer os papéis, e também deve verificar o arquivo de configuração pg_hba.conf para gerenciar o acesso do usuário (não as credenciais). Então:

postgres=# \du

                                       List of roles

    Role name     |             Attributes         | Member of

------------------+------------------------------------------------------------+-----------

 admindb          | Superuser, Create role, Create DB                          | {}

 cmon_replication | Replication                                                | {}

 cmonexporter     |                                             | {}

 postgres         | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

 s9smysqlchk      | Superuser, Create role, Create DB                          | {}

E pg_hba.conf:

# TYPE DATABASE USER ADDRESS METHOD

host replication  cmon_replication  localhost  md5

host  replication  cmon_replication  127.0.0.1/32  md5

host  all  s9smysqlchk  localhost  md5

host  all  s9smysqlchk  127.0.0.1/32  md5

local   all            all                   trust

host    all            all 127.0.0.1/32 trust

Acesso à rede/firewall

As credenciais não são o único problema possível ao acessar seu novo mestre. Caso o nó esteja em outro datacenter, ou você tenha um firewall local para filtrar o tráfego, você deve verificar se tem permissão para acessá-lo ou mesmo se tem a rota de rede para chegar ao novo nó mestre.

por exemplo:iptables. Vamos permitir o tráfego da rede 167.124.57.0/24 e verificar as regras atuais após adicioná-lo:

$ iptables -A INPUT  -s 167.124.57.0/24 -m state --state NEW  -j ACCEPT

$ iptables -L -n

Chain INPUT (policy ACCEPT)

target     prot opt source               destination

ACCEPT     all -- 167.124.57.0/24      0.0.0.0/0 state NEW

Chain FORWARD (policy ACCEPT)

target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)

target     prot opt source               destination

por exemplo:rotas. Vamos supor que seu novo nó mestre esteja na rede 10.0.0.0/24, seu servidor de aplicação esteja em 192.168.100.0/24 e você possa acessar a rede remota usando 192.168.100.100, então em seu servidor de aplicação, adicione a rota correspondente:

$ route add -net 10.0.0.0/24 gw 192.168.100.100

$ route -n

Kernel IP routing table

Destination     Gateway Genmask         Flags Metric Ref Use Iface

0.0.0.0         192.168.100.1 0.0.0.0         UG 0 0 0 eth0

10.0.0.0        192.168.100.100 255.255.255.0   UG 0 0 0 eth0

169.254.0.0     0.0.0.0 255.255.0.0     U 1027 0 0 eth0

192.168.100.0   0.0.0.0 255.255.255.0   U 0 0 0 eth0

Pontos de ação

Após verificar todos os pontos mencionados, você deve estar pronto para realizar as ações de failover do seu banco de dados.

Novo endereço IP

Como você promoverá um nó escravo, o endereço IP do mestre será alterado, portanto, você precisará alterá-lo em seu aplicativo ou acesso de cliente.

Usar um Load Balancer é uma excelente maneira de evitar esse problema/alteração. Após o processo de failover, o Load Balancer detectará o mestre antigo como off-line e (depende da configuração) enviará o tráfego para o novo para gravar nele, para que você não precise alterar nada em sua aplicação.

por exemplo:Vejamos um exemplo de configuração do HAProxy:

listen  haproxy_5433

        bind *:5433

        mode tcp

        timeout client  10800s

        timeout server  10800s

        balance leastconn

        option tcp-check

        server 192.168.100.119 192.168.100.119:5432 check

        server 192.168.100.120 192.168.100.120:5432 check

Neste caso, se um nó estiver inativo, o HAProxy não enviará tráfego para lá e enviará o tráfego apenas para o nó disponível.

Reconfigure os nós escravos

Se você tiver mais de um nó escravo, após promover um deles, deverá reconfigurar o restante dos escravos para se conectar ao novo mestre. Esta pode ser uma tarefa demorada, dependendo do número de nós.

Verifique e configure os backups

Depois de ter tudo no lugar (novo master promovido, slaves reconfigurados, escrita de aplicativos no novo master), é importante tomar as ações necessárias para evitar um novo problema, então os backups são obrigatórios este passo. Muito provavelmente você tinha uma política de backup em execução antes do incidente (se não, você precisa tê-la com certeza), então você deve verificar se os backups ainda estão em execução ou eles funcionarão na nova topologia. Pode ser possível que você tenha os backups em execução no mestre antigo ou usando o nó escravo que é mestre agora, portanto, você precisa verificar para garantir que sua política de backup ainda funcione após as alterações.

Monitoramento de banco de dados

Quando você executa um processo de failover, o monitoramento é obrigatório antes, durante e depois do processo. Com isso, você pode evitar um problema antes que ele piore, detectar um problema inesperado durante o failover ou até mesmo saber se algo deu errado depois dele. Por exemplo, você deve monitorar se seu aplicativo pode acessar seu novo mestre verificando o número de conexões ativas.

Principais métricas a serem monitoradas

Vamos ver algumas das métricas mais importantes a serem consideradas:

  • Atraso de replicação
  • Status da replicação
  • Número de conexões
  • Uso da rede/erros
  • Carga do servidor (CPU, Memória, Disco)
  • Banco de dados e logs do sistema

Reversão

Claro, se algo deu errado, você deve ser capaz de reverter. Bloquear o tráfego para o nó antigo e mantê-lo o mais isolado possível pode ser uma boa estratégia para isso, portanto, caso você precise reverter, terá o nó antigo disponível. Se a reversão for após alguns minutos, dependendo do tráfego, você provavelmente precisará inserir os dados desses minutos no mestre antigo, portanto, certifique-se de ter também seu nó mestre temporário disponível e isolado para pegar essas informações e aplicá-las novamente .

Automatize o processo de failover com o ClusterControl

Vendo todas essas tarefas necessárias para realizar um failover, muito provavelmente você deseja automatizar e evitar todo esse trabalho manual. Para isso, você pode aproveitar alguns dos recursos que o ClusterControl pode oferecer para diferentes tecnologias de banco de dados, como recuperação automática, backups, gerenciamento de usuários, monitoramento, entre outros recursos, todos do mesmo sistema.

Com o ClusterControl você pode verificar o status da replicação e seu atraso, criar ou modificar credenciais, conhecer o status da rede e do host e ainda mais verificações.

Usando o ClusterControl você também pode executar diferentes ações de cluster e nó, como promover escravo , reinicie o banco de dados e o servidor, adicione ou remova nós de banco de dados, adicione ou remova nós do balanceador de carga, reconstrua um escravo de replicação e muito mais.

Usando essas ações, você também pode reverter seu failover, se necessário, reconstruindo e promovendo o mestre anterior.

O ClusterControl possui serviços de monitoramento e alerta que ajudam você a saber o que está acontecendo ou mesmo se algo aconteceu anteriormente.

Você também pode usar a seção do painel para ter uma visualização mais amigável sobre o status de seus sistemas.

Conclusão

No caso de uma falha no banco de dados mestre, você desejará ter todas as informações no local para executar as ações necessárias o mais rápido possível. Ter um bom DRP é a chave para manter seu sistema funcionando o tempo todo (ou quase todo). Esse DRP deve incluir um processo de failover bem documentado para ter um RTO (objetivo de tempo de recuperação) aceitável para a empresa.