避免通过逻辑复制进行数据复制(Postgre SQL 10)

问题描述 投票:0回答:1

我已经使用pcsd配置为两个服务器配置了冗余设置。这两台机器都由postgres10和逻辑复制组成,用于以下步骤进行逻辑复制设置。

  • 使用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>日志:逻辑复制将订阅“ my_subscription”的应用工作程序启动<2020-01-08 15:14:08.559 EET>错误:重复的键值违反了唯一约束“ pk_xyz_instance”<2020-01-08 15:14:08.559 EET>详细信息:密钥(xyz_instance_id)=(103)已存在。<2020-01-08 15:14:08.560 EET>日志:工作进程:退出的预订23176(PID 7411)的逻辑复制工作进程退出代码为1....

由于我需要Server1的早期数据,我进行了转储并将其恢复到其他位置,并使用copy_data作为false来避免重复。服务从Server1到Server2的每次切换后,反之亦然,在Server2上看到这些唯一的违反约束错误(服务处于非活动状态)

使用Postgre SQL 10.11进行复制设置时,这里是否缺少任何内容?copy_data标志不能按我预期的那样工作吗?

database postgresql replication database-replication postgresql-10
1个回答
0
投票

使用异步复制,总是会发生备用数据库在故障转移时滞后并且丢失某些事务的情况。如果您尝试使用旧的主服务器(可能需要进行一些事务)作为新的备用服务器,则数据库可能会不一致,并且可能会发生您观察到的复制冲突。

一种解决方案是使用同步逻辑复制,但是除非您有多个备用服务器,否则这将降低可用性。

最好是使用物理复制。它不仅更简单,更高效,而且还可以使用pg_rewind快速将旧的主服务器转换为新的备用服务器。

© www.soinside.com 2019 - 2024. All rights reserved.