Postgresql nie akceptuje połączenia replikacji

19

Zwykła replikacja przesyłania strumieniowego. PostgreSQL: 9.2.7 Windows 8.1 64 bit

Moje podstawowe i dodatkowe klastry znajdują się na tym samym komputerze z systemem Windows. Zrobiłem już pg_start_backup () i wszystko, więc oba węzły mają dokładnie takie same dane.

Teraz problem z replikacją polega na tym, że „połączenie replikacji” z serwera podrzędnego nie łączy się z serwerem podstawowym, ale mogę łączyć się przy użyciu tych samych parametrów przy użyciu powłoki psql. Moim zdaniem winowajcą jest ciąg połączenia w procesie odzyskiwania slave.conf:

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

Próbowałem localhost, 0.0.0.0, LAN IP wszystko oprócz dziennika pg mówi:

 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

Teraz spójrz na pg_hba.conf mojego Mistrza:

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

To tak, jakbym zezwolił na każde możliwe połączenie, ale Slave nie może się połączyć. Czy możesz mi pomóc?

Sachin Verma
źródło

Odpowiedzi:

25

Nazwa bazy danych musi być taka, replicationjak allnie obejmuje połączeń replikacji.

host    replication    postgres             127.0.0.1/0               trust

Dokumentacja PostgreSQL mówi dalej:

Wartość replicationokreśla, że ​​rekord jest zgodny, jeśli żądane jest połączenie replikacyjne (zwróć uwagę, że połączenia replikacyjne nie określają żadnej konkretnej bazy danych). W przeciwnym razie jest to nazwa konkretnej bazy danych PostgreSQL. Można podać wiele nazw baz danych, oddzielając je przecinkami. Oddzielny plik zawierający nazwy bazy danych można określić, poprzedzając nazwę pliku znakiem @.

Sachin Verma
źródło
czy musimy utworzyć bazę danych replikacji? czy jest wbudowany?
gimibarak
Nie jest wbudowany i musisz skonfigurować replikację. Oto odniesienie: digitalocean.com/community/tutorials/…
Sachin Verma
Pamiętaj, że nie dotyczy to replikacji logicznej.
mlissner
3

Dodanie poniższego wiersza pg_hba.confi ponowne załadowanie działało dla mnie. Biorąc pod uwagę, że typ jest „lokalny”, jawne określenie adresu nie jest konieczne.

# TYPE  DATABASE        USER            ADDRESS                 METHOD
local   replication     postgres                                peer

I pamiętajcie o tym pg_ctl reload

Rogerlr
źródło
2

Jeszcze jedno możliwe rozwiązanie, na które wpadłem. Jeśli wykonujesz replikację logiczną, a dla opcji DATABASE ustawiono opcję replikacji, nie zadziała. Musi tylko uzyskać zwykły parametr. Ten replicationparametr służy do replikacji fizycznej, a nie logicznej.

Człowieku, zajęło to trochę pracy, żeby to rozgryźć. Mam nadzieję, że to pomoże!

mlissner
źródło
1
Trzeba to bardziej docenić. Spędziłem godziny na rozwiązywaniu problemów z wtyczką wal2json, dopóki nie znalazłem tego i była to dla mnie odpowiednia odpowiedź. Wygląda na to, że wtyczka wal2json korzysta z logicznej replikacji, więc aby uzyskać przykładowe polecenie pg_recvlogical, musiałem ustawić pg_hba.conf, aby używał nazwy bazy danych „test” zamiast słowa kluczowego „replikacja”
Alf47