Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.
Nota
titlePré-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

...

Vamos manter o mesmo modelo de exemplo utilizado para replica Assincrona, porém, agora com apoio da ferramenta RepMgr.

Segue estrutura usada no exemplo:

Instalação do Postgresql

/data01/pgsql/15/data

Arquivos de Dados:

/data02

Arquivos de Indices:

/data03

 

Servidor Primário

Realize a instalação do

...

repmgr pelo sistema operacional:

Bloco de código
sudo dnf -y install repmgr_15.x86_64 

...

No servidor primário

...

Altere os seguintes parâmetros diretamente no

...

Arquivo de configuração: vim /data01/pgsql/15/data/postgresql.conf

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

Ou diretamente pelo banco de dados, conectado ao psql ou ao pgAdmin:

...

banco de dados, ou no arquivo de configuração postgresql.conf:

Bloco de código
languagesql
titlePelo pgAdmin, psql ou outro conector com o banco de dados
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;
Bloco de código

 

  1. Realizar a criação do usuário para replicação. Ao criar o usuário para replicação, você pode escolher o nome desejado. Nós o designamos como "repmgr".

No Sistema Operacional:

su - postgres

createuser -s repmgr

Verificar métodos de autenticação Postgresql.

O usuário para a replicação foi inicialmente configurado como superusuário, conforme indicado na documentação oficial do repmgr. No entanto, é possível optar por conceder permissões específicas de replicações, acompanhadas de algumas restrições.

 

Criação Database:

No Sistema Operacional: 

su - postgres

createdb repmgr -O repmgr

  1. Adicionar o range de IPs com liberação e usuário no arquivo hba.conf:

Arquivo de configuração: /data01/pgsql/15/data/pg_hba.conf

local all all trust

host all all 127.0.0.1/32 trust

host all all ::1/128 trust

#replication
local replication all trust
host replication all 127.0.0.1/32 trust
host replication all ::1/128 trust
host replication repuser 10.171.214.0/24 md5

...

titleArquivo postgresql.conf
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. 

Nota
titleAtençã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.

Bloco de código
#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.

...

Com usuário postgres criamos o arquivo no seguinte path: /data01/pgsql/15/repmgr.conf e alteramos com editor de textos vim:

Sistema Operacional

# repmgr.conf

conf no diretório de instalação do PostgreSQL.

Bloco de código
# 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.

...


Bloco de código
sudo systemctl restart postgresql-15.service

...

Registre o Cluster primário no Repmgr:

...

Bloco de código
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

Resultado da consulta:

Servidor Secundário

No servidor secundário

Realize a instalação do

...

repmgr pelo sistema operacional:

Bloco de código
sudo dnf -y install repmgr_15.x86_64 

...

Pare o serviço do PostgreSQL.

...

Bloco de código
sudo systemctl stop postgresql-15.service

...

  1. Com usuário Postgres do Sistema Operacional, apagar os paths exclusivamente relacionados ao Postgres. Como temos somente arquivos postgres nessas unidades, rodamos o comando a seguir:

É crucial lembrar que o comando a seguir apaga 'tudo no path indicado'. Certifique-se de estar no path correto, pois o comando não solicitará nenhuma confirmação.

Sistema Operacional

...

rm -rf /data01/pgsql/15/*

rm -rf /data03/*

rm -rf /data02/*

Crie o arquivo de

...

configuração repmgr. 

Com usuário postgres

...

, crie o arquivo no seguinte path:

...

<diretorio-instalacao-postgres>/repmgr.conf

...

:

...

Bloco de código
# 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:

...

Bloco de código
su - postgres 

...


cd /usr/pgsql-15/bin

...


## Realizar o clone dos

...

##mensagem: connection to server at "10.171.214.56", port 5432 failed: fe_sendauth: no password supplied

...

 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

...

Resultado da Consulta:

Testando a Réplica

 

Acesse o postgres no servidor primário, rodamos o seguinte comando para criar uma tabela de exemplo e popular:

 create table repmgr(r_e_c_n_o_ int, d_e_l_e_t_ bpchar (20));

END;

);

DO $$

DECLARE

BEGIN

FOR i IN 1..10000 LOOP

INSERT INTO repmgr(r_e_c_n_o_ , d_e_l_e_t_) VALUES (random() * 10000 + 1,'Campo' || i );

END LOOP;

END;

$$;

Ao consultar essa tabela no servidor secundário temos o seguinte resultado:

 

Ao tentar realizar um drop na tabela no servidor secundário, temos o seguinte retorno:

Para consultar o status da replicação verifique a seguinte view no servidor primário:

#para tabular 

\x

##query de consulta:

select * from pg_stat_replication;

Resultado:

 show
Informações

O servidor secundário é usado somente para leitura. Não pode realizar a inclusão ou deleção de objetos no banco de dados.

...

Mais detalhes: https://www.postgresql.org/docs/current/monitoring-stats.html#MONITORING-PG-STAT-REPLICATION-VIEW 

 

...

Confira mais detalhes neste link.


Caso ocorra um problema no servidor primário, o Repmgr realizará failover automático para a réplica.

Se acompanharmos o log do repmgr:

Vamos verificar onde esta o log.

cd /usr/pgsql-15/bin

./repmgrd -f /data01/pgsql/15/repmgr.conf

[2023-12-21 00:22:02] [NOTICE] redirecting logging output to "/data01/pgsql/15/repmgr.log"

tail -f /data01/pgsql/15/repmgr.log

...

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:

Bloco de código
#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