流复制浅析 —— 物理流复制监控

作者:瀚高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()):计算两个日志位置的偏移量。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值