流复制浅析 —— 物理流复制监控
发布日期:2021-05-08 12:23:09 浏览次数:20 分类:精选文章

本文共 5069 字,大约阅读时间需要 16 分钟。

作者:瀚高PG实验室(Highgo PG Lab)-天蝎座

流复制部署完成后,监控即为避不开的话题,本文介绍如何对流复制进行监控。

pg_stat_replication视图对于监控流复制至关重要。postgres=# select * from pg_stat_replication ;-[ RECORD 1 ]----+-----------------------------pid              | 6569usesysid         | 10usename          | postgresapplication_name | walreceiverclient_addr      | 192.168.80.127client_hostname  |client_port      | 63434backend_start    | 2019-03-12 15:46:05.73722+08backend_xmin     |state            | streamingsent_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_lagreplay_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_delayfrom 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               | 1last_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/13655BE0latest_end_time            | 2019-03-18 14:14:59.692535+08slot_name                  |sender_host                | 192.168.80.126sender_port                | 5432conninfo                   | 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()):计算两个日志位置的偏移量。

 

上一篇:Fillfactor 参数
下一篇:流复制浅析 —— 物理流复制部署

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2025年03月24日 00时37分31秒