2016-10-31 3 views
3

Ich finde official pglogical documentation sehr verwirrend. Es gibt zu viele Dinge, die nicht klar sind. Vielleicht könnte jemand, der pglogical zuvor konfiguriert hat, erklären, wie man eine grundlegende logische Replikation einrichtet.PostgreSQL: Schwierigkeiten mit der grundlegenden logischen Konfiguration

Es gibt zwei PostgreSQL 9.5-Instanzen - 10.128.0.8 (archlinux1) und 10.128.0.9 (archlinux2). Erweiterung ist bereits installiert, CREATE EXTENSION ist erfolgreich. Es gibt eine Tabelle für jede Instanz:

create table test (k text primary key, v text); 

ich es von archlinux1 zu archlinux2 replizieren möchte.

der Dokumentation Laut ich einen Providerknoten schaffen sollte:

SELECT pglogical.create_node(
    node_name := 'provider1', 
    dsn := 'host=providerhost port=5432 dbname=db' 
); 

Sollte es auf dem Master ausgeführt? Sollte Providerhost 127.0.0.1 oder 10.128.0.8 sein? Aktuelle Replikation ist nur von localhost (entsprechend zu docs) erlaubt - sollte es geändert werden? Meine beste Vermutung - es sollte wie folgt auf Master ausgeführt werden:

SELECT pglogical.create_node(
    node_name := 'provider1', 
    dsn := 'host=127.0.0.1 port=5432 dbname=eax' 
); 
create_node 
------------- 
    2976894835 
(1 row) 

Next:

SELECT pglogical.replication_set_add_all_tables('default', ARRAY['public']); 

Sollte es auf Master, Replik oder beides ausgeführt werden? Meine beste Vermutung - nur auf Master:

SELECT pglogical.replication_set_add_all_tables('default', ARRAY['public']); 
replication_set_add_all_tables 
-------------------------------- 
t 
(1 row) 

Next:

SELECT pglogical.create_node(
    node_name := 'subscriber1', 
    dsn := 'host=127.0.0.1 port=5432 dbname=eax' 
); 
create_node 
------------- 
    330520249 
(1 row) 

Nächster Schritt:

SELECT pglogical.create_subscription(
    subscription_name := 'subscription1', 
    provider_dsn := 'host=providerhost port=5432 dbname=db' 
); 

Beste

SELECT pglogical.create_node(
    node_name := 'subscriber1', 
    dsn := 'host=thishost port=5432 dbname=db' 
); 

Offenbar sollte es auf Replikat ausgeführt werden rate - führe es auf Replik wie aus diese:

SELECT pglogical.create_subscription(
    subscription_name := 'subscription1', 
    provider_dsn := 'host=10.128.0.8 port=5432 dbname=eax' 
); 
ERROR: could not connect to the postgresql server: could not connect to server: Connection refused 
    Is the server running on host "10.128.0.8" and accepting 
    TCP/IP connections on port 5432? 

DETAIL: dsn was: host=10.128.0.8 port=5432 dbname=eax 

Hoppla. OK, Ändern pg_hba.conf und postgresql.conf richtig auf Master:

# pg_hba.conf 
host all all 10.128.0.0/16 md5 
# postgresql.conf 
listen_addresses = 'localhost,10.128.0.8 

Noch kein Glück:

# SELECT pglogical.create_subscription(
    subscription_name := 'subscription1', 
    provider_dsn := 'host=10.128.0.8 port=5432 dbname=eax user=eax password=qwerty' 
); 
ERROR: could not connect to the postgresql server in replication mode: FATAL: no pg_hba.conf entry for replication connection from host "10.128.0.9", user "eax", SSL off 

DETAIL: dsn was: host=10.128.0.8 port=5432 dbname=eax user=eax password=qwerty 

Hinzufügen auf Master pg_hba.conf:

host replication  eax  10.128.0.0/16   md5 

Auf Replik (Erfolg!):

SELECT pglogical.create_subscription(
    subscription_name := 'subscription1', 
    provider_dsn := 'host=10.128.0.8 port=5432 dbname=eax user=eax password=qwerty' 
); 
create_subscription 
--------------------- 
      1763399739 
(1 row) 

Jetzt o n-Master:

eax=# insert into test values ('aaa', 'bbb'); 
INSERT 0 1 
eax=# select * from test; 
    k | v 
-----+----- 
aaa | bbb 
(1 row) 

Auf Replik:

eax=# select * from test; 
k | v 
---+--- 
(0 rows) 

natürlich es hat nicht funktioniert. Nichts ist hilfreich in den Protokollen. Irgendein Rat?

UPD: Ich habe auch eine corresponding issue in Pgllogical Issue Tracker erstellt.

Antwort

Verwandte Themen