PostgreSQL:基本的 pglogical 配置困难
PostgreSQL: difficulties with basic pglogical configuration
我发现 official pglogical documentation 非常混乱。不明白的事情太多了。也许之前配置过 pglogical 的人可以解释如何设置基本的逻辑复制。
有两个 PostgreSQL 9.5 实例 - 10.128.0.8 (archlinux1) 和 10.128.0.9 (archlinux2)。扩展已安装,CREATE EXTENSION 成功。每个实例上都有一个 table:
create table test (k text primary key, v text);
我想将它从 archlinux1 复制到 archlinux2。
根据文档,我应该创建一个提供者节点:
SELECT pglogical.create_node(
node_name := 'provider1',
dsn := 'host=providerhost port=5432 dbname=db'
);
应该在master上执行吗? providerhost 应该是 127.0.0.1 还是 10.128.0.8? Currenlty 复制只允许从本地主机(根据文档) - 它应该改变吗?我最好的猜测 - 它应该像这样在 master 上执行:
SELECT pglogical.create_node(
node_name := 'provider1',
dsn := 'host=127.0.0.1 port=5432 dbname=eax'
);
create_node
-------------
2976894835
(1 row)
下一个:
SELECT pglogical.replication_set_add_all_tables('default', ARRAY['public']);
它应该在主服务器、副本服务器或两者上执行吗?我最好的猜测 - 仅在 master 上:
SELECT pglogical.replication_set_add_all_tables('default', ARRAY['public']);
replication_set_add_all_tables
--------------------------------
t
(1 row)
下一个:
SELECT pglogical.create_node(
node_name := 'subscriber1',
dsn := 'host=thishost port=5432 dbname=db'
);
显然应该在副本上执行:
SELECT pglogical.create_node(
node_name := 'subscriber1',
dsn := 'host=127.0.0.1 port=5432 dbname=eax'
);
create_node
-------------
330520249
(1 row)
下一步:
SELECT pglogical.create_subscription(
subscription_name := 'subscription1',
provider_dsn := 'host=providerhost port=5432 dbname=db'
);
最佳猜测 - 像这样在副本上执行它:
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
糟糕。好的,在 master 上正确修改 pg_hba.conf 和 postgresql.conf:
# pg_hba.conf
host all all 10.128.0.0/16 md5
# postgresql.conf
listen_addresses = 'localhost,10.128.0.8
仍然没有运气:
# 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
添加到 pg_hba.conf 主节点:
host replication eax 10.128.0.0/16 md5
在副本上(成功!):
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)
现在掌握:
eax=# insert into test values ('aaa', 'bbb');
INSERT 0 1
eax=# select * from test;
k | v
-----+-----
aaa | bbb
(1 row)
在副本上:
eax=# select * from test;
k | v
---+---
(0 rows)
自然不行。日志中没有任何帮助。有什么建议吗?
UPD:我还在 pglogical 问题跟踪器中创建了一个 corresponding issue。
也许这是一个更好的指南:http://bonesmoses.org/2016/10/14/pg-phriday-perfectly-logical/ - 至少它告诉您要在哪些节点上执行每个命令。
Depesz 发表了一篇关于 pglogical 配置的优秀博客 post https://www.depesz.com/2016/11/08/major-version-upgrading-with-minimal-downtime/
创建节点时需要指定外部 IP(不是本地主机)
在供应商
SELECT pglogical.create_node(
node_name := 'provider1',
dsn := 'host=subscriberhost port=5432 dbname=db'
);
订阅者
SELECT pglogical.create_node(
node_name := 'subscriber1',
dsn := 'host=providerhost port=5432 dbname=eax'
);
我发现 official pglogical documentation 非常混乱。不明白的事情太多了。也许之前配置过 pglogical 的人可以解释如何设置基本的逻辑复制。
有两个 PostgreSQL 9.5 实例 - 10.128.0.8 (archlinux1) 和 10.128.0.9 (archlinux2)。扩展已安装,CREATE EXTENSION 成功。每个实例上都有一个 table:
create table test (k text primary key, v text);
我想将它从 archlinux1 复制到 archlinux2。
根据文档,我应该创建一个提供者节点:
SELECT pglogical.create_node(
node_name := 'provider1',
dsn := 'host=providerhost port=5432 dbname=db'
);
应该在master上执行吗? providerhost 应该是 127.0.0.1 还是 10.128.0.8? Currenlty 复制只允许从本地主机(根据文档) - 它应该改变吗?我最好的猜测 - 它应该像这样在 master 上执行:
SELECT pglogical.create_node(
node_name := 'provider1',
dsn := 'host=127.0.0.1 port=5432 dbname=eax'
);
create_node
-------------
2976894835
(1 row)
下一个:
SELECT pglogical.replication_set_add_all_tables('default', ARRAY['public']);
它应该在主服务器、副本服务器或两者上执行吗?我最好的猜测 - 仅在 master 上:
SELECT pglogical.replication_set_add_all_tables('default', ARRAY['public']);
replication_set_add_all_tables
--------------------------------
t
(1 row)
下一个:
SELECT pglogical.create_node(
node_name := 'subscriber1',
dsn := 'host=thishost port=5432 dbname=db'
);
显然应该在副本上执行:
SELECT pglogical.create_node(
node_name := 'subscriber1',
dsn := 'host=127.0.0.1 port=5432 dbname=eax'
);
create_node
-------------
330520249
(1 row)
下一步:
SELECT pglogical.create_subscription(
subscription_name := 'subscription1',
provider_dsn := 'host=providerhost port=5432 dbname=db'
);
最佳猜测 - 像这样在副本上执行它:
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
糟糕。好的,在 master 上正确修改 pg_hba.conf 和 postgresql.conf:
# pg_hba.conf
host all all 10.128.0.0/16 md5
# postgresql.conf
listen_addresses = 'localhost,10.128.0.8
仍然没有运气:
# 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
添加到 pg_hba.conf 主节点:
host replication eax 10.128.0.0/16 md5
在副本上(成功!):
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)
现在掌握:
eax=# insert into test values ('aaa', 'bbb');
INSERT 0 1
eax=# select * from test;
k | v
-----+-----
aaa | bbb
(1 row)
在副本上:
eax=# select * from test;
k | v
---+---
(0 rows)
自然不行。日志中没有任何帮助。有什么建议吗?
UPD:我还在 pglogical 问题跟踪器中创建了一个 corresponding issue。
也许这是一个更好的指南:http://bonesmoses.org/2016/10/14/pg-phriday-perfectly-logical/ - 至少它告诉您要在哪些节点上执行每个命令。
Depesz 发表了一篇关于 pglogical 配置的优秀博客 post https://www.depesz.com/2016/11/08/major-version-upgrading-with-minimal-downtime/
创建节点时需要指定外部 IP(不是本地主机)
在供应商
SELECT pglogical.create_node(
node_name := 'provider1',
dsn := 'host=subscriberhost port=5432 dbname=db'
);
订阅者
SELECT pglogical.create_node(
node_name := 'subscriber1',
dsn := 'host=providerhost port=5432 dbname=eax'
);