Pré-requisitos
Para prosseguir com a configuração, assegure-se que:
- Você possui um servidor principal e um servidor secundário com PostgreSQL instalados;
- Os servidores de banco de dados possuem conexão estabelecida entre eles;
- Você possui um usuário designado no servidor principal responsável pela réplica;
- Não há usuários conectados na base principal.
Repmgr é uma ferramenta de código aberto para gerenciamento de replicação PostgreSQL. Ele fornece um conjunto abrangente de recursos para gerenciamento de clusters de replicação, incluindo:
- Monitoramento: RepManager pode monitorar a saúde do seu cluster de replicação e alertá-lo sobre quaisquer problemas.
- Gerenciamento: RepManager pode ser usado para criar, iniciar, parar e promover secundários de replicação.
- Failover: RepManager pode ser usado para failover para um novo primário em caso de falha do primário.
RepManager é uma ferramenta poderosa que pode tornar muito mais fácil gerenciar a replicação PostgreSQL. É uma escolha popular para organizações que usam PostgreSQL para aplicativos críticos.
Aqui estão alguns dos benefícios do uso do RepManager:
- Redução da complexidade: simplifica o gerenciamento da replicação PostgreSQL, tornando mais fácil para os administradores gerenciar clusters de replicação complexos.
- Melhoria da confiabilidade: ajuda a melhorar a confiabilidade do seu cluster de replicação PostgreSQL fornecendo recursos de monitoramento e failover, é usada para criar, iniciar, parar e promover secundários de replicação.
- Redução do tempo de inatividade: RepManager pode ajudar a reduzir o tempo de inatividade automatizando o processo de failover.
Como fazer?
Inicie com a configuração assíncrona da replicação do Postgresql, conforme documentação: Réplica Assíncrona.
Realize a instalação do repmgr pelo sistema operacional:
sudo dnf -y install repmgr_15.x86_64
No servidor primário
Altere os seguintes parâmetros diretamente no banco de dados, ou no arquivo de configuração postgresql.conf:
ALTER SYSTEM SET max_wal_senders = 10; ALTER SYSTEM SET max_replication_slots= 10; ALTER SYSTEM SET wal_level= replica; ALTER SYSTEM SET hot_standby= on; ALTER SYSTEM SET archive_command= 'bin/true'; ALTER SYSTEM SET shared_preload_libraries= 'repmgr'; ALTER SYSTEM SET wal_log_hints= on;
wal_level: replica hot_standby: on max_wal_senders: 10 max_replication_slots: 10 wal_level: replica archive_command: 'bin/true' shared_preload_libraries: 'repmgr' wal_log_hints: on
Crie um usuário para a replicação. Este usuário deve ter as permissões listadas no documento de referência (em inglês) ou estar configurado como superusuário.
Atenção: Segurança
Verifique com sua equipe de segurança a melhor configuração para o usuário do repmgr. Algumas funcionalidades do repmgr precisarão ser executadas com a flag -S / --superuser caso o usuário designado não possua a permissão de superusuário.
Após isso, dê a permissão para o usuário designado para replicação no arquivo pg_hba.conf. Troque "<usuario-de-replicacao>" pelo usuário que irá fazer a replicação, "<range-de-ip>" pela faixa de IPs ou pelo IP do servidor secundário, e <metodo-de-autenticacao>" pelo método de autenticação que será utilizado pelo usuário de replicação.
#replication host replication all ::1/128 trust host replication <usuario-de-replicacao> <range-de-ip> <metodo-de-autenticacao> #repmgr local repmgr <usuario-de-replicacao> <metodo-de-autenticacao> host repmgr <usuario-de-replicacao> 127.0.0.1/32 <metodo-de-autenticacao> host repmgr <usuario-de-replicacao> <range-de-ip> <metodo-de-autenticacao>
Crie o arquivo de configuração repmgr.conf no diretório de instalação do PostgreSQL.
# repmgr.conf node_id=1 node_name=primary conninfo='host=<ip-servidor-primario> dbname=<banco-de-dados> user=<usuario-de-replicacao> connect_timeout=2' data_directory='<diretorio-de-dados-postgres>' failover=automatic promote_command='/usr/pgsql-15/bin/repmgr standby promote -f <diretorio-instalacao-postgres>/repmgr.conf --log-to-file' follow_command='/usr/pgsql-15/bin/repmgr standby follow -f <diretorio-instalacao-postgres>/repmgr.conf --log-to-file --upstream-node-id=%n' pg_bindir='/usr/pgsql-15/bin/' log_file='<diretorio-instalacao-postgres>/repmgr.log'
Para que as alterações fiquem válidas, reinicie o Serviço do Postgresql.
sudo systemctl restart postgresql-15.service
Registre o Cluster primário no Repmgr:
su - postgres cd /usr/pgsql-15/bin ./repmgr -f /data01/pgsql/15/repmgr.conf primary register ### Consultar a inclusão no repmgr: ./repmgr -f <diretorio-instalacao-postgres>/repmgr.conf cluster show ./repmgr -f <diretorio-instalacao-postgres>/repmgr.conf cluster show
No servidor secundário
Realize a instalação do repmgr pelo sistema operacional:
sudo dnf -y install repmgr_15.x86_64
Pare o serviço do PostgreSQL.
sudo systemctl stop postgresql-15.service
Crie o arquivo de configuração repmgr.
Com usuário postgres, crie o arquivo no seguinte path: <diretorio-instalacao-postgres>/repmgr.conf :
# repmgr.conf - Standby node_id=2 node_name=standby conninfo='host=<host-secundario> dbname=<banco-de-dados> user=<usuario-de-replicacao> connect_timeout=2' data_directory='<diretorio-de-dados-postgres>' failover=automatic promote_command='/usr/pgsql-15/bin/repmgr standby promote -f <diretorio-instalacao-postgres>/repmgr.conf --log-to-file' follow_command='/usr/pgsql-15/bin/repmgr standby follow -f <diretorio-instalacao-postgres>/repmgr.conf --log-to-file --upstream-node-id=%n' pg_bindir='/usr/pgsql-15/bin/' log_file='<diretorio-instalacao-postgres>/repmgr.log'
Realize o clone do banco de dados primário:
su - postgres cd /usr/pgsql-15/bin ## Realizar o clone dos Dados ./repmgr -h <host-primario> -U repmgr -f <diretorio-instalacao-postgres>/repmgr.conf standby clone ## Inicie o postgres systemctl start postgresql-15.service ## Registre o Servidor Standby no Cluster su - postgres cd /usr/pgsql-15/bin ./repmgr -h <host-primario> -U <usuario-de-replicacao> -f <diretorio-instalacao-postgres>/repmgr.conf standby register ## Consultar a inclusão no repmgr: su - postgres cd /usr/pgsql-15/bin ./repmgr -f <diretorio-instalacao-postgres>/repmgr.conf cluster show
O servidor secundário é usado somente para leitura. Não pode realizar a inclusão ou deleção de objetos no banco de dados. Confira mais detalhes neste link.
Caso ocorra um problema no servidor primário, o Repmgr realizará failover automático para a réplica.
A partir do momento em que o servidor primário para de responder, o repmgr transformará a réplica em servidor principal. A partir deste momento, será necessário recriar a conexão com o servidor primário quando este for restabelecido. Os procedimentos abaixo demonstram como transformar o servidor secundário em primário, e o primário original em réplica:
#validar o resultado do comando com --dry-run cd /usr/pgsql-15/bin ./repmgr node rejoin -f <diretorio-instalacao-postgres>/repmgr.conf -d 'host=<host-secundario> user=<usuario-de-replicacao> dbname=<banco-de-dados>' --force-rewind --config-files=postgresql.conf,postgresql.local.conf --verbose --dry-run #remover o primario antigo e transformar em secundario ./repmgr node rejoin -f <diretorio-instalacao-postgres>/repmgr.conf -d 'host=<host-secundario> user=<usuario-de-replicacao> dbname=<banco-de-dados>' --force-rewind --config-files=postgresql.conf,postgresql.local.conf --verbose ## Agora o servidor replica se torna do primário do Cluster, e o antigo Primario vira a replica, recebendo agora os dados, se tornando o servidor replica. cd /usr/pgsql-15/bin ./repmgr -f <diretorio-instalacao-postgres>/repmgr.conf cluster show