PostgreSQL流复制监控
流复制部署完成后,需要监控流复制主库、备库状态。
一、pg_stat_replication
主库主要监控wal发送进程消息,不含级联备库信息
select * from pg_stat_replication;
-[ RECORD 1 ]----+------------------------------
pid | 108330 WAL 发送方进程的进程 ID
usesysid | 16384 登录到此 WAL 发送方进程的用户的 OID
usename | repuser
application_name | pgsql_node2
client_addr | 192.168.150.166
client_hostname |
client_port | 42108
backend_start | 2021-10-25 11:07:48.624659+08
backend_xmin |
state | streaming
sent_lsn | 0/850039D0
write_lsn | 0/850039D0
flush_lsn | 0/850039D0
replay_lsn | 0/850039D0
write_lag |
flush_lag |
replay_lag |
sync_priority | 0
sync_state | async
reply_time | 2021-10-25 17:21:24.601309+08
https://www.postgresql.org/docs/12/monitoring-stats.html#PG-STAT-REPLICATION-VIEW
二、监控主库延迟
方式一、通过WAL延迟时间衡量
select pid,usename,client_addr,state,write_lag,flush_lag,replay_lag from pg_stat_replication;
pg10前使用:
select extract(second from now() - pg_last_xact_replay_timestamp());
方式二、通过WAL日志应用延迟量衡量
通过流复制备库WAL的应用位置和主库本地WAL写入位置之间的WAL日志量能够准确判断主备延时,在流复制主库执行以下SQL:
select pid,usename,client_addr,state,
pg_wal_lsn_diff(pg_current_wal_lsn(),write_lsn) write_delay,
pg_wal_lsn_diff(pg_current_wal_lsn(),flush_lsn) flush_delay,
pg_wal_lsn_diff(pg_current_wal_lsn(),replay_lsn) replay_dely
from pg_stat_replication;
通过创建主备延时测算方式
此方法不算严谨,但很实用。通过在主库创建一张主备测算表,并定时往表插入数据或更新数据,之后在备库上计算这条记录的插入时间或更新时间与当前时间的差异来判断主备延时。
三、pg_stat_wal_receiver
pg_stat_replication视图显示WAL发送进程的详细信息,WAL接收进程也有相应的视图,如下所示:
select * from pg_stat_wal_receiver;
四、相关系统函数
pg_is_in_recovery() 判断是否为主库或备库
select pg_is_in_recovery(); —返回 t 表示备库 ,f 表示主库
pg_last_wal_receive_lsn() 显示备库最近接收的WAL日志的位置
select pg_last_wal_receive_lsn();
pg_last_wal_replay_lsn() 备库最近应用WAL日志的位置
select pg_last_wal_replay_lsn();
pg_last_xact_replay_timestamp() 显示备库最近事务的应用时间
select pg_last_xact_replay_timestamp();
select pg_current_wal_lsn() 显示主库WAL当前写入位置
select select pg_current_wal_lsn();
pg_wal_lsn_diff 计算两个WAL日志位置的偏移量
select pg_wal_lsn_diff(‘3/940001B0’,‘940001A0’);




