O Postgresql não aceita conexão de replicação

19

Replicação simples de streaming antigo. PostgreSQL: 9.2.7 Windows 8.1 de 64 bits

Meus clusters primário e secundário estão na mesma máquina Windows. Eu já fiz pg_start_backup () e tudo, então os dois nós têm exatamente os mesmos dados.

Agora, o problema com a replicação é "conexão de replicação" do servidor escravo, não conecte ao servidor primário, mas eu posso conectar usando os mesmos parâmetros usando o shell psql. O que eu acho culpado é a cadeia de conexão no recovery.conf do escravo:

primary_conninfo = 'host = 127.0.0.1 port = 5432 user = postgres password = postgres'

Eu tentei localhost, 0.0.0.0, lan IP tudo, mas pg log diz:

 FATAL:  could not connect to the primary server: FATAL:  no pg_hba.conf entry for replication connection from host "127.0.0.1", user "postgres", SSL off

Agora veja o pg_hba.conf do meu mestre:

host     all     all     0.0.0.0/0   trust
host    all             postgres             127.0.0.1/0               trust
# IPv6 local connections:
host    all             all             ::1/128                 md5
hostnossl    all     postgres    127.0.0.1/32    trust
# Allow replication connections from localhost, by a user with the
# replication privilege.
#host    replication     postgres        127.0.0.1/32            md5
#host    replication     postgres        ::1/128                 md5

É como se eu permitisse todas as conexões possíveis, mas o escravo não pode se conectar. Você pode fazer alguma ajuda?

Sachin Verma
fonte

Respostas:

25

O nome do banco de dados deve ser replicationo allque não abrange as conexões de replicação.

host    replication    postgres             127.0.0.1/0               trust

A documentação do PostgreSQL diz ainda:

O valor replicationespecifica que o registro corresponde se uma conexão de replicação for solicitada (observe que as conexões de replicação não especificam nenhum banco de dados específico). Caso contrário, este é o nome de um banco de dados PostgreSQL específico. Vários nomes de banco de dados podem ser fornecidos, separando-os com vírgulas. Um arquivo separado contendo nomes de banco de dados pode ser especificado precedendo o nome do arquivo com @.

Sachin Verma
fonte
precisamos criar um banco de dados de replicação? ou é embutido?
gimibarak
Não é embutido e você precisa configurar a replicação. Aqui está a referência: digitalocean.com/community/tutorials/…
Sachin Verma
Observe que esse não é o caso da replicação lógica.
mlissner 24/04
3

Adicionar a linha abaixo pg_hba.confe recarregar funcionou para mim. Considerando que o tipo é 'local', não é necessário especificar explicitamente um endereço.

# TYPE  DATABASE        USER            ADDRESS                 METHOD
local   replication     postgres                                peer

E lembre-se de pg_ctl reload

Rogerlr
fonte
2

Outra solução possível aqui que encontrei. Se você estiver fazendo replicação lógica e tiver o DATABASE definido como replicação, ele não funcionará. Ele precisa apenas obter um parâmetro regular. O replicationparâmetro é para replicação física, não replicação lógica.

Cara, esse levou algum trabalho para descobrir. Eu espero que isso ajude!

mlissner
fonte
11
Isso precisa ser mais votado. Passei horas solucionando problemas do plug-in wal2json até encontrar esse e essa foi a resposta certa para mim. Parece que o plugin wal2json usa replicação lógica, portanto, para que o comando pg_recvlogical de exemplo funcione, eu precisava definir o pg_hba.conf para usar o nome do banco de dados 'test' em vez da palavra-chave 'replication'
Alf47