Skip to content

20.6. 复制#

20.6.1. 发送服务器
20.6.2. 主服务器
20.6.3. 备用服务器
20.6.4. 订阅者

这些设置控制内置流复制功能(请参阅第 27.2.5 节)和内置逻辑复制功能(请参阅第 31 章)的行为。

对于流复制,服务器将是主服务器或备用服务器。主服务器可以发送数据,而备用服务器始终是复制数据的接收器。当使用级联复制(参见第 27.2.7 节)时,备用服务器也可以是发送器和接收器。参数主要适用于发送服务器和备用服务器,尽管某些参数仅在主服务器上才有意义。如果需要,可以在集群中更改设置,而不会出现问题。

对于逻辑复制发布者(执行CREATE PUBLICATION的服务器)将数据复制到订阅者(执行CREATE SUBSCRIPTION的服务器)。服务器还可以同时是发布者和订阅者。请注意,以下部分将发布者称为“发送者”。有关逻辑复制配置设置的更多详细信息,请参阅第 31.10 节

20.6.1. 发送服务器#

这些参数可以设置在将复制数据发送到一个或多个备用服务器的任何服务器上。主服务器始终是发送服务器,因此这些参数必须始终在主服务器上设置。在备用服务器成为主服务器后,这些参数的作用和含义不会改变。

max_wal_senders (integer) #

指定备用服务器或流式基本备份客户端的最大并发连接数(即同时运行的 WAL 发送程序进程的最大数量)。默认值为 10。值 0 表示已禁用复制。流式客户端突然断开连接可能会留下一个孤立的连接槽,直到达到超时,因此此参数应设置得比预期的最大客户端数量稍高,以便断开连接的客户端可以立即重新连接。此参数只能在服务器启动时设置。此外,wal_level 必须设置为 replica 或更高级别,才能允许备用服务器连接。

在运行备用服务器时,您必须将此参数设置为与主服务器相同或更高的值。否则,将不允许在备用服务器中进行查询。

max_replication_slots (integer) #

指定服务器可以支持的最大复制槽数量(请参阅 第 27.2.6 节)。默认值为 10。此参数只能在服务器启动时设置。将其设置为低于当前存在的复制槽数量,将阻止服务器启动。此外,wal_level 必须设置为 replica 或更高级别,才能允许使用复制槽。

请注意,此参数也适用于订户端,但含义不同。

wal_keep_size (integer) #

指定在 pg_wal 目录中保留的过去 WAL 文件的最小大小,以防备用服务器需要获取它们以进行流式复制。如果连接到发送服务器的备用服务器落后于 wal_keep_size 兆字节以上,则发送服务器可能会删除备用服务器仍需要的 WAL 段,在这种情况下,复制连接将被终止。下游连接最终也会因此失败。(但是,如果正在使用 WAL 归档,则备用服务器可以通过从归档中获取段来恢复。)

这仅设置 pg_wal 中保留的段的最小大小;系统可能需要保留更多段以进行 WAL 归档或从检查点恢复。如果 wal_keep_size 为零(默认值),则系统不会保留任何用于备用的额外段,因此备用服务器可用的旧 WAL 段数量是前一个检查点的位置和 WAL 归档状态的函数。如果未指定单位,则此值将以兆字节为单位。此参数只能在 postgresql.conf 文件或服务器命令行中设置。

max_slot_wal_keep_size (integer) #

指定在检查点时间 复制槽 允许在 pg_wal 目录中保留的 WAL 文件的最大大小。如果 max_slot_wal_keep_size 为 -1(默认值),则复制槽可以保留无限量的 WAL 文件。否则,如果复制槽的 restart_lsn 落后于当前 LSN 超过给定大小,则使用该槽的备用服务器可能由于必需的 WAL 文件被移除而无法继续复制。您可以在 pg_replication_slots 中查看复制槽的 WAL 可用性。如果未指定单位,则此值将以兆字节为单位。此参数只能在 postgresql.conf 文件或服务器命令行中设置。

wal_sender_timeout (integer) #

终止在此时间段内处于非活动状态的复制连接。这对于发送服务器检测备用服务器崩溃或网络中断非常有用。如果未指定单位,则此值将以毫秒为单位。默认值为 60 秒。值为零会禁用超时机制。

