选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

文档 / 配置参数 / 复制

CONFIGURATION PARAMETER复制 / 主库

synchronous_standby_names

设置同步备库数量及候选备库名称列表。

Number of synchronous standbys and list of names of potential synchronous ones.

字符串 重载生效 引入 9.1 现存至 20 devel 0 次默认值变更

类型
字符串string
上下文
重载生效改配置文件后重载(pg_ctl reload / SIGHUP)即可生效
默认值
空字符串原始值 ''
引入版本
9.1
状态
现存

PostgreSQL 18 手册 官方文档 引入提交 a8a8a3e096

版本轨迹

相对 PostgreSQL 17 无变化。

默认值变迁

空字符串 9.1 – 20

默认值自 PostgreSQL 9.1 起没有变过。带单位的取值换算成了可读形式,原始的 boot_val 与单位写在悬浮提示里。

手册说明

PostgreSQL 18 手册 · 19.6 复制 本站手册 官方原文

Section 26.2.8所述,这个参数指定一个支持同步复制的备库的列表。 可能会有一个或者多个活动的同步备库,在这些备库确认收到它们的数据之后,等待提交的事务将被允许继续下去。 同步备库是那些名字出现在这个列表前面,并且当前已连接并且正在实时流式传输数据(如pg_stat_replication视图中streaming的状态所示)的服务器。 指定多于一台同步备库可以得到非常高的可用性并且能防止数据丢失。

用于这一目的的备库的名称是其application_name设置,它在备库的连接信息中设置。 在物理复制备库的情况下,这应该被设置在primary_conninfo设置中,如果设置了,默认是cluster_name的设置,否则为 walreceiver。 对于逻辑复制,可以在订阅的连接信息中设置。对于其他复制流消费者,请参考其文档。

这个参数使用下面的语法之一来指定一个备库列表:

[FIRST] num_sync ( standby_name [, ...] )
ANY num_sync ( standby_name [, ...] )
standby_name [, ...]

其中num_sync是事务需要等待其回复的同步备库的数量,standby_name是一个备库的名称。FIRST以及ANY指定从所列服务器中选取同步备库的方法。

关键词FIRST加上num_sync指定一种基于优先的同步复制,并且会让事务提交等待,直到它们的WAL记录被复制到基于优先级选择的num_sync台同步备库上为止。例如,设置FIRST 3 (s1, s2, s3, s4)将导致每次提交都等待来自三台较高优先级的备库的答复,这三台备库将从备库s1s2s3以及s4中选出。在该列表中出现较早的备库将被给予较高的优先级,并且将被考虑为同步备库。列表中出现的其他备库表示潜在的同步备库。如果当前的任何同步备库因为某种原因断开连接,它将立刻被下一个最高优先级的备库替代。关键词FIRST是可选的。

关键词ANY加上num_sync指定一种基于规定数量的同步复制,并且会让事务提交等待,直到它们的WAL记录被复制到所列出备库中的至少num_sync台上为止。例如,设置ANY 3 (s1, s2, s3, s4)将导致每次提交会在收到s1s2s3以及s4中任意三台备库的回答后立刻继续下去。

FIRSTANY是大小写不敏感的。如果这些关键词被用作备库的名字,其standby_name必须被放在双引号内。

PostgreSQL版本 9.6 之前使用过第三种语法,目前也仍然支持。它和FIRSTnum_sync等于1的第一种语法相同。例如,FIRST 1 (s1, s2)s1, s2具有相同的含义:s1或者s2会被选中作为同步备库。

特殊项*匹配任意备库名称。

没有机制强制备库名称的唯一性。在出现重复的情况下,匹配的备库之一将被认为是较高优先级,不过无法弄清到底是哪一个。

Note

每一个standby_name都应该具有合法 SQL 标识符的形式,除非它是*。如果必要你可以使用双引号。但是注意在比较standby_name和备库应用程序名称时是大小写不敏感的(不管有没有双引号)。

