openGauss集群主库出现流复制延迟告警

发布时间 2023-11-14 18:02:55作者: 我爱睡莲

问题描述:环境是openGauss 5.0集群,在一次意外重启数据库之后。收到了一个主库的主从延迟告警,只有从库才能出现延迟,主库怎么会出现了告警延迟

告警信息:

Status: Resolved
Hostname: hkuatxcrecondb01
IP Address: 192.168.163.21
Alert Message: Opengauss: Streaming lag with {#MASTER} is too high (over 10m in 5m)
Replication: lag in seconds: 0s
Date: 2023.11.13
Time: 11:27:27

 

监控脚本:

/etc/zabbix/script/opengauss/sql/gsql.replication.lag.sql

DO LANGUAGE plpgsql $$
DECLARE
        ver integer;
        res text;
BEGIN
        SELECT current_setting('server_version_num') INTO ver;

        IF (ver >= 100000) THEN
                SELECT * INTO res from (
                        SELECT
                                CASE WHEN pg_last_wal_receive_lsn() = pg_last_wal_replay_lsn()
                                        THEN 0
                                        ELSE COALESCE(EXTRACT(EPOCH FROM now() - pg_last_xact_replay_timestamp())::integer, 0)
                                END
                        ) T;

        ELSE
                SELECT * INTO res from (
                        SELECT
                                CASE WHEN pg_last_xlog_receive_location() = (pg_last_xlog_replay_location()).lsn
                                        THEN 0
                                        ELSE COALESCE(EXTRACT(EPOCH FROM now() - pg_last_xact_replay_timestamp())::integer, 0)
                                END
                        ) T;
        END IF;

        perform set_config('zbx_tmp.repl_lag_res', res, false);
END $$;

select current_setting('zbx_tmp.repl_lag_res');

 

数据库主备角色状态正常,复制视图还是显示主库是主库,从库是从库。根据sql查询到最后的日志重放时间维持在重启的时候。

官方文档:https://www.postgresql.org/docs/9.1/functions-admin.html

在OpenGauss中,pg_last_xact_replay_timestamp()是一个系统函数,用于获取最后一个事务在流复制过程中被重放的时间戳。它返回一个时间戳,表示最后一个事务在备库上被应用的时间。

在主库上,pg_last_xact_replay_timestamp()函数将返回NULL,因为主库不会进行事务重放。只有在备库上进行流复制时,才会有事务被重放的情况。

当备库从主库接收到事务日志并应用到备库上时,pg_last_xact_replay_timestamp()函数将返回最后一个事务的应用时间戳。这个时间戳可以用于监控和诊断备库的复制进度,以及确定备库是否与主库保持同步。

请注意,pg_last_xact_replay_timestamp()函数只在备库上可用,如果在主库上调用该函数,将返回NULL。

官方文档中的解释:
获取恢复期间重播的最后一个事务的时间戳。这是在主数据库上生成该事务的提交或中止 WAL 记录的时间。如果恢复期间没有重放任何事务,则此函数返回 NULL。否则,如果恢复仍在进行中,这将单调增加。如果恢复已完成,则该值将保持静态,为该恢复期间应用的最后一个事务的值。当服务器正常启动而没有恢复时,该函数返回 NULL。
很有可能意外的重启将数据库认定成为了一个恢复状态。但是这种恢复状态一直会递增,我没有等到这种状态自动消失

 

根据sql查询监控值:

openGauss=# select COALESCE(EXTRACT(EPOCH FROM now() - pg_last_xact_replay_timestamp())::integer, 0);
 coalesce
----------
    20888
(1 row)

openGauss=# select * from pg_last_xact_replay_timestamp();
-[ RECORD 1 ]-----------------+------------------------------
pg_last_xact_replay_timestamp | 2023-11-13 11:13:11.445842+08

 

解决方案:其实很简单,手动去重启,数据库的pg_last_xact_replay_timestamp时间戳将会被清理掉

gs_om -t status --detail
gs_om -t restart


gsql ((openGauss 5.0.0 build a07d57c3) compiled at 2023-03-29 03:36:31 commit 0 last mr  )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.

openGauss=# select COALESCE(EXTRACT(EPOCH FROM now() - pg_last_xact_replay_timestamp())::integer, 0);
 coalesce
----------
        0
(1 row)

openGauss=#
openGauss=# select pg_last_xact_replay_timestamp();
 pg_last_xact_replay_timestamp
-------------------------------

(1 row)

openGauss=#

 

情景再现:

利用磁盘空间满,可以制造相同情景