在 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;
两个语句都将被复制到另一个节点,但在那里什么都不做,因为两个节点不再有 person
和 id
6543。马上不会有复制冲突,但是节点一现在有一个节点二没有的 person
。稍后很容易看出这会如何导致复制冲突(假设您在节点一上插入一行,该行与 person
1234 具有外键关系)。
这就是为什么在大多数情况下考虑不包含多主复制的架构是个好主意。
有两个 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;
两个语句都将被复制到另一个节点,但在那里什么都不做,因为两个节点不再有 person
和 id
6543。马上不会有复制冲突,但是节点一现在有一个节点二没有的 person
。稍后很容易看出这会如何导致复制冲突(假设您在节点一上插入一行,该行与 person
1234 具有外键关系)。
这就是为什么在大多数情况下考虑不包含多主复制的架构是个好主意。