如何监控PostgreSQL逻辑复制状态

数据库关系型数据库技术服务知识库
前言

在配置好逻辑复制之后,我们需要了解逻辑复制相关信息,如复制延迟,replication slot 相关位点信息。PostgreSQL 为我们提供了丰富的表/视图,方便我们进行监控。

检查逻辑复制的基本配置信息

在订阅端查看基本配置信息:从下述信息来看,subname 为订阅者名称,subconninfo 为发布者相关的连接信息。

rudonx=# select * from pg_subscription;
-[ RECORD 1 ]---+----------------------------------------------------------------------------
oid              20429
subdbid         | 20395
subname         | alltabsub
subowner        | 16480
subenabled      | t
subconninfo     | host=xx  port=5432 dbname=rudonx user=xxx  password=xxxx
subslotname     | data_slot
subsynccommit   | off
subpublications | {alltables}
```
`
从上述信息来看,subname 为订阅者名称,subconninfo 为发布者相关的连接信息。
````undefined
rudonx=# select * from pg_subscription_rel;
-[ RECORD 1 ]----------
srsubid    | 20429
srrelid    | 20412
srsubstate | r
srsublsn   | 4/815893C8
-[ RECORD 2 ]----------
srsubid    | 20429
srrelid    | 20398
srsubstate | r
srsublsn   | 4/81589400
```
`

* srsubstate:i = 初始化, d = 正在复制数据, s = 已同步, r = 准备好 (普通复制)
* srsublsn:s 和 r 状态时源端的结束 LSN

在发布端查看那些表被发布:
````undefined
rudonx=# select * from pg_publication_tables;
-[ RECORD 1 ]---------------
pubname    | pub1
schemaname | public
tablename  | pgbench_tellers
-[ RECORD 2 ]---------------
pubname    | alltables
schemaname | public
tablename  | pgbench_history
```
`
在源端查看发布者那些操作会被复制到订阅者
````undefined
pubdb=# select * from pg_publication;
  oid  | pubname | pubowner | puballtables | pubinsert | pubupdate | pubdelete | pubtruncate 
-------+---------+----------+--------------+-----------+-----------+-----------+-------------
 16405 | alltables    |       10 | f            | t         | t         | t         | t
```
`

* pubname:指发布的名称。
* pubowner:指发布的属主,可以和 pg_user 视图的 usesysid 字段关联查询属主的具体信息。
* puballtables:是否发布数据库中的所有表,"t" 表示发布数据库中所有已存在的表和以后新建的表。
* pubinsert:"t" 表示仅发布表上的INSERT操作。
* pubupdate:"t" 表示仅发布表上的UPDATE操作。
* pubdelete:"t" 表示仅发布表上的DELETE操作

## 检查发布 & 订阅情况
在订阅端检查订阅情况:
````undefined
rudonx=# select * from pg_stat_subscription;
-[ RECORD 1 ]---------+------------------------------
subid                 | 21111
subname               | alltabsub
pid                   | 3679064
relid                 | 
received_lsn          | 0/3EFE37A8
last_msg_send_time    | 2022-08-12 19:19:02.340715+08
last_msg_receipt_time | 2022-08-12 19:19:02.340741+08
latest_end_lsn        | 0/3EFE37A8
latest_end_time       | 2022-08-12 19:19:02.340715+08
```
`

* received_lsn:wal receiver 接收到的 LSN 位点信息。
* latest_end_lsn;订阅者会FEEDBACK LSN给发布,这个LSN表示已经反馈给发布者wal sender进程的LSN
* last_msg_send_time 与 latest_end_time 均为时间信息。

在发布端检查复制情况:
````undefined
rudonx=# select * from pg_stat_replication ;  
-[ RECORD 1 ]----+------------------------------
pid              | 19964
usesysid         | 16463
usename          | rudonx
application_name | alltabsub
client_addr      | xxx.xx.xx.xx
client_hostname  | 
client_port      | 42806
backend_start    | 2022-08-12 19:12:16.869681+08
backend_xmin     | 
state            | streaming
sent_lsn         | 0/3EFE37A8 -- 已发送截止至该LSN
write_lsn        | 0/3EFE37A8
flush_lsn        | 0/3EFE37A8
replay_lsn       | 0/3EFE37A8
write_lag        | 
flush_lag        | 
replay_lag       | 
sync_priority    | 0
sync_state       | async
reply_time       | 2022-08-12 19:15:30.130423+08
```
`
## 检查 replication slot 相关信息
````undefined
rudonx=# select * from pg_replication_slots;
-[ RECORD 1 ]-------+-----------
slot_name           | data_slot
plugin              | pgoutput
slot_type           | logical
datoid              | 16435
database            | rudonx
temporary           | f
active              | t
active_pid          | 9598
xmin                | 
catalog_xmin        | 588
restart_lsn         | 4/81589438
confirmed_flush_lsn | 4/81589470
wal_status          | reserved
safe_wal_size       | 
```
`

* restart_lsn 是可能仍被这个槽的订阅者要求的最旧 WAL LSN,并且因此不会在检查点期间自动被移除。
* confirmed_flush_lsn 代表逻辑槽的订阅者已经确认接收 WAL 日志的位点信息。
* wal_status : 复制槽状态,会有 reserved,extended,unreserved,lost 四种状态

## 检查复制延迟
在发布端,我们可以使用如下 SQL 来检查复制延迟:
````undefined
rudonx=# SELECT
   application_name,
   client_addr,
   COALESCE ( trunc( EXTRACT ( epoch FROM ( now( ) - ( now( ) - replay_lag ) ) ) :: NUMERIC ), 0 ),
   trunc( pg_wal_lsn_diff ( pg_current_wal_lsn ( ), replay_lsn ) / 1024 ) replay_delay 
FROM
   pg_stat_replication;


rudonx=# SELECT
   pg_size_pretty ( pg_wal_lsn_diff ( pg_current_wal_insert_lsn ( ), sent_lsn ) ),
   pg_size_pretty ( pg_wal_lsn_diff ( pg_current_wal_insert_lsn ( ), replay_lsn ) ), * 
FROM
   pg_stat_replication;
```
`
在订阅端,我们可以使用如下 SQL 来检查复制延迟:
````undefined
SELECT
   pg_size_pretty ( pg_wal_lsn_diff ( received_lsn, latest_end_lsn ) ), * 
FROM
   pg_stat_subscription;
```
`
# 参考文档
[1] [https://www.postgresql.org/docs/12/logical-replication.html](https://www.postgresql.org/docs/12/logical-replication.html)
**如果您有其他问题,欢迎您联系火山引擎**[技术支持服务](https://console.volcengine.com/ticket/createTicketV2/)

49
0
0
0
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论