发布服务器更新时,PostgreSQL锁定/队列是否读取订阅服务器?

问题描述 投票:0回答:1

如果我有3个数据库

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

仅说明“仅用于读取”是指我的应用程序不会尝试修改该数据库。反之适用于“仅用于写入”。我不是在谈论数据库本身的功能。也许我将使用权限来完成此操作,但是不管如何。

一些我无法通过浏览official documentation for logical replication来找到答案的问题:

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

  • 如果订户服务器在发布对Db1的新更改时正在执行读取,则无论更改已到达订阅者多少,可用更改将是到达订户后将要执行的下一个操作。等待执行(如果有)?

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

postgresql replication logical-replication
1个回答
-1
投票

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

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

即使在多核服务器上,在与Db1同步之前是否还会有等待完成当前读取的时间?

从某种意义上说。如果阅读器的页面被锁定以供阅读,则书写者将无法写入该页面。但是,此类锁定通常保持极短(亚微秒)。

如果有等待,则同步将是下一个要执行的操作,而不管该服务器的操作队列中已经有多少次读取?

什么是“操作队列”?我不认为PostgreSQL有一个。

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

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

如果只读事务使用其数据视图进行决策,则该决策需要反映回数据库中,这意味着事务不是真正的只读。

如果我不能使用逻辑复制做到这一点,那么有什么替代方法,如果有的话?

想要一些不同的东西。您甚至不能在同一服务器上执行此操作。

© www.soinside.com 2019 - 2024. All rights reserved.