ITPub博客

首页 > 数据库 > 国内数据库 > GaussDB 高可用流复制核心参数和视图

GaussDB 高可用流复制核心参数和视图

原创 国内数据库 作者:圣彼得堡的村长 时间:2026-09-15 11:17:57 0 删除 编辑

GaussDB 高可用流复制核心参数和视图

  昨天系统介绍了一下 GaussDB 的系统表和视图,由于 DCF 集群环境铲掉装成了流复制环境,因此,本篇文章介绍一下流复制常用的核心参数与监控视图。

说明:本文所述基于标准流复制环境(非 DCF 模式)。关于 DCF 模式的概念解析及复制状态查询,请参见 《GaussDB 高可用演进:从流复制到 DCF 分布式共识》

1. 流复制参数

1.1 主库侧

  1. wal_level

必须 hot_standby 或 archive 才能开流复制,建议固定 hot_standby 。

gaussdb=> show wal_level;
  wal_level  
-------------
 hot_standby
(1 row)
  1. max_wal_senders

最大 walsender 进程数,备机数 × 1~2,建议 ≥ 10

gaussdb=> show max_wal_senders;
 max_wal_senders 
-----------------
 20
(1 row)
  1. wal keepsegments

未建槽时保留的 WAL 量,如果创建了复制槽,可不依赖此参数。

gaussdb=> show wal_keep_segments;
 wal_keep_segments 
-------------------
 128
(1 row)
  1. synchronous_commit

提交等备机到哪一步: off/local/on/remote_write/remote_apply ,高一致场景用 on 或 remote_apply,高性能用 remote_write

gaussdb=> show synchronous_commit;
 synchronous_commit 
--------------------
 on
(1 row)
  1. synchronous_standby_names

同步备机列表,一主两备常用 ANY 1(node1,node2),显示 quorum

gaussdb=> show synchronous_standby_names;
 synchronous_standby_names 
---------------------------
 ANY 1(dn_6002,dn_6003)
(1 row)
  1. most_available_sync

决定同步备全断时主库是否继续服务。

gaussdb=> show most_available_sync;
 most_available_sync 
---------------------
 off
(1 row)
  1. wal_sender_timeout

walsender 心跳超时时间。

gaussdb=> show wal_sender_timeout;
 wal_sender_timeout 
--------------------
 6s
(1 row)
  1. enable streamreplication

流复制总开关

gaussdb=> show enable_stream_replication;
 enable_stream_replication 
---------------------------
 on
(1 row)
  1. replconninfoN

定义主备节点间的网络连接拓扑,包含本地与远程的 IP、服务端口以及心跳端口。

gaussdb=> show replconninfo1;
                                                                                  replconninfo1      
                                                                            
-----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------
 localhost=192.168.182.138 localport=30101 localheartbeatport=30105 localservice=30104 remotehost=192
.168.182.139 remoteport=30101 remoteheartbeatport=30105 remoteservice=30104
(1 row)
  1. max_replication_slots

控制主节点上最多可以同时创建的复制槽数量。通常设置为备机节点数 + 逻辑订阅数 + 预留冗余。

gaussdb=> show max_replication_slots;
 max_replication_slots 
-----------------------
 20
(1 row)
  1. enable_slot_log

是否开启复制槽信息的持久化日志,防止主库异常重启后丢失备库的消费进度。

gaussdb=> show enable_slot_log;
 enable_slot_log 
-----------------
 on
(1 row)

1.2 备库参数

  1. hot_standby

备库是否允许只读。

gaussdb=> show hot_standby;
 hot_standby 
-------------
 on
(1 row)
  1. hot_standby_feedback

控制备库是否向主库反馈当前回放快照信息。默认值为 off,主库 vacuum 不受备库影响,但备库长查询可能遭遇 snapshot too old 错误。

gaussdb=> show hot_standby_feedback;
 hot_standby_feedback 
----------------------
 off