如果这里没有指定同步备库名称,那么同步复制不能被启用并且事务提交将不会等待复制。这是默认的配置。即便当同步复制被启用时,个体事务也可以被配置为不等待复制,做法是将synchronous_commit参数设置为localoff

这个参数只能在postgresql.conf文件中或通过服务器命令行进行设置。

机制详解

设置同步备库数量及候选备库名称列表。重新加载配置即可应用新值;已经开始的工作不会被追溯改变。

它按备库 application_name 解析优先级 FIRST 或仲裁 ANY 语法,只定义可用确认者;每个事务等待什么由 synchronous_commit 决定,重复名称或通配符可能使实际选择出乎预期。

应把 synchronous_standby_names 与 synchronous_commit、wal_sender_timeout、max_wal_senders 一起监控和变更。先在对应角色与真实负载上验证,再按其 sighup context 选择会话修改、reload 或 restart;历史默认值并不等于当前有效值。

调优建议

按典型负载给出的取值思路,不是放之四海皆准的配方:实际取值要看数据量、并发度与硬件。

  • OLTP在线事务处理

    按主备拓扑、故障切换角色、复制槽/订阅数量与断连余量规划 synchronous_standby_names;上线前验证主库写延迟、备库重放和磁盘保留的最坏情况。

  • OLAP分析与批处理

    读备库与逻辑订阅常有长查询或大事务,应给重放/应用留明确上界,并监控延迟、worker 饱和、槽 restart_lsn 与冲突取消。

  • 小规格低配实例与开发机

    只配置真实需要的复制能力。少量节点也应设置有界超时与槽生命周期,不要用无限保留换取表面稳定。

常见问题

  • 误以为只配置列表就能让每个事务同步。
  • 重复 application_name 导致优先级选择不确定。
  • ANY/FIRST 数量在计划维护期间无法满足。
  • 在错误的主库、备库、发送端或订阅端角色上修改。
  • 只看字节/时间配置,不监控真实复制延迟、槽位置与 worker 状态。

演化历史

相邻两个大版本之间的差异,新的在前。版本号链到该版的快照。

  1. PostgreSQL 20 ← 19 沿用 19

    事实沿用 19

  2. PostgreSQL 14 ← 13 仅描述更新

    分类 Replication / Master Server Replication / Primary Server

  3. PostgreSQL 9.6 ← 9.5 仅描述更新

    简述 List of names of potential synchronous standbys. Number of synchronous standbys and list of names of potential synchronous ones.

  4. PostgreSQL 9.1 ← 9.0 新增此参数

    PostgreSQL 9.1 起可用

逐版本快照

每个收录版本里的 7 项事实,与上一个存在的版本不同的格子带底色。版本号链到该版。

版本 默认值单位上下文类型最小值最大值枚举值
9.1 空字符串 重载生效 字符串
9.2 空字符串 重载生效 字符串
9.3 空字符串 重载生效 字符串
9.4 空字符串 重载生效 字符串
9.5 空字符串 重载生效 字符串
9.6 空字符串 重载生效 字符串
10 空字符串 重载生效 字符串
11 空字符串 重载生效 字符串
12 空字符串 重载生效 字符串
13 空字符串 重载生效 字符串
14 空字符串 重载生效 字符串
15 空字符串 重载生效 字符串
16 空字符串 重载生效 字符串
17 空字符串 重载生效 字符串
18 空字符串 重载生效 字符串
19 空字符串 重载生效 字符串
20 沿用 空字符串 重载生效 字符串

参考资料

同类参数

参数 类型 上下文 默认值 版本变动 最近变更
Replication 复制 3 个
主库 3
synchronized_standby_slots 字符串 重载生效 空字符串
列出逻辑 WAL sender 必须等待的流复制备库槽。 现存
synchronous_standby_names 字符串 重载生效 空字符串
设置同步备库数量及候选备库名称列表。 现存
vacuum_defer_cleanup_age 整数 重载生效 0
设置 VACUUM 与 HOT 清理要延后多少个事务。 于 16 移除