对于分布在多个地理位置的集群,针对每个位置使用不同的值可以提高集群管理的灵活性。对于具有低延迟网络连接的备用服务器,较小的值有助于更快地检测故障;较大的值有助于更好地判断位于远程位置且具有高延迟网络连接的备用服务器的运行状况。

track_commit_timestamp (boolean) #

记录事务的提交时间。此参数只能在 postgresql.conf 文件或服务器命令行中设置。默认值为 off

20.6.2. 主服务器#

这些参数可以在主服务器上设置,该服务器将复制数据发送到一个或多个备用服务器。请注意,除了这些参数之外,还必须在主服务器上适当地设置wal_level,并且可以选择启用 WAL 归档(请参阅第 20.5.3 节)。这些参数在备用服务器上的值无关紧要,但您可能希望在那里设置它们,以便为备用服务器成为主服务器的可能性做好准备。

synchronous_standby_names (string) #

指定可以支持同步复制的备用服务器列表,如 第 27.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 是备用服务器的名称。 FIRSTANY 指定从列出的服务器中选择同步备用服务器的方法。

关键字 FIRSTnum_sync 配合使用,指定基于优先级的同步复制,并使事务提交等待,直到其 WAL 记录复制到根据其优先级选择的 num_sync 同步备用服务器。例如,设置 FIRST 3 (s1, s2, s3, s4) 将导致每个提交等待来自备用服务器 s1s2s3s4 中选择的三台较高优先级的备用服务器的回复。列表中较早出现的备用服务器被赋予较高的优先级,并将被视为同步。此列表中稍后出现的其他备用服务器表示潜在的同步备用服务器。如果任何当前的同步备用服务器因任何原因断开连接,它将立即被下一个最高优先级的备用服务器替换。关键字 FIRST 是可选的。

关键字 ANYnum_sync 配合使用,指定基于法定的同步复制,并使事务提交等待,直到其 WAL 记录复制到 至少 num_sync 个列出的备用服务器。例如,设置 ANY 3 (s1, s2, s3, s4) 将导致每个提交在 s1s2s3s4 的至少三个备用服务器回复后立即进行。

FIRSTANY 不区分大小写。如果这些关键字用作备用服务器的名称,则其 standby_name 必须用双引号引起来。

第三个语法在 PostgreSQL 9.6 版之前使用,并且仍然受支持。它与第一个语法相同,FIRSTnum_sync 等于 1。例如,FIRST 1 (s1, s2)s1, s2 具有相同的含义:s1s2 被选为同步备用服务器。

特殊条目 * 匹配任何备用名称。

没有机制来强制备用名称的唯一性。如果出现重复,则将其中一个匹配的备用视为优先级较高,但具体是哪一个是不确定的。

注意

每个 standby_name 应采用有效的 SQL 标识符形式,除非它是 *。必要时可以使用双引号。但请注意,无论是否使用双引号,standby_name 都会不区分大小写地与备用应用程序名称进行比较。

如果此处未指定同步备用名称,则不会启用同步复制,事务提交不会等待复制。这是默认配置。即使启用了同步复制,也可以通过将 synchronous_commit 参数设置为 localoff 来配置各个事务不等待复制。

此参数只能在 postgresql.conf 文件或服务器命令行中设置。

20.6.3. 备用服务器#

这些设置控制将接收复制数据的备用服务器的行为。它们在主服务器上的值无关紧要。

primary_conninfo (string) #

指定备用服务器用于与发送服务器连接的连接字符串。此字符串采用 第 34.1.1 节 中描述的格式。如果此字符串中未指定任何选项,则会检查相应的环境变量(请参见 第 34.15 节)。如果环境变量也没有设置,则使用默认值。

连接字符串应指定发送服务器的主机名(或地址),以及端口号(如果它与备用服务器的默认值不同)。还要指定一个与发送服务器上具有适当权限的角色相对应的用户名(请参阅第 27.2.5.1 节)。如果发送方要求密码身份验证,则还需要提供密码。可以在primary_conninfo字符串中或备用服务器上的单独~/.pgpass文件中提供(使用replication作为数据库名称)。请勿在primary_conninfo字符串中指定数据库名称。

