在 PostgreSQL 中通过 pglogical 使用 multimaster 时的不同 select 结果

Different select results when using multimaster via pglogical in PostgreSQL

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

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

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

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

更新:将 pglogical.conflict_resolution 设置为 last_update_wins 有帮助。也可以考虑其他解决冲突的方法

多主复制困难。

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

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

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

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

这是第二种情况的例子:

-- node one:

UPDATE person
SET id = 1234
WHERE id = 6543;

-- at the same time on node two

DELETE FROM person
WHERE id = 6543;

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

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