GaussDB 高可用流复制核心参数和视图
2026-09-15 11:19 圣彼得堡的村长 阅读(11) 评论(0) 收藏 举报GaussDB 高可用流复制核心参数和视图
昨天系统介绍了一下 GaussDB 的系统表和视图,由于 DCF 集群环境铲掉装成了流复制环境,因此,本篇文章介绍一下流复制常用的核心参数与监控视图。
说明:本文所述基于标准流复制环境(非 DCF 模式)。关于 DCF 模式的概念解析及复制状态查询,请参见《GaussDB 高可用演进:从流复制到 DCF 分布式共识》
1. 流复制参数
1.1 主库侧
wal_level
必须 hot_standby 或 archive 才能开流复制,建议固定 hot_standby 。
gaussdb=> show wal_level;
wal_level
-------------
hot_standby
(1 row)
max_wal_senders
最大 walsender 进程数,备机数 × 1~2,建议 ≥ 10
gaussdb=> show max_wal_senders;
max_wal_senders
-----------------
20
(1 row)
- wal_keep_segments
未建槽时保留的 WAL 量,如果创建了复制槽,可不依赖此参数。
gaussdb=> show wal_keep_segments;
wal_keep_segments
-------------------
128
(1 row)
synchronous_commit
提交等备机到哪一步:off/local/on/remote_write/remote_apply ,高一致场景用 on 或 remote_apply,高性能用 remote_write
gaussdb=> show synchronous_commit;
synchronous_commit
--------------------
on
(1 row)
synchronous_standby_names
同步备机列表,一主两备常用 ANY 1(node1,node2),显示 quorum
gaussdb=> show synchronous_standby_names;
synchronous_standby_names
---------------------------
ANY 1(dn_6002,dn_6003)
(1 row)
most_available_sync
决定同步备全断时主库是否继续服务。
gaussdb=> show most_available_sync;
most_available_sync
---------------------
off
(1 row)
wal_sender_timeout
walsender 心跳超时时间。
gaussdb=> show wal_sender_timeout;
wal_sender_timeout
--------------------
6s
(1 row)
- enable_stream_replication
流复制总开关
gaussdb=> show enable_stream_replication;
enable_stream_replication
---------------------------
on
(1 row)
- 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)
max_replication_slots
控制主节点上最多可以同时创建的复制槽数量。通常设置为备机节点数 + 逻辑订阅数 + 预留冗余。
gaussdb=> show max_replication_slots;
max_replication_slots
-----------------------
20
(1 row)
enable_slot_log
是否开启复制槽信息的持久化日志,防止主库异常重启后丢失备库的消费进度。
gaussdb=> show enable_slot_log;
enable_slot_log
-----------------
on
(1 row)
1.2 备库参数
hot_standby
备库是否允许只读。
gaussdb=> show hot_standby;
hot_standby
-------------
on
(1 row)
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
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 分布式数据库。
浙公网安备 33010602011771号