双向复制设计:顺序或同时在源DB上编写和执行不匹配的行到多个订户DB的最佳方法?

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

感谢您提供的帮助或建议。

我试图在Windows上的Postgresql 10上构建我自己的多主复制,因为这种情况不能使用任何当前的第三方工具进行PG多主机复制,这也可能涉及订阅者组中的另一个数据库平台(Sybase ADS) 。我有以下逻辑来创建双向复制,部分受Bucardo逻辑的启发,介于1个发布者和2个订阅者之间:

  1. 在源表上进行INSERT,UPDATE或DELETE时,源表触发器将行添加到源DB上创建的元表,该表将充当要对其订阅的2个订户DB执行的复制事务。
  2. NOTIFY信号将被发送到服务,或者用Python或某种脚本语言编写的脚本将监视metatable或触发器执行中的更改,并能够执行表比较或脚本化语句以在每个订户数据库上运行。

***我认为订阅者的触发器需要暂停以防止他们将收到的语句推送给他们的订阅者,即如果节点A和节点B都订阅了彼此的表A,那么更新节点A的表A应该复制到节点B的表A,而不是在双向“乒乓风暴”中复制回表A.

  1. 表之间将进行最终比较,交易将被关闭。如果在推送第2步附录中的交易时暂停/禁用订阅者,则重新启用订阅者。

希望能够以FIFO顺序以时间戳的顺序双向完成,除非我能找出创建子进程以同时运行同步的方法。

为此,我试图找出设置服务逻辑的最佳方法 - 实际上是上面的步骤2,显然是在Linux中使用守护进程完成的,但我必须在Windows中工作,使其运行为,或者类似于服务/代理 - 或者提出一种相当简单有效的设计来将源DB语句发送给订户DB。

有没有人看到这个计划有缺陷或可能不起作用?

postgresql database-design database-replication bidirectional
1个回答
0
投票

免责声明:我对Postgresql一无所知,但已经做了大量的自定义复制。

双向复制的主要问题是合并问题。

如果在具有不同属性的两个系统中使用相同的密钥,哪一个可以推动其更改?如果你提名一个大师,那就容易了。然后奴隶每次都被覆盖。

您可以处理多少延迟?将“通知”部分取出更容易,只需要一个五分钟的Windows任务调度程序作业来检查日志表并推送数据。

换句话说,这种模式:

  1. 更改发生在表中。该表上的数据库触发器记录了更改,并将表的PK写入更改日志表。默认情况下,日志表中的ReplicationBatch列设置为NULL
  2. Windows计划任务检查所有更改日志表以查找自上次运行以来发生的所有更改,并通过将其复制状态设置为复制批次编号来“保留”这些记录

即你运行UPDATE LogTable Set ReplicationBatch=BatchNumber WHERE ReplicationState IS NULL

  1. 已复制的所有记录都已复制

你运行SELECT * FROM LogTable WHERE ReplicationState=RepID来获取要处理的记录

  1. 完成后,保留的记录将标记为完成,以便下次只复制后续更改。此完成标志可能位于日志表中,也可能位于ReplicaionBatch数字表中

重点是您需要保留复制记录,以便在复制它们时,可以从源添加其他日志记录而不会弄乱批处理

然后定期清除日志表。

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