我已经使用pcsd配置为两个服务器配置了冗余设置。这两台机器都由Postgres 10和逻辑复制组成。在以下步骤中用于逻辑复制设置。
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的早期数据,所以我进行了转储并将其还原到其他位置,并使用copy_data作为false来避免重复。
每次将服务从Server1切换到Server2或从Server1切换到Server2后,这些唯一的违反约束错误都会在Server2上看到(服务处于非活动状态)
使用PostgreSQL 10.11进行复制设置时,这里缺少什么吗?
copy_data标志是否未按预期工作?
使用异步复制,总是会发生备用服务器在故障转移时滞后并且丢失某些事务的情况。如果您尝试使用旧的主服务器(可能需要进行一些事务)作为新的备用服务器,则数据库可能会不一致,并且可能会发生您所观察到的复制冲突。
一种解决方案是使用同步逻辑复制,但是除非您有多个备用服务器,否则这将降低可用性。
最好是使用物理复制。它不仅更简单,更高效,而且还可以使用pg_rewind
快速将旧的主服务器转换为新的备用服务器。