在PostgreSQL中通过pgologic使用多主机时的不同选择结果

时间:2019-03-29 06:51:16

标签: postgresql postgresql-9.6 multi-master-replication pglogical

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

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

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

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

upd:将pgologic.conflict_resolution设置为last_update_wins会有所帮助。可能还会考虑其他解决冲突的方法

1 个答案:

答案 0 :(得分:1)

很难进行多主复制。

除非您的应用程序意识到并且专门为多主复制量身定制,否则肯定会发生冲突:

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

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

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

以下是第二种情况的示例:

-- 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了。不会立即发生复制冲突,但是节点1现在具有person,而节点2没有。很容易看出来这将如何导致以后发生复制冲突(想象一下,您在节点person 1234上插入了一行,并在该节点上插入了一行)。

这就是为什么在大多数情况下考虑不包含多主复制的体系结构是一个好主意的原因。