【问题标题】:Do PostgreSQL subscriber servers lock when synchronizing to an update to the publisher server?PostgreSQL 订阅服务器在同步到发布服务器的更新时会锁定吗?
【发布时间】:2019-10-26 08:09:36
【问题描述】:

如果我有 3 个数据库

  • Db1:仅用于写入、发布者
    • Db2:仅用于读取,Db1 的订阅者
    • Db3:仅用于读取,Db1 的订阅者

只是为了澄清“仅用于读取”意味着我的应用程序不会尝试修改该数据库。反过来适用于“仅用于写入”。我不是在谈论数据库本身的功能。也许我会使用权限来实现这一点,但无论如何。

浏览official documentation for logical replication 找不到答案的一些问题:

  • 在对 Db1 进行新写入的情况下,Db2 和 Db3 会在同步更改时都锁定,还是允许在同步的同时进行读取?

  • 如果订阅服务器在发布对 Db1 的新更改时正在执行读取,则可用的更改是否会在它们到达订阅服务器后立即执行下一个操作,无论读取多少次是否已经在等待执行(如果有)?

我关心的是负载平衡集群(仅用于读取)PostgreSQL 服务器的一致性,这些服务器是 Db1 的副本。它们都应该与 Db1 同步,在与 Db1 发布的新更改同步之前不允许对它们进行任何新的读取。如果我不能通过逻辑复制来做到这一点,那么有什么替代方案(如果有的话)?

【问题讨论】:

    标签: postgresql replication logical-replication


    【解决方案1】:

    在对 Db1 进行新写入的情况下,Db2 和 Db3 在更新时是否都会锁定读取?

    作家不会在宏观层面上阻止读者。使用逻辑复制不会改变这一点。

    在与 Db1 同步之前是否会等待完成当前读取 - 即使在多核服务器上也是如此?

    在某种意义上。如果读者有一个页面被锁定以供阅读,作者将无法写入该页面。但是,这种锁定通常保持极短(亚微秒)。

    如果有等待,无论该服务器的操作队列中已经有多少读取,同步是否会成为下一个要执行的操作?

    什么是“操作队列”?我不相信 PostgreSQL 有。

    它们都应该同步,在同步到 Db1 的新更改之前不允许对它们进行任何新的读取。

    即使所有查询都在同一台服务器上完成,您也无法控制只读查询是在提交其他内容之前执行一纳秒,还是之后执行一纳秒。即使使用可序列化的隔离级别,您也只能保证存在一些事务的序列顺序。您不会被告知该订单是什么,也不允许查看诸如 clock_timestamp() 之类的东西来弄清楚。如果“只读”查询需要确保某物静止不动,则需要将其锁定。

    如果只读事务使用其数据视图来做出决定,则需要将该决定反映回数据库中,这意味着该事务并不是真正的只读。

    如果我不能通过逻辑复制来做到这一点,那么有什么替代方案(如果有的话)?

    想要一些不同的东西。即使在同一台服务器中,您也无法做到这一点。

    【讨论】:

    • 我编辑了我的问题以使其更清楚。我不是在谈论绝对 0 毫秒同步。英语不是我的第一语言。我所说的“操作队列”只是指任何等待进行的查询,如果有的话。请在您的回答中考虑我的修改,并感谢您提供帮助。
    猜你喜欢
    • 1970-01-01
    • 2018-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 2021-05-06
    相关资源
    最近更新 更多