前言
在配置好逻辑复制之后,我们需要了解逻辑复制相关信息,如复制延迟,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/)