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.