PostgreSQL 教程: 检查流复制延迟

一月 8, 2024

摘要:在本教程中,您将学习如何在 PostgreSQL 中检查流复制的延迟。

目录

介绍

在我们管理一个 PostgreSQL 实例的过程中,可能需要检查和防范流复制的延迟。避免在主实例发生故障时,需要备用实例进行接管时可能产生的数据丢失。此外,当我们在使用副本实例提供只读访问服务时,如果流复制延迟过大,从副本实例读取到的数据,跟主实例上面的数据会严重不一致。

方案

PostgreSQL 提供的管理函数pg_last_xact_replay_timestamp(),给出了恢复期间重放的最终事务的时间戳。这是主数据库实例为该特定事务创建提交或回滚的 WAL 记录的时间。

在副本实例上执行select now() - pg_last_xact_replay_timestamp() as replication_lag时,会输出一个持续时间,它表示当前时间与从复制流应用的最新 WAL 记录的时间戳之间的时间差。

需要注意的是,如果主节点没有收到新的更改,则不会有任何 WAL 记录可供流式传输。因此,使用此方法计算的滞后将会增加,而不一定能表示任何的复制延迟。但是,如果主节点正在进行频繁的更改,它将会持续地流式传输 WAL,并且上述查询可以很好地估计出主节点上的更改在从节点上应用所需的时间。当然,这种近似值的精度将取决于两台主机上的系统时钟的同步程度。

要估计从节点的复制延迟,如果您的数据库经常更新,则可以使用下面的查询。

select now() - pg_last_xact_replay_timestamp() AS replication_lag;

在处理写入量很少的数据库时,建议使用更精确的查询来确定复制延迟。应该注意的是,如果主节点没有向从节点发送任何 WAL 记录,则上述查询可能无法提供从节点延迟的准确测量值,因为pg_last_xact_replay_timestamp()可能保持不变。

SELECT
  CASE WHEN NOT pg_is_in_recovery() THEN 0
  WHEN pg_last_wal_receive_lsn() = pg_last_wal_replay_lsn() THEN 0
  ELSE EXTRACT (EPOCH FROM now() - pg_last_xact_replay_timestamp())
  END AS replication_lag;

流复制延迟的原因

在 PostgreSQL 中,流复制延迟可能由以下因素引起:

  • 网络问题
  • 无法从主节点中找到需要的 WAL 段。通常,这是由于检查点过程中轮换或回收 WAL 段所致
  • 节点繁忙(主节点和备节点)。可能是由同一服务器上的外部进程,或一些导致资源密集型的错误查询引起的
  • 硬件配置差或硬件问题导致延迟

了解更多

PostgreSQL 监控