这些配置参数用于控制内置的流复制(streaming replication,参见 Section 26.2.5)以及内置的逻辑复制(logical replication,参见 Chapter 29)行为。
在流复制架构中,服务器节点要么担任主库(Primary),要么担任备库(Standby)。主库负责发送复制数据,而备库始终是复制数据的接收方。当采用级联复制(参见 Section 26.2.7)时,备库既是接收方同时也可以作为向下游转发的发送方。配置参数主要分为发送端与备库端参数,部分参数仅在主库上有效。若业务需要,集群中不同节点的配置可以有所不同。
在逻辑复制架构中,发布端(执行 CREATE PUBLICATION 的节点)向订阅端(执行 CREATE SUBSCRIPTION 的节点)复制数据。同一台服务器也可以同时兼具发布端与订阅端双重身份。请注意,后续各小节将发布端通称为“发送端”(senders)。有关逻辑复制配置参数的更多细节,请参阅 Section 29.12。
这些参数可以在需要向一台或多台备库发送复制数据的任何服务器节点上配置。主库始终是发送服务器,因此必须始终在主库上设置这些参数。当备库故障转移晋升为主库后,这些参数的角色与语义保持不变。
max_wal_senders (integer)
#
指定允许备用服务器或流式基础备份客户端同时建立的最大并发流复制网络连接数。默认值为 10。该参数只能在服务器启动时设置。此外,必须将 wal_level 设置为 replica 或更高等级,才允许接收来自备库的流复制连接。
当运行一台备用服务器时,你必须把这个参数设置为与主服务器上 相同或更高的值。否则,备用服务器上将不允许执行查询。
max_replication_slots (integer)
#
指定服务器所能创建与支持的物理和逻辑复制槽的最大数量上限。默认值为 10。该参数只能在服务器启动时设置。若将该值设置为小于当前已存在的物理/逻辑复制槽数量,将导致服务器无法正常启动。此外,必须将 wal_level 设置为 replica 或更高等级,才允许使用复制槽。
output_plugin_libraries (string)
#
列出安装在 dynamic_library_path
中、同时被信任可由复制客户端用作逻辑输出插件的库。
对其他库的任何 逻辑解码
或 复制
请求都将被拒绝。所有用户都受这一限制约束。默认值为
'pgoutput, test_decoding',
即标准 PostgreSQL
发行版中包含的两个逻辑输出插件。
格式是一个以逗号分隔的库名列表,每个名字按照
LOAD
命令的方式解释(但逻辑解码客户端必须指定一个与列表中条目
完全匹配的插件名,大小写或路径结构都不
能有差异)。条目之间的空白会被忽略;如果需要在库名中包含
空白或逗号,请用双引号把库名括起来。
确保加入这个列表的库在被加载进服务器时不会无意地给非超级 用户额外的特权,这是服务器管理者的责任。
当从不具备 output_plugin_libraries
参数的版本升级服务器时,以下查询可以帮助构造所有持久逻辑
复制槽所需要的插件列表:
SELECT DISTINCT plugin FROM pg_replication_slots WHERE plugin IS NOT NULL;
在调整 output_plugin_libraries
之前,请仔细审查这个列表的安全性。
上面的查询只能显示过去某个时刻被成功加入复制槽的插件。 新近被拒绝的请求会以类似下述消息的形式出现在日志中:
ERROR: library "..." may not be used as an output plugin DETAIL: The configuration parameter "output_plugin_libraries" (currently 'pgoutput, test_decoding') does not name this library as a trusted output plugin. HINT: If it is safe for all REPLICATION users to use this library as an output plugin, add it to "output_plugin_libraries" and reload the server configuration.
wal_keep_size (integer)
#
指定在 pg_wal 目录中保留的过期旧 WAL 段文件的物理最小容量,以防备用服务器在流复制期间需要拉取这些历史日志。如果连接到发送端的备库落后超过 wal_keep_size 兆字节,发送端可能会在检查点时清理备库仍需的 WAL 段文件,从而导致流复制连接中断(下游级联连接最终也会随之中断)。不过,如果启用了 WAL 连续归档,备库仍可自动从归档存储中检索拉取缺失的段文件以恢复同步。
该参数仅设置保留在 pg_wal 中的段文件最小容量;为了 WAL 归档或检查点崩溃恢复,系统可能会自动保留更多段文件。如果 wal_keep_size 为 0(默认值),系统不会为备库目的额外保留任何日志,备库可用的历史段文件数量取决于上一个检查点的位置及归档状态。若不带单位按兆字节计算。该参数只能在配置文件中或命令行中设置。
max_slot_wal_keep_size (integer)
#
指定在检查点时允许复制槽在 pg_wal 目录中强制保留的最大 WAL 日志总量上限。如果 max_slot_wal_keep_size 为 -1(默认值),复制槽可以保留无上限的 WAL 文件(即使备库长时间掉线,主库也会一直保留日志直至磁盘耗尽)。否则,如果某个复制槽的 restart_lsn 落后当前最新 LSN 超过该设定大小,主库将强制清理旧日志,导致使用该槽的备库因日志被回收而失效。复制槽的 WAL 保留状态可在视图 pg_replication_slots 中检视。若不带单位按兆字节计算。
idle_replication_slot_timeout (integer)
#
使保持不活动(未被任何 复制连接
使用)超过这一时长的复制槽失效。
如果这个值没有指定单位,则以秒为单位。
值为零(默认值)会禁用空闲超时失效机制。这个参数只能在
postgresql.conf 文件中或服务器命令行上
设置。
由空闲超时导致的槽失效发生在检查点期间。
由于检查点按 checkpoint_timeout
间隔发生,从超过
idle_replication_slot_timeout
到下一个检查点触发槽失效之间可能存在一些滞后。
为了避免这种滞后,用户可以强制执行一次检查点以及时地使不
活动的槽失效。槽的不活动时长是使用该槽的
pg_replication_slots.inactive_since
值计算的。
注意,空闲超时失效机制不适用于不保留 WAL
的槽,也不适用于备用服务器上正从主服务器同步的槽
(即 pg_replication_slots.synced
值为 true 的备用槽)。同步的槽总是被视为
不活动的,因为它们不执行逻辑解码来产生变更。
wal_sender_timeout (integer)
#中断无活动状态持续超过该时间周期的复制网络连接。这对于发送服务器快速检测备库崩溃或底层网络断开非常有用。若不带单位按毫秒计算。默认值为 60 秒。设置为 0 将彻底禁用此超时机制。
对于跨地域多数据中心部署的分布式数据库集群,根据不同的网络拓扑采用差异化配置能够带来更高的运维弹性。较小的值有助于对同机房低延迟备库进行秒级快速故障探测,而较大的值能够有效包容远端跨地域高延迟备库的偶发网络抖动。
track_commit_timestamp (boolean)
#
记录事务物理提交的时间戳。该参数只能在服务器启动时设置。默认值为 off。
这些参数可以在向一个或多个备库发送复制数据的主库上设置。请注意,除这些参数外,必须在主库上合理配置 wal_level,并且还可以选择性启用 WAL 连续归档(参见 Section 19.5.3)。这些参数在备用服务器上没有直接影响,但在备库上预先配置可以为主库故障转移晋升做好无缝衔接准备。
synchronous_standby_names (string)
#
指定支持同步复制(参见 Section 26.2.8)的备用服务器列表。集群中会存在一个或多个处于活跃状态的同步备库;在这些备库确认收到事务数据后,等待提交的客户端事务才会被允许继续返回成功。同步备库必须是名称出现在此列表中、并且当前已建立网络连接且正在实时以 streaming 状态传输数据的备库(可在系统视图 pg_stat_replication 中查看)。指定多个同步备库能够提供极高的高可用性并坚决防止数据丢失。
备用服务器在此处的名称是指在备库连接串中设置的 application_name。在物理流复制备库中,该值通过 primary_conninfo 进行配置;默认值为 cluster_name,若未配置则默认为 walreceiver。对于逻辑复制,可以在订阅连接信息中配置,默认值为订阅名称。
该参数采用以下语法形式之一指定备库列表:
[FIRST]num_sync(standby_name[, ...] ) ANYnum_sync(standby_name[, ...] )standby_name[, ...]
其中 num_sync 是事务必须等待其确认回复的同步备库数量,standby_name 是备库名称。num_sync 必须是大于零的正整数。FIRST 和 ANY 指定了从所列候选备库中选取同步备库的仲裁方式。
关键字 FIRST 配合 num_sync 指定了基于优先级的同步复制,它让事务提交等待直到 WAL 记录被成功复制到依据优先级选出的前 num_sync 台同步备库。例如配置 FIRST 3 (s1, s2, s3, s4) 会使每笔提交等待来自优先级靠前的三台备库确认。
名字在列表中更靠前的备库将被赋予更高的优先级,
并将被视为同步备库。列表中更靠后的其他备用服务器
代表潜在的同步备库。
如果当前的任何一台同步备库因任何原因断开连接,
它将立即被下一个最高优先级的备用服务器替换。
关键字 FIRST 可以省略。
关键字 ANY 与
num_sync
结合,指定一种基于法定票数的同步复制,使事务提交等待到它们的
WAL 记录被复制到所列备用服务器中的
至少
num_sync
台为止。例如,设置 ANY 3 (s1, s2, s3, s4)
将使每次提交在 s1、s2、
s3 和 s4
中至少任意三台应答后尽快继续。
FIRST 和 ANY
不区分大小写。如果这些关键字被用作备用服务器的名字,
则其 standby_name
必须用双引号括起来。
第三种语法在 PostgreSQL
9.6 版本之前使用,目前仍然受支持。它等同于第一种语法且
FIRST 和
num_sync
等于 1。例如,FIRST 1 (s1, s2) 和
s1, s2
含义相同:选择 s1 或
s2 之一作为同步备用服务器。
特殊条目 *
匹配任何备用服务器名字。
没有机制来强制备用服务器名字的唯一性。如果出现重复, 其中一个匹配的备用服务器将被视为具有更高的优先级, 但具体是哪一个并不确定。
每个 standby_name
都应当是一个有效 SQL 标识符的形式,除非它是
*。必要时可以使用双引号。但请注意,
无论是否使用双引号,
standby_name
与备用应用名字的比较都是不区分大小写的。
如果这里没有指定同步备用服务器名字,那么同步复制不会被启用,
事务提交也不会等待复制。这是默认配置。即便启用了同步复制,
个别事务仍然可以通过把
synchronous_commit 参数设置为
local 或 off
来配置为不等待复制。
这个参数只能在 postgresql.conf
文件中或服务器命令行上设置。
synchronized_standby_slots (string)
#
一个以逗号分隔的流复制备用服务器槽名列表,逻辑 WAL
发送进程将等待这些槽。逻辑 WAL
发送进程只有在指定的复制槽确认收到 WAL
之后,才会把解码出的变更发送给插件。这保证了逻辑复制故障转移槽
在相应的物理备用服务器接收并刷盘这些变更之前不会消费它们。
如果一个逻辑复制连接预期在备用服务器被提升后切换到该物理
备用服务器,则应当在这里列出该备用服务器的物理复制槽。
注意,如果 synchronized_standby_slots
中指定的槽不存在或已失效,逻辑复制将无法继续。
此外,当与逻辑故障转移槽一起使用时,复制管理函数
pg_replication_slot_advance、
pg_logical_slot_get_changes 和
pg_logical_slot_peek_changes
将阻塞,直到
synchronized_standby_slots
中指定的所有物理槽都确认了 WAL 的接收。
与 synchronized_standby_slots
中物理复制槽对应的备用服务器必须配置
sync_replication_slots = true,
这样它们才能从主服务器接收逻辑故障转移槽的变更。
这些参数用于控制接收复制数据的备用服务器的运行行为。它们在主库上设置没有影响。
primary_conninfo (string)
#指定备用服务器用于连接发送端主库的连接字符串。该字符串采用 Section 32.1.1 中描述的连接格式。若在此字符串中有未指定的选项,系统会自动检查对应的环境变量(参见 Section 32.15);若环境变量同样未设置,则采用默认值。
连接字符串应明确指定发送服务器的主机名(或物理 IP 地址),以及服务端口号(若与备库本地端口不同)。还必须指定在发送端具有适当流复制权限的角色用户名(参见 Section 26.2.5.1)。若发送端要求密码认证,还需要提供连接密码。密码可直接在 primary_conninfo 字符串中提供,或配置在备库本地专用的 ~/.pgpass 文件中(数据库名使用 replication)。
对于复制槽同步(参见 Section 47.2.3),还必须在 primary_conninfo 字符串中指定合法的 dbname 数据库名。该数据库名仅用于复制槽同步,在常规物理流复制中会被忽略。
该参数只能在 postgresql.conf 文件中或在服务器命令行中设置。如果在 WAL 接收进程(walreceiver)运行期间修改了该参数,系统会向该进程发送退出信号并期望其使用新设置重启(除非 primary_conninfo 为空字符串)。如果服务器不处于备库模式,此设置无效。
primary_slot_name (string)
#
可选指定通过流复制连接上游发送端时使用的已存在复制槽名称,以控制上游节点的资源清理(参见 Section 26.2.6)。该参数只能在 postgresql.conf 文件中或在服务器命令行中设置。如果在 WAL 接收进程运行期间更改了此参数,系统会向该进程发送退出信号并使用新设置重启。若未设置 primary_conninfo 或服务器未处于备库模式,此设置无效。
hot_standby (boolean)
#
指定在恢复阶段(即在备库上)是否允许客户端建立网络连接并执行只读查询。默认值为 on。该参数只能在服务器启动时设置。它仅在归档恢复或备库模式下生效。
max_standby_archive_delay (integer)
#
当热备(Hot Standby)处于激活状态时,该参数决定备用服务器在取消与即将回放的 WAL 记录发生锁冲突的备库查询之前所能等待的最长时间(详见 Section 26.4.2)。max_standby_archive_delay 适用于从 WAL 归档读取历史数据回放的场景。若不带单位按毫秒计算。默认值为 30 秒。设置为 -1 允许备库无限期等待冲突查询执行完毕。该参数只能在 postgresql.conf 文件中或在服务器命令行中设置。
注意,max_standby_archive_delay
与一个查询在被取消之前可以运行的最长时间并不是一回事;
它是应用任意一个 WAL 段的数据所允许的最大总时长。
因此,如果一个查询已经在该 WAL 段的较早部分造成了显著延迟,
后续的冲突查询将只有少得多的宽限时间。
max_standby_streaming_delay (integer)
#
当热备用处于活动状态时,这个参数决定备用服务器应当等待多久
才取消与即将被应用的 WAL 条目相冲突的备用查询,
如 Section 26.4.2 中所述。
max_standby_streaming_delay
在 WAL 数据通过流复制接收时适用。
如果这个值没有指定单位,则以毫秒为单位。
默认值为 30 秒。
值为 -1 允许备用服务器无限期地等待冲突查询完成。
这个参数只能在 postgresql.conf
文件中或服务器命令行上设置。
注意,max_standby_streaming_delay
与一个查询在被取消之前可以运行的最长时间并不是一回事;
它是在从主服务器接收到 WAL 数据之后,应用这些数据所允许的
最大总时长。因此,如果一个查询已经造成了显著延迟,
后续的冲突查询将只有少得多的宽限时间,直到备用服务器再次
赶上进度。
wal_receiver_create_temp_slot (boolean)
#
指定当没有配置(通过 primary_slot_name)
可用的永久复制槽时,WAL 接收进程是否应当在远程实例上创建一个
临时复制槽。
默认值为 off。这个参数只能在
postgresql.conf 文件中或服务器命令行上
设置。
如果在 WAL 接收进程运行期间更改这个参数,该进程将被发信号
要求关闭,并预期以新设置重新启动。
wal_receiver_status_interval (integer)
#
指定备用服务器上的 WAL 接收进程向主服务器或上游备用服务器
发送复制进度信息的最小频率,这些信息可以通过
pg_stat_replication
视图查看。备用服务器将报告它已写入的最后一个预写日志位置、
它已刷盘的最后一个位置,以及它已应用的最后一个位置。
这个参数的值是两次报告之间的最大间隔时间。
每当写位置或刷盘位置变化时都会发送更新;如果这个参数被设置为
非零值,则至多按它指定的时间间隔发送更新。
还有一些忽略这个参数而发送更新的情形;例如,
处理完现有的 WAL 时,或 synchronous_commit
被设置为 remote_apply 时。
因此,应用位置可能略微落后于真实位置。
如果这个值没有指定单位,则以秒为单位。
默认值为 10 秒。这个参数只能在
postgresql.conf 文件中或服务器命令行上
设置。
hot_standby_feedback (boolean)
#
指定热备用是否就备用服务器上当前执行的查询向主服务器或上游
备用服务器发送反馈。这个参数可用于消除由清理记录造成的查询
取消,但在某些工作负载下可能导致主服务器上的数据库膨胀。
反馈消息的发送频率不会高于每
wal_receiver_status_interval 一次。
默认值为 off。这个参数只能在
postgresql.conf 文件中或服务器命令行上
设置。
如果使用了级联复制,反馈会向上游传递,直到最终到达主服务器。 备用服务器对收到的反馈除了向上游传递之外不做其他用途。
注意,如果备用服务器上的时钟被向前或向后调整, 反馈消息可能不会按要求的间隔发送。在极端情况下, 由于反馈机制基于时间戳,这可能导致主服务器长时间不能移除 死行的风险延长。
wal_receiver_timeout (integer)
#
终止不活动时间超过这个时长的复制连接。这有助于接收端的备用
服务器检测主节点的崩溃或网络中断。
如果这个值没有指定单位,则以毫秒为单位。
默认值为 60 秒。
值为零会禁用超时机制。
这个参数只能在
postgresql.conf 文件中或服务器命令行上
设置。
wal_retrieve_retry_interval (integer)
#
指定当无法从任何来源(流复制、本地
pg_wal 或 WAL 归档)获得 WAL
数据时,备用服务器应当等待多久再重新尝试获取 WAL 数据。
如果这个值没有指定单位,则以毫秒为单位。
默认值为 5 秒。
这个参数只能在
postgresql.conf 文件中或服务器命令行上
设置。
在恢复中的节点需要控制等待新 WAL 数据可用的时间量的配置中, 这个参数很有用。例如,在归档恢复中,可以通过减小这个参数的值 让恢复更灵敏地检测到新的 WAL 文件。在 WAL 活动较少的系统上, 增大它可以减少访问 WAL 归档所需的请求数量,这在基础设施访问 次数会被计入成本的环境中(例如云环境)很有用。
在逻辑复制中,这个参数还限制失败的复制应用工作进程或表同步 工作进程被重新生成的频率。
recovery_min_apply_delay (integer)
#
默认情况下,备用服务器会尽快从发送服务器恢复 WAL 记录。
拥有一份数据的延时副本可能有用,它提供了纠正数据丢失错误的
机会。这个参数允许你把恢复延迟指定的一段时间。
例如,如果你把这个参数设置为 5min,
那么只有当备用服务器上的系统时间至少超过主服务器报告的提交
时间五分钟时,备用服务器才会重放每个事务提交。
如果这个值没有指定单位,则以毫秒为单位。
默认值为零,即不增加延迟。
服务器之间的复制延迟有可能超过这个参数的值,在这种情况下 不会增加任何延迟。 注意,延迟是在主服务器上写入的 WAL 时间戳与备用服务器上的当前 时间之间计算的。由于网络滞后或级联复制配置造成的传输延迟 可能显著缩短实际的等待时间。如果主服务器和备用服务器的系统 时钟不同步,这可能导致恢复比预期更早地应用记录;但这并不是 什么大问题,因为这个参数的有用设置远大于服务器之间典型的时间 偏差。
延迟只作用于事务提交的 WAL 记录。 其他记录会被尽快重放,这不会成为问题,因为 MVCC 可见性规则保证在相应的提交记录被应用之前它们的效果不可见。
延迟发生在恢复中的数据库已经达到一致状态之后, 一直持续到备用服务器被提升或被触发。在那之后, 备用服务器将结束恢复而不再等待。
WAL 记录必须保留在备用服务器上,直到它们准备好被应用。
因此,更长的延迟会导致 WAL 文件累积得更多,增加备用服务器
pg_wal 目录的磁盘空间需求。
这个参数预期用于流复制部署;不过,如果指定了这个参数,
那么除崩溃恢复之外的所有情形都会遵照它执行。
hot_standby_feedback
会因使用这一特性而延迟,这可能导致主服务器上的膨胀;
请谨慎地同时使用两者。
当 synchronous_commit
被设置为 remote_apply 时,
同步复制会受到这个设置的影响;每个 COMMIT
都需要等待被应用。
这个参数只能在 postgresql.conf
文件中或服务器命令行上设置。
sync_replication_slots (boolean)
#它让物理备用服务器能够从主服务器同步逻辑故障转移槽, 这样在故障转移之后逻辑订阅者就能从新的主服务器恢复复制。
它默认被禁用。这个参数只能在
postgresql.conf 文件中或服务器命令行上
设置。
这些设置控制逻辑复制订阅者的行为。 它们在发布者上的取值无关紧要。 更多细节请参见 Section 29.12。
max_active_replication_origins (integer)
#
指定可以同时跟踪多少个复制起源(参见
Chapter 48),
从而有效地限制可以在服务器上创建多少个逻辑复制订阅。
把它设置为低于当前被跟踪的复制起源数量
(反映在
pg_replication_origin_status
中)会导致服务器无法启动。默认值为 10。这个参数只能在服务器
启动时设置。
max_active_replication_origins
必须被设置为至少是将被添加到订阅者的订阅数量,再加上一些用于
表同步的余量。
max_logical_replication_workers (integer)
#指定逻辑复制工作进程的最大数量。这包括领导者应用工作进程、 并行应用工作进程和表同步工作进程。
逻辑复制工作进程从
max_worker_processes
定义的池中获取。
默认值为 4。这个参数只能在服务器启动时设置。
max_sync_workers_per_subscription (integer)
#每个订阅的同步工作进程的最大数量。这个参数控制在订阅初始化 期间或添加新表时初始数据拷贝的并行量。
目前,每个表只能有一个同步工作进程。
同步工作进程从
max_logical_replication_workers
定义的池中获取。
默认值为 2。这个参数只能在
postgresql.conf 文件中或服务器命令行上
设置。
max_parallel_apply_workers_per_subscription (integer)
#
每个订阅的并行应用工作进程的最大数量。这个参数控制在订阅参数
streaming = parallel
下流式传输进行中事务的并行量。
并行应用工作进程从
max_logical_replication_workers
定义的池中获取。
默认值为 2。这个参数只能在
postgresql.conf 文件中或服务器命令行上
设置。