0

有两个 PostgreSQL 9.6 节点通过 pglogical 相互订阅。如果节点 A 在复制表中插入一行,则节点 B 会看到它,反之亦然。

但是,当我在一个节点上更新一行时,SELECT两个节点上的后续查询将不断返回不同的结果——当前的结果和之前的一些结果。

此外,两个节点的日志中都有关于复制冲突的日志条目。

为什么会发生这种情况,我该如何解决?

upd:将 pglogical.conflict_resolution 设置为 last_update_wins 会有所帮助。也可以考虑其他解决冲突的选择

4

1 回答 1

1

多主复制很困难。

除非您的应用程序知道并专门针对多主复制进行了定制,否则肯定会发生冲突:

  • 在不同节点上插入的行相同(自动生成的主键必须冲突。

  • 如果在一个节点上修改行的主键,同时在另一个节点上更新或删除它,数据库将“分开”,从而导致未来的冲突。

您必须修复您的应用程序,以避免出现上述问题,并且您必须手动查找并解决迄今为止发生的所有冲突。

这是第二种情况的示例:

-- node one:

UPDATE person
SET id = 1234
WHERE id = 6543;

-- at the same time on node two

DELETE FROM person
WHERE id = 6543;

两个语句都将被复制到另一个节点,但在那里什么都不做,因为两个节点不再有person6543id了。不会立即发生复制冲突,但节点一现在有一个person节点二没有的。很容易看出这会如何导致稍后的复制冲突(假设您在节点 1 上插入一行,该行与person1234 具有外键关系)。

这就是为什么在大多数情况下考虑包括多主复制的架构是个好主意。

于 2019-03-29T07:05:47.190 回答