首页 > 数据库 > 国内数据库 > GaussDB 高可用流复制核心参数和视图
昨天系统介绍了一下
GaussDB 的系统表和视图,由于 DCF 集群环境铲掉装成了流复制环境,因此,本篇文章介绍一下流复制常用的核心参数与监控视图。
说明:本文所述基于标准流复制环境(非 DCF 模式)。关于 DCF 模式的概念解析及复制状态查询,请参见 《GaussDB 高可用演进:从流复制到 DCF 分布式共识》
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 量,如果创建了复制槽,可不依赖此参数。
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_timeoutwalsender 心跳超时时间。
gaussdb=> show wal_sender_timeout; wal_sender_timeout -------------------- 6s (1 row)
流复制总开关
gaussdb=> show enable_stream_replication; enable_stream_replication --------------------------- on (1 row)
定义主备节点间的网络连接拓扑,包含本地与远程的 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)
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 的场景:
snapshot too oldwal_receiver_timeout备库等待主库发送日志的超时时间。
gaussdb=> show wal_receiver_timeout; wal_receiver_timeout ---------------------- 6s (1 row)
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 数值持续增大,说明备机复制出现了延迟(可能由于网络卡顿、大事务重放慢或主机写入压力过大)。
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)
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 表示无流控限制。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/ ,如需转载,请注明出处,否则将追究法律责任。