作者:瀚高PG实验室(Highgo PG Lab)-天蝎座
流复制部署完成后,监控即为避不开的话题,本文介绍如何对流复制进行监控。
pg_stat_replication视图对于监控流复制至关重要。
postgres=# select * from pg_stat_replication ;
-[ RECORD 1 ]----+-----------------------------
pid | 6569
usesysid | 10
usename | postgres
application_name | walreceiver
client_addr | 192.168.80.127
client_hostname |
client_port | 63434
backend_start | 2019-03-12 15:46:05.73722+08
backend_xmin |
state | streaming
sent_lsn | 0/4166330 WAL发送进程最近发送的WAL日志位置
write_lsn | 0/4166330 备库最近写入的WAL日志位置,此时WAL日志流还在操作系统缓存
flush_lsn | 0/4166330 备库最近写入的WAL日志位置,此时日志流已经写入备库WAL日志文件
replay_lsn | 0/4166330 备库最近应用的WAL日志位置
write_lag | 返回确认信息的时间
flush_lag |
replay_lag |
sync_priority | 0 基于优先级模式中备库被选中称为同步备库的优先级,对于基于quorum的选举模式无影响。
sync_state | async async 表示异步流复制。sync表示为同步流复制,potential表
示备库当前为异步同步模式,如果当前的同步备库宕机,异步备库
可升级成为同步备库。quorum表示备库为quorum standbys的候
选。后面会详细介绍。
application_name 连接WAL发送进程的应用别名,备库recovery文件中primary_conninfo参数的 application_name选项的值。
state :startup表示WAL进程启动过程中,catchup表示备库正在追赶主库,streaming表示备库已经追赶上了主库,并且主库向
备库发送WAL日志流,这个状态是流复制的常规状态,backup表示通过pg_basebackup正在进行备份,stopping表示WAL进程正在关闭。
监控主备延迟:
两个方面来衡量主备库之间的延迟
1.通过WAL延迟时间衡量
postgres=# select pid,usename,client_addr,state,write_lag,flush_lag,replay_lag from pg_stat_replication ;
pid | usename | client_addr | state | write_lag | flush_lag | replay_lag
------+----------+----------------+-----------+-----------------+-----------------+-----------------
6569 | postgres | 192.168.80.127 | streaming | 00:00:00.001207 | 00:00:00.003164 | 00:00:00.003798
(1 row)
对于一个有稳定写事务的数据库,备库收到主库发送的WAL日志流后首先是写入备库操作系统缓存,
之后写入备库WAL日志文件,最后应用WAL日志。理论上: replay_lag>flush_lag>write_lag
replay_lag,flush_lag,write_lag 这三个字段为PG10 版本的新增字段,在之前的版本pg_stat_replication视图不提供这三个字段,
但是可以通过其他方法来监控主备延迟,在备库监控如下所示SQL:
highgo=# select pg_last_xlog_receive_location(),pg_last_xlog_replay_location(),
pg_last_xact_replay_timestamp(),now();
pg_last_xlog_receive_location | pg_last_xlog_replay_location | pg_last_xact_replay_timestamp | now
-------------+-------------+------------------------------+-----------------
73F/5DBF9880 | 73F/5DBF9880| 2019-03-18 10:39:59.282002+08 | 2019-03-18 10:38:58.094224+08
(1 row)
pg_last_xact_replay_timestamp 函数显示备库最近WAL日志应用的时间,但是如果近期
主库只有读操作,那么这个结果并不准确。
2.通过WAL日志应用延迟量衡量
通过流复制备库WAL的应用位置和主库本地WAL写入位置之间的WAL日志量能够准确判断主备延时,单位为字节数
select pid,state,usename,client_addr,sync_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_delay
from pg_stat_replication;
pid | state | usename | client_addr | sync_state | write_delay | flush_delay | replay_delay
------+-----------+----------+----------------+------------+-------------+-------------+--------------
6569 | streaming | postgres | 192.168.80.127 | async | 13836288 | 14098432 | 14491696
(1 row)
pg_stat_wal_receiver视图:
select * from pg_stat_wal_receiver;
-[ RECORD 1 ]---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
pid | 20776 WAL接受进程的进程号
status | streaming WAL接收进程的状态
receive_start_lsn | 0/4000000 WAL接收进程启动后使用的第一个WAL日志位置
receive_start_tli | 1
received_lsn | 0/13655BE0 最近接收并写入WAL日志文件的WAL位置
received_tli | 1
last_msg_send_time | 2019-03-18 14:32:01.459362+08 备库接收到发送进程最后一个消息
后,向主库发回确认消息的发送时间。
last_msg_receipt_time | 2019-03-18 14:32:01.399589+08 备库接收到发送进程最后一个消息的接收时间
latest_end_lsn | 0/13655BE0
latest_end_time | 2019-03-18 14:14:59.692535+08
slot_name |
sender_host | 192.168.80.126
sender_port | 5432
conninfo | user=postgres passfile=/home/postgres/.pgpass dbname=replication
host=192.168.80.126 port=5432 fallback_application_name=walreceiver sslmode=disable
sslcompression=0 target_session_attrs=any
相关系统函数
显示恢复进程是否处于恢复模式,f为主库,t为备库
postgres=# select pg_is_in_recovery();
pg_is_in_recovery
-------------------
f
(1 row)
postgres=# select pg_last_wal_receive_lsn(),pg_last_wal_replay_lsn(),pg_last_xact_replay_timestamp();
pg_last_wal_receive_lsn | pg_last_wal_replay_lsn | pg_last_xact_replay_timestamp
-------------------------+------------------------+-------------------------------
0/13655BE0 | 0/13655BE0 | 2019-03-18 14:11:15.377822+08
(1 row)
pg_last_wal_receive_lsn():显示备库最近接收的WAL日志位置
pg_last_wal_replay_lsn(): 显示备库最近应用WAL日志的位置
pg_last_xact_replay_timestamp():显示备库最近事务的应用时间
pg_wal_lsn_diff(pg_last_wal_receive_lsn(),pg_last_wal_replay_lsn()):计算两个日志位置的偏移量。