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

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

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

  • 使用pg_dump命令将Server1上的PG转储。
  • 使用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的早期数据,所以我进行了转储并将其还原到其他位置,并使用copy_data作为false来避免重复。

每次将服务从Server1切换到Server2或从Server1切换到Server2后,这些唯一的违反约束错误都会在Server2上看到(服务处于非活动状态)

使用PostgreSQL 10.11进行复制设置时,这里缺少什么吗?

copy_data标志是否未按预期工作?

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

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

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

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

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