A documentação do Postgres cobre a replicação de streaming de forma bastante abrangente, mas você também pode precisar de algo mais digerível para referência. Nesta postagem discutiremos como configurar a replicação de streaming no Windows.
Para recapitular, a replicação Postgres é o processo de copiar dados de um servidor de banco de dados (primário) para outro (standby). Embora esta postagem de blog se concentre na replicação de streaming, também há outra opção com replicação lógica .
As etapas gerais são as mesmas no Windows e no Linux, mas por uma questão de conveniência, os comandos e exemplos de código nesta postagem são adaptados especificamente para um ambiente Windows. Estamos assumindo que você já tem dois servidores com Postgres instalado neles. Nosso ambiente de teste foi o Postgres 11 no Windows Server 2016.
Agora, vamos começar.
Atualize Postgres.conf e pg_hba.conf
Em seu servidor primário, você precisaria editar seu Postgres.conf para anexar as seguintes configurações:
wal_level = hot_standby
full_page_writes = on
wal_log_hints = onmax_wal_senders = 6
max_replication_slots = 6
hot_standby = on
hot_standby_feedback = on
Você também precisará editar seu pg_hba.conf em seu primário e adicionar os endereços IP externos de ambos os servidores. Sim, você precisará colocar os dois endereços IP. Abaixo está um exemplo:
host replication replicacao IP_of_primary/32 scram-sha-256
host replication replicacao_user IP_of_standby/32 scram-sha-256
Este arquivo será replicado para o modo de espera. Quando esse nó for promovido a primário, ele já estará configurado para permitir que o antigo primário se conecte.
Crie um usuário de replicação chamado replicacap
Você pode estar se perguntando: quem é o replicacao ? Este é o usuário que iremos criar que possui o privilégio de replicação necessário. Provavelmente deveríamos explicar por que fazemos isso. Em seu primário, no prompt de comando, execute o seguinte:
psql -d postgres -U postgres -c "CREATE ROLE replicacao LOGIN REPLICATION ENCRYPTED PASSWORD 'senhasecreta';"
Como você deve ter notado em nossas mudanças de configuração acima ( max_replication_slots = 6 ), estamos usando slots de replicação para esta configuração também. Os slots de replicação evitam problemas com a impossibilidade de localizar segmentos de log write-ahead (WAL) quando um modo de espera é desativado e reativado posteriormente.
Há uma coisa a se ter em mente sobre os slots de replicação: quando o modo de espera estiver inativo, o primário continuará a acumular WAL, pois o slot de replicação não está sendo atualizado. Isso fará com que o diretório WAL seja preenchido até que o backup esteja em espera e receba o WAL ou até que o slot de replicação seja removido. O Postgres 13 trouxe um parâmetro para ajudar com slots de replicação e uso de disco. O Postgres 13 agora tem o parâmetro max_slot_wal_keep_size, que permitirá que você especifique a quantidade de slots de replicação WAL retidos. Embora isso evite que o Postgres preencha seu disco com o WAL aguardando o modo de espera ausente, também significa que o WAL será descartado e o modo de espera precisará ser reconstruído devido à ausência do WAL necessário.
No primário, crie o slot de replicação para o modo de espera executando o seguinte:
psql -d postgres -U postgres -c "SELECT * FROM pg_create_physical_replication_slot('standby1', true);"
Faça um backup básico do primário para o modo de espera
Depois de concluir o acima, você precisará limpar o modo de espera existente. Para fazer isso, primeiro você precisa parar o cluster.
pg_ctl -D "your\data\directory" stop -mi
Depois de parar o cluster, você precisará excluir o diretório de dados. Você pode fazer isso usando o prompt de comando e executando:
rmdir /s \your\data\directory
Ou você pode excluí-lo do File Explorer.
Depois de excluir o diretório de dados do standby, você executará pg_basebackup no standby para copiar o diretório de dados principal para ele.
pg_basebackup -D \your\data\directory -Fp -R -Xs -c fast -l 'initial clone' -P -v -h IP_of_master -U replicacao
Lembre-se de que você precisará inserir a senha do replicacao quando solicitado.
Atualize as configurações do servidor em espera
Por último, quando o backup básico for concluído para Postgres 11 e anteriores, você precisará editar o recovery.conf do seu standby e adicionar o nome do slot de replicação. Para Postgres 12 e superior, o arquivo recovery.conf não existe mais e as configurações para recovery.conf foram movidas para Postgres.conf. Usando sua ferramenta de edição de texto favorita, anexe o seguinte ao seu recovery.conf ou Postgres.conf dependendo da sua versão.
primary_slot_name = 'standby1'
Depois de editar o acima, você pode iniciar o modo de espera usando ` pg_ctl -D [data dir] start` como o usuário Postgres , ou usando o comando ` net start` se você criou uma entrada de serviço em seu servidor Windows.
Existem várias maneiras de verificar se a replicação está funcionando corretamente. Primeiro, nos registros você deve ver:
Started streaming from primary at [wal] on timeline [number]
Você também pode executar os seguintes comandos:
a) No primário
SELECT * FROM pg_stat_replication;
b) Na réplica
SELECT * FROM pg_stat_wal_receiver;
Esta pronto você configurou com êxito a replicação de streaming – parabéns!