(1 row)

建议设置为 on 的场景:

  • 备库承担 只读业务(报表 / 查询 / 接口)
  • 备库有 超过 30 s 的 SQL
  • 主库表 update/delete 频繁
  • 出现过 snapshot too old
  1. wal_receiver_timeout

备库等待主库发送日志的超时时间。

gaussdb=> show wal_receiver_timeout;
 wal_receiver_timeout 
----------------------
 6s
(1 row)

2. 流复制监控视图

2.1 pg_stat_replication

用来在主库上查看复制状态。

--查看复制状态
gaussdb=> SELECT application_name, client_addr, state, sync_state,
       sender_sent_location,
       receiver_write_location,
       receiver_flush_location,
       receiver_replay_location
FROM pg_stat_replication;
       application_name        |   client_addr   |   state   | sync_state | sender_sent_location | receiver_write_location | receiver_flush_location | receiver_replay_location 
-------------------------------+-----------------+-----------+------------+----------------------+-------------------------+-------------------------+--------------------------
 WalSender to Standby[dn_6003] | 192.168.182.140 | Streaming | Quorum     | 0/A4D5148            | 0/A4D5148               | 0/A4D5148               | 0/A4D5148
 WalSender to Standby[dn_6002] | 192.168.182.139 | Streaming | Quorum     | 0/A4D5148            | 0/A4D5148               | 0/A4D5148               | 0/A4D5148
(2 rows)
-- 查看复制延迟
SELECT
pid,usename,client_addr,state,sync_state,sync_priority,
pg_xlog_location_diff(pg_current_xlog_location(),receiver_write_location)  write_delay,
pg_xlog_location_diff(pg_current_xlog_location(),receiver_flush_location)  flush_delay,
pg_xlog_location_diff(pg_current_xlog_location(),receiver_replay_location) replay_dely
FROM pg_stat_replication;
       pid       | usename  |   client_addr   |   state   | sync_state | sync_priority | write_delay | flush_delay | replay_dely 
-----------------+----------+-----------------+-----------+------------+---------------+-------------+-------------+-------------
 139801312884480 | rdsAdmin | 192.168.182.140 | Streaming | Quorum     |             1 |           0 |           0 |           0
 139801266222848 | rdsAdmin | 192.168.182.139 | Streaming | Quorum     |             1 |           0 |           0 |           0
(2 rows)
  • write_delay:主当前 WAL 位置与备机已写入磁盘位置的字节差。值为 0 表示写盘没有延迟。
  • flush_delay:主当前 WAL 位置与备机已持久化刷新(Flush)到磁盘位置的字节差。值为 0 表示已完全持久化。
  • replay_dely:主当前 WAL 位置与备机已重放(Replay)到数据库中的位置的字节差。值为 0 表示备机数据已完全追平,无延迟。

直观衡量备机的同步时长:

select now() AS now,
coalesce(pg_last_xact_replay_timestamp(), now()) replay,
extract(EPOCH FROM (now() - coalesce(pg_last_xact_replay_timestamp(), now()))) AS diff;
             now              |            replay            | diff 
------------------------------+------------------------------+------
 2026-09-12 20:41:32.14806+08 | 2026-09-12 20:41:32.14806+08 |    0
(1 row)

pg_last_xact_replay_timestamp 函数显示备库最近 WAL 日志应用时间。如果 diff 的值接近 0,说明备机数据非常实时;如果 diff 数值持续增大,说明备机复制出现了延迟(可能由于网络卡顿、大事务重放慢或主机写入压力过大)。

2.2 dbe_perf.global_replication_stat

一次性查询整个集群所有分片的流复制状态(适合分布式集群)

SELECT 
    node_name,
    client_addr AS standby_ip,
    state,
    sync_state,
    sync_priority AS priority,
    sender_sent_location AS master_sent_lsn,
    receiver_flush_location AS standby_flush_lsn,
    receiver_replay_location AS standby_replay_lsn
FROM dbe_perf.global_replication_stat;
     node_name     |   standby_ip    |   state   | sync_state | priority | master_sent_lsn | standby_flush_lsn | standby_replay_lsn 
-------------------+-----------------+-----------+------------+----------+-----------------+-------------------+--------------------
 dn_6001_6002_6003 | 192.168.182.140 | Streaming | Quorum     |        1 | 0/A6C44C0       | 0/A6C44C0         | 0/A6C44C0
 dn_6001_6002_6003 | 192.168.182.139 | Streaming | Quorum     |        1 | 0/A6C44C0       | 0/A6C44C0         | 0/A6C44C0
(2 rows)

2.3   dbe_perf.global_recovery_status

  监控主备恢复状态与日志流控信息。主要用来评估当主库发生故障时,备机恢复数据并接管业务所需的时间(RTO)以及当前的流控状态。

gaussdb=> select *from dbe_perf.global_recovery_status;
     node_name     | standby_node_name |    source_ip    | source_port |     dest_ip     | dest_port | current_rto | target_rto | current_sleep_time 
-------------------+-------------------+-----------------+-------------+-----------------+-----------+-------------+------------+--------------------
 dn_6001_6002_6003 | dn_6002           | 192.168.182.138 |       30101 | 192.168.182.139 |     54272 |           2 |         60 |                  0
 dn_6001_6002_6003 | dn_6003           | 192.168.182.138 |       30101 | 192.168.182.140 |     44264 |           0 |         60 |                  0
(2 rows)
  • current_rto: 当前预估的恢复时间目标(秒)。反映当前备机落后主库的日志量需要多少时间才能重放完毕。
  • target_rto:系统设定的 目标 RTO 阈值,用于触发流控保护。
  • current_sleep_time:当前的流控睡眠时间。当主备延迟过高、突破 RTO 限制时,主库会通过此参数对写入进行降速/流控,值为 0 表示无流控限制。

2.4 pg_replication_slots

查看所有复制槽,包括物理槽和逻辑槽。

gaussdb=> SELECT slot_name,
       plugin,
       slot_type,
       datoid,
       active,
       restart_lsn
FROM pg_replication_slots;gaussdb-> gaussdb-> gaussdb-> gaussdb-> gaussdb-> gaussdb-> 
 slot_name | plugin | slot_type | datoid | active | restart_lsn 
-----------+--------+-----------+--------+--------+-------------
 dn_6003   |        | physical  |      0 | t      | 0/9A188D58
 dn_6002   |        | physical  |      0 | t      | 0/9A188D58
(2 rows)
select slot_name, plugin, slot_type, datoid, database, active,  xmin,
pg_size_pretty(pg_xlog_location_diff(CASE WHEN pg_is_in_recovery() THEN pg_last_xlog_receive_location()
ELSE pg_current_xlog_location() END , restart_lsn)) AS retained_bytes
from pg_replication_slots;
 slot_name | plugin | slot_type | datoid | database | active | xmin | retained_bytes 
-----------+--------+-----------+--------+----------+--------+------+----------------
 dn_6003   |        | physical  |      0 |          | t      |      | 0 bytes
 dn_6002   |        | physical  |      0 |          | t      |      | 0 bytes
(2 rows)

retained_bytes:该复制槽积压的 WAL 日志大小。

  总结,本篇整理的流复制相关参数和视图,不仅适用于 GaussDB,同样适用于 原生 PostgreSQL 及多数 PostgreSQL 系国产数据库(如 openGauss、MogDB、VastBase 等)。

   这里是《实战派K8S&DB》,更多干货敬请关注公众号。如果本文对你有所帮助,欢迎点赞、推荐和转发,也欢迎关注后续文章,一起考证、一起学习 GaussDB 分布式数据库。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31444449/viewspace-3182393/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2018-02-12

  • 博文量
    25
  • 访问量
    20664