2024年9月26日: PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:开发版
不支持的版本:11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1

19.6. 复制 #

这些设置控制内置的流式复制功能(参见第26.2.5节)和内置的逻辑复制功能(参见第29章)的行为。

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

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

19.6.1. 发送服务器 #

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

max_wal_senders (integer) #

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

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

max_replication_slots (integer) #

指定服务器可以支持的复制槽的最大数量(参见第26.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

synchronized_standby_slots (string) #

逻辑 WAL 发送器进程将等待的流式复制备用服务器槽名称的逗号分隔列表。只有在指定的复制槽确认收到 WAL 后,逻辑 WAL 发送器进程才会将解码后的更改发送到插件。这保证了逻辑复制故障转移槽在相应的物理备用服务器收到并刷新更改之前不会使用这些更改。如果逻辑复制连接旨在在备用服务器提升后切换到物理备用服务器,则应在此处列出备用服务器的物理复制槽。请注意,如果synchronized_standby_slots中指定的槽不存在或已失效,则逻辑复制将不会继续。此外,当与逻辑故障转移槽一起使用时,复制管理函数pg_replication_slot_advancepg_logical_slot_get_changespg_logical_slot_peek_changes将阻塞,直到synchronized_standby_slots中指定的所有物理槽都确认收到 WAL。

synchronized_standby_slots中物理复制槽对应的备用服务器必须配置sync_replication_slots = true,以便它们可以从主服务器接收逻辑故障转移槽更改。

19.6.2. 主服务器 #

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

synchronous_standby_names (字符串) #

指定一个可以支持同步复制的备用服务器列表,如第 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 是备用服务器的名称。 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 文件或服务器命令行中设置。

19.6.3. 备用服务器 #

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

primary_conninfo (字符串) #

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

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

对于复制槽同步(请参阅第 47.2.3 节),还需要在 primary_conninfo 字符串中指定有效的 dbname。这仅用于槽同步。对于流式传输,它会被忽略。

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

primary_slot_name (字符串) #

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

hot_standby (布尔型) #

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

max_standby_archive_delay (整数) #

当启用热备用时,此参数确定备用服务器在取消与即将应用的 WAL 条目冲突的备用查询之前应等待多长时间,如第 26.4.2 节所述。max_standby_archive_delay 应用于从 WAL 归档读取 WAL 数据时(因此不是最新的)。如果此值未指定单位,则将其视为毫秒。默认值为 30 秒。值为 -1 允许备用服务器永远等待冲突的查询完成。此参数只能在 postgresql.conf 文件或服务器命令行中设置。

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

max_standby_streaming_delay (整数) #

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

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

wal_receiver_create_temp_slot (布尔型) #

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

19.6.4. 订阅者 #

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

max_replication_slots (integer) #

指定可以同时跟踪多少个复制源(请参见第 48 章),有效地限制了可以在服务器上创建多少个逻辑复制订阅。将其设置为低于当前跟踪的复制源数量(反映在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文件或服务器命令行中设置。

提交更正

如果您在文档中看到任何不正确的内容、与您对特定功能的体验不符的内容或需要进一步澄清的内容,请使用此表单报告文档问题。