是否可以声明一个全局变量以分发到热备用服务器?

Posted

技术标签:

【中文标题】是否可以声明一个全局变量以分发到热备用服务器?【英文标题】:Is it possible to declare a global variable to be distributed to hot standby servers? 【发布时间】:2020-04-17 16:28:33 【问题描述】:

我正在尝试解决 PostgreSQL 9.5 不支持从热备用查询复制延迟的事实(可以从主服务器查询延迟,但我试图避免连接主服务器,除非绝对必要)。我们将热备用副本服务器用作我们的 Web 服务的只读服务器,如果它与主服务器延迟太多,我们希望忽略该服务器。为便于讨论,假设通过热备访问数据时延迟严格小于 5 秒是可以的。

是否可以在主服务器上定义一个复制到从属服务器的变量(异步流模式下的热备用副本)?

我目前有一个单行单列表用于在数据库中存储全局时间戳,我在通过热备用副本访问其他数据之前检查了这个时间戳。并且脚本每秒在主数据库上更新此时间戳。但是,我无法检查事务中的时间戳,否则我会回滚事务

40001 terminating connection due to conflict with recovery
User query might have needed to see row versions that must be removed.
In a moment you should be able to reconnect to the database and repeat your command.

有没有什么技巧可以将一些数据从主服务器发布到热备用服务器,以便在事务处于活动状态时访问?我不需要回滚对此变量的更改,也不需要跟踪事务(也就是说,即使在可重复读取隔离模式下的事务处于活动状态时,此变量的值也可以更改)。

【问题讨论】:

【参考方案1】:

半年没有人提供任何解决方案,所以我假设没有已知的解决方案

我通过使用单独的事务从复制表中查询全局时间戳来解决事务问题。在我的情况下,创建连接、开始事务、查询时间戳、提交就足够了事务,然后检查时间戳。如果延迟不太高,继续开始真正的事务,做事务需要做的任何事情(记住,这必须是真正的只读事务),最后提交事务。

这样我不需要任何额外的连接,但我需要创建一个额外的事务来检查时间戳。因为带有时间戳的表只有一列一行,所以检查值总是很快的。

【讨论】:

以上是关于是否可以声明一个全局变量以分发到热备用服务器?的主要内容,如果未能解决你的问题,请参考以下文章

JS学习之函数的作用域

Qt中的全局变量声明

如何引用一个已经定义过的全局变量

MATLAB全局变量

在sqlserver2016中局部变量名以啥开头而全局变量

SQLserver 怎么声明变量?