【发布时间】:2020-01-08 14:39:27
【问题描述】:
我已经使用 pcsd 配置配置了两台具有冗余设置的服务器。 两台机器都包含 Postgres 10 和逻辑复制。用于逻辑复制设置的以下步骤。
- 使用 pg_dump 命令在 Server1 上进行 PG Dump。
- 使用 pg_restore 使用 postgres 10 在 Server2 上恢复它。
- 对 pg_hba.conf 和 postgres.conf 文件进行了更改。
- 在以下命令中使用,用于设置逻辑复制。
CREATE PUBLICATION my_publication FOR ALL TABLES;
CREATE SUBSCRIPTION my_subscription
CONNECTION 'host=Server1 port=5432 password=postgres user=postgres dbname=database1'
PUBLICATION my_publication WITH (copy_data = false);
- 重新启动两台服务器。
完成上述步骤后,我可以看到两个系统(冗余系统)上的服务都运行良好。但从日志中我可以看到以下错误消息。
...
2020-01-08 15:14:08.551 EET >LOG: logical replication apply worker for subscription "my_subscription" has started
2020-01-08 15:14:08.559 EET >ERROR: duplicate key value violates unique constraint "pk_xyz_instance"
2020-01-08 15:14:08.559 EET >DETAIL: Key (xyz_instance_id)=(103) already exists.
2020-01-08 15:14:08.560 EET >LOG: worker process: logical replication worker for subscription 23176 (PID 7411) exited with exit code 1
....
由于我需要Server1的早期数据,我将dump并恢复到其他数据并使用copy_data作为false以避免重复。
每次服务从 Server1 切换到 Server2 或反之亦然后,在 Server2 上都会看到这些唯一的约束违规错误(其中服务处于非活动状态)
在使用 PostgreSQL 10.11 进行复制设置时,我这里有什么遗漏吗?
copy_data 标志是否未按预期工作?
【问题讨论】:
-
您有同步或异步逻辑复制吗?故障转移过程究竟是如何工作的?请edit问题并在那里添加描述。为什么不使用物理复制?
-
我们可以在 pg_stat_replication 表中看到 sync_state 作为异步。确切地说,我们正计划从 bucardo 实现转移到 postgresql 数据库复制机制的内置特性。如果您建议其中任何一个(逻辑/物理)更接近 bucardo 实现(需要处理多个服务切换),那将是一个很大的帮助?
-
如何处理现在作为备用节点的原始主节点上的重复密钥错误。因此,当在主节点上启动订阅并且辅助节点是发布者时,订阅失败并出现重复键错误,因为主节点在节点关闭之前已经拥有数据。
标签: database postgresql replication database-replication postgresql-10