【问题标题】:Avoiding data duplication with Logical replication ( PostgreSQL 10)使用逻辑复制避免数据重复 (PostgreSQL 10)
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢!我们只配置 1+1。所以规划同步逻辑复制。它会使第二个服务器数据库成为只读的吗?因为在设置物理复制时,它使我的第二个服务器数据库成为只读的。
  • 不,第二台服务器将是读写的(但您不应写入正在复制的表)。如果您使用同步逻辑复制,并且备用服务器已关闭,您将无法在主服务器上执行任何数据修改。
  • 谢谢阿尔贝!当主服务器出现故障时,如何将备用服务器更改/配置为主服务器以进行复制?当主节点关闭时,我仍然可以看到“2020-01-08 15:14:08.559 EET >ERROR:重复键值违反唯一约束“pk_xyz_instance””错误消息。
  • 除了删除订阅外,没有什么可以提升逻辑备用。如果逻辑复制对您来说太复杂,请使用更简单且更适合您尝试执行的操作的物理复制。
  • @LaurenzAlbe 如何处理现在作为备用节点的原始主节点上的重复密钥错误。因此,当在主节点上启动订阅并且辅助节点是发布者时,订阅失败并出现重复键错误,因为主节点在节点关闭之前已经拥有数据
猜你喜欢
  • 2017-12-30
  • 1970-01-01
  • 2021-11-27
  • 2010-10-13
  • 1970-01-01
  • 2020-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多