此参数只能在postgresql.conf文件中或服务器命令行中设置。如果在 WAL 接收器进程运行时更改此参数,则会向该进程发出关闭信号,并预期它使用新设置重新启动(除非primary_conninfo是一个空字符串)。如果服务器不在备用模式,则此设置无效。

primary_slot_name (string) #

可选择指定一个现有的复制槽,以便在通过流复制连接到发送服务器时使用,以控制上游节点上的资源移除(请参阅第 27.2.6 节)。此参数只能在postgresql.conf文件中或服务器命令行中设置。如果在 WAL 接收器进程运行时更改此参数,则会向该进程发出关闭信号,并预期它使用新设置重新启动。如果primary_conninfo未设置或服务器不在备用模式,则此设置无效。

hot_standby (boolean) #

指定在恢复期间是否可以连接和运行查询,如第 27.4 节中所述。默认值为on。此参数只能在服务器启动时设置。它仅在归档恢复期间或备用模式下有效。

max_standby_archive_delay (整数) #

热备用处于活动状态时,此参数确定备用服务器在取消与即将应用的 WAL 条目冲突的备用查询之前应等待多长时间,如 第 27.4.2 节 中所述。当 WAL 数据从 WAL 存档中读取时(因此不是当前数据),max_standby_archive_delay 适用。如果未指定单位,则此值将以毫秒为单位。默认值为 30 秒。值为 -1 允许备用服务器无限期地等待冲突查询完成。此参数只能在 postgresql.conf 文件或服务器命令行中设置。

请注意,max_standby_archive_delay 与查询在取消之前可以运行的最长时间不同;相反,它是在应用任何一个 WAL 段数据的过程中允许的最大总时间。因此,如果一个查询导致 WAL 段的前面部分出现重大延迟,后续的冲突查询将有更少的宽限时间。

max_standby_streaming_delay (整数) #

热备用处于活动状态时,此参数确定备用服务器在取消与即将应用的 WAL 条目冲突的备用查询之前应等待多长时间,如 第 27.4.2 节 中所述。当通过流复制接收 WAL 数据时,max_standby_streaming_delay 适用。如果未指定单位,则此值将以毫秒为单位。默认值为 30 秒。值为 -1 允许备用服务器无限期地等待冲突查询完成。此参数只能在 postgresql.conf 文件或服务器命令行中设置。

请注意,max_standby_streaming_delay 与查询在取消前可以运行的最长时间不同;相反,它是从主服务器接收到 WAL 数据后允许应用该数据的最大总时间。因此,如果一个查询导致了明显的延迟,则后续的冲突查询在备用服务器再次赶上之前将有更少的宽限时间。

wal_receiver_create_temp_slot (boolean) #

指定 WAL 接收器进程是否应在远程实例上创建临时复制槽,而没有配置要使用的永久复制槽(使用 primary_slot_name)。默认值为关闭。此参数只能在 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 文件或服务器命令行中设置。

如果使用级联复制,则反馈将向上游传递,直到最终到达主备用。备用不会将接收到的反馈用于除向上游传递之外的任何其他用途。

此设置不会覆盖主备用上 old_snapshot_threshold 的行为;备用上的快照超过主备用的年龄阈值可能会变得无效,从而导致备用上的事务取消。这是因为 old_snapshot_threshold 旨在对死行可能导致膨胀的时间提供绝对限制,否则由于备用的配置,该限制将被违反。

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 文件或服务器命令行中设置。

20.6.4. 订阅者#

这些设置控制逻辑复制订阅者的行为。它们在发布者上的值无关紧要。有关更多详细信息,请参见第 31.10 节

max_replication_slots (integer) #

指定可以同时跟踪多少个复制源(请参见 第 50 章),从而有效地限制可以在服务器上创建多少个逻辑复制订阅。将其设置为低于当前跟踪的复制源数量(反映在 pg_replication_origin_status 中)将阻止服务器启动。 max_replication_slots 必须至少设置为将添加到订阅者的订阅数量,以及一些表同步的保留。

请注意,此参数也适用于发送服务器,但含义不同。

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 文件或服务器命令行中设置。