Postgresql 如何监控从机的异步流副本延迟?

Postgresql 如何监控从机的异步流副本延迟?,postgresql,asynchronous,database-replication,postgresql-12,Postgresql,Asynchronous,Database Replication,Postgresql 12,我们有一个使用PostgreSQL 12.x的系统,其中所有更改都将写入主数据库服务器,并使用两个只读流异步副本来减少主服务器上的只读事务负载,这些事务可以处理轻微的延迟 由于异步副本在某些情况下可能会从主副本延迟,因此我们需要一种方法来查询复制的延迟(delay)。我们不想联系主服务器来执行此操作,因此一种明显的方法是从副本服务器查询延迟: select (extract(epoch from now()) - extract(epoch from last_msg_send_time)) *

我们有一个使用PostgreSQL 12.x的系统,其中所有更改都将写入主数据库服务器,并使用两个只读流异步副本来减少主服务器上的只读事务负载,这些事务可以处理轻微的延迟

由于异步副本在某些情况下可能会从主副本延迟,因此我们需要一种方法来查询复制的延迟(delay)。我们不想联系主服务器来执行此操作,因此一种明显的方法是从副本服务器查询延迟:

select
(extract(epoch from now()) - extract(epoch from last_msg_send_time)) * 1000 as delay_ms
from pg_stat_wal_receiver;
然而,
pg_stat_wal_receiver
似乎没有从机的数据。它确实有一行,但只有
pid
列有数据,其他列都为空。文档不清楚详细信息,但可能是
pg_stat_wal_receiver
仅包含
sync
流媒体副本的数据

有没有办法计算出
async
replica的流延迟?我希望这只是某种配置错误,而不是“不支持”


所有服务器机器都在运行PostgreSQL 12.2,但客户端机器仍在运行PostgreSQL 9.5客户端库,以防产生影响。

我不明白为什么表
pg_stat_wal_receiver
没有数据,但这里有一个解决丢失延迟数据的方法

select now() - pg_last_xact_replay_timestamp() as replication_lag;
或者,如果希望延迟为毫秒(普通数字):

请注意,这将使用以下函数(重点):

获取恢复期间回放的上次事务的时间戳。这是 该事务的提交或中止WAL记录的时间 是在主服务器上生成的。如果没有事务被重放 在恢复期间,此函数返回NULL。否则,如果需要恢复 仍在进行中,这将单调增加如果恢复已成功 完成后,该值将在最后一个 恢复期间应用的事务。当服务器运行时 在没有恢复的情况下正常启动,函数返回NULL


然而,当系统具有正常负载时(主服务器上的活动写入),异步流复制似乎会持续增加此时间戳。现在还不清楚如果master没有更改,但流式复制处于活动状态,则此时间戳是否停止增加。

我想我可以回答关于
pg_stat_wal_receiver
缺少列的问题。要阅读其余各列,您需要以超级用户身份登录,或获得
pg_read_all_stats
权限/角色的登录角色

此行为记录在的源代码中,在实现
pg_stat_get_wal_receiver
时说:

...
/*
 * Only superusers and members of pg_read_all_stats can see details.
 * Other users only get the pid value to know whether it is a WAL
 * receiver, but no details.
 */
...

我相信这个问题属于stackoverflow,而不是dba.stackexchange.com,因为客户端应用程序需要有关延迟的信息,以便在延迟太大的情况下,客户端应用程序自动切换到另一个从数据库或主数据库连接。另请参阅:伟大的发现!现在我只需要弄清楚如何将此访问权限授予选定的普通用户,以便在没有超级用户访问权限的情况下计算延迟。这在Ubuntu中非常有效:
echo“select(extract(epoch from Now())-extract(epoch from last_msg_send_time))*1000作为pg_stat_wal_receiver的延迟毫秒;“| sudo-u postgres psql”dbname=mydb1”
我很高兴能帮上忙:)。
...
/*
 * Only superusers and members of pg_read_all_stats can see details.
 * Other users only get the pid value to know whether it is a WAL
 * receiver, but no details.
 */
...