选择 打开 改范围 完整检索页
受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10
当前 PostgreSQL 版本不在支持生命周期内。
您可以参阅当前版本的对应页面,或其他在上面列出的活跃大版本。

19.6. 复制 #

这些设置控制内置流复制特性(见Section 26.2.5)的行为。服务器将可以是主库或备库。主库能发送数据,而备库总是被复制数据的接收者。当使用级联复制(见Section 26.2.7)时,备库也可以是发送者,同时也是接收者。这些参数主要用于发送服务器和备库,尽管某些只在主库上有意义。如果有必要,设置可以在集簇中变化而不出问题。

19.6.1. 发送服务器 #

这些参数可以在任何发送复制数据给一个或多个备库的服务器上设置。主库总是一个发送服务器,因此这些参数总是要在主库上设置。这些参数的角色和含义不会在一个备库变成主库后改变。

max_wal_senders (integer) #

指定来自备库或流式基础备份客户端的并发连接的最大数量(即同时运行 WAL 发送进程的最大数)。 默认值是 10。值 0 意味着禁用复制。WAL 发送进程计入总连接数,因此此参数的值必须小于 max_connections减去superuser_reserved_connections。 流式客户端突然断开连接可能留下一个孤立连接槽,直到达到超时,因此此参数应设置得略高于预期的最大客户端数,使断开连接的客户端能够立即重新连接。 此参数只能在服务器启动时设置。此外,wal_level必须设置为replica或更高级别,才允许来自备库的连接。

max_replication_slots (integer) #

指定服务器可以支持的复制槽(见Section 26.2.6) 最大数量。默认值为10。这个参数只能在服务器启动时设置。将它设置为一个比当前已有复制槽要少的值会阻碍服务器启动。此外,要允许使用复制槽, wal_level必须被设置为replica或 更高。

在订阅者端,指定可以同时跟踪多少个复制源(参见Chapter 50),从而限制可以在服务器上创建的逻辑复制订阅数。 如果将其设置为低于当前正在跟踪的复制源数量的值(该数量反映在 pg_replication_origin_status 中, 而不是 pg_replication_origin 中),服务器将无法启动。

wal_keep_segments (integer) #

指定在pg_wal目录中保留的过去日志文件段的最小数量,以便备库可能需要获取它们来进行流复制。 每个段通常为 16 兆字节。如果连接到发送服务器的备库落后超过wal_keep_segments个段, 发送服务器可能会移除备库仍需要的 WAL 段,在这种情况下,复制连接将被终止。下游连接最终也会因此失败。 (但是,如果使用了 WAL 归档,备库可以通过从归档中获取该段来恢复。)

此设置只指定在pg_wal中保留的最小段数;系统可能需要为 WAL 归档或从检查点恢复而保留更多段。 如果wal_keep_segments为零(默认值),系统不会为备库额外保留任何段,因此备库可用的旧 WAL 段数 取决于前一个检查点的位置和 WAL 归档的状态。 此参数只能在postgresql.conf文件中或在服务器命令行上设置。

wal_sender_timeout (integer) #

终止处于非活动状态超过指定毫秒数的复制连接。这有助于发送服务器检测备库崩溃或网络中断。 值零禁用超时机制。此参数只能在postgresql.conf文件中或在服务器命令行上设置。 默认值为 60 秒。

track_commit_timestamp (boolean) #

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

19.6.2. 主库 #

这些参数可以在发送复制数据给一个或多个备库的主库上设置。注意除了这些参数之外,在主库上必须设置合适的wal_level,并且也启用可选的 WAL 归档(见Section 19.5.3)。这些参数值与备库无关,尽管你可能希望为了准备好一个备库转变成主库来设置这些参数。

synchronous_standby_names (string) #

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

用于这一目的的备库名称是其连接信息中设置的application_name。 对于物理复制备库,应在recovery.confprimary_conninfo设置中指定; 默认值为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文件中或通过服务器命令行进行设置。

vacuum_defer_cleanup_age (integer) #

指定VACUUMHOT更新延迟清理死行版本的事务数。默认值为零个事务, 意味着可以尽快移除死行版本,也就是在它们不再对任何打开的事务可见时立即移除。 如Section 26.5所述,在为热备服务器提供支持的主库上,你可能希望将此参数设置为非零值。 这让备库上的查询有更多时间完成,而不会因过早清理行而发生冲突。 但是,由于此值以主库上发生的写事务数计量,很难预测会给备库查询带来多少额外的宽限时间。 此参数只能在postgresql.conf文件中或在服务器命令行上设置。

你也应考虑在备库上设置hot_standby_feedback,作为使用此参数的替代方案。

这不会阻止清理已经达到old_snapshot_threshold指定年龄的死行。

19.6.3. 备库 #

这些设置控制备库接收复制数据时的行为。 它们在主库的值是无关的。

hot_standby (boolean) #

指定在恢复期间,你是否能够连接并运行查询,如Section 26.5中所述。默认值是on。这个参数只能在服务器启动时设置。它只在归档恢复期间或备库模式下才有效。

max_standby_archive_delay (integer) #

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

注意,max_standby_archive_delay与取消之前一个查询能够运行的最长时间不同;它表示应用任何一个 WAL 段数据能够被允许的最长总时间。因此,如果一个查询早于 WAL 段导致了显著的延迟,后续冲突查询将只有更少的时间。

max_standby_streaming_delay (integer) #

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

注意,max_standby_streaming_delay与取消之前一个查询能够运行的最长时间不同;它表示在从主库接收到 WAL 数据并立刻应用它能够被允许的最长总时间。因此,如果一个查询导致了显著的延迟,后续冲突查询将只有更少的时间,直到备库再次赶上进度。

wal_receiver_status_interval (integer) #

指定在备库上的 WAL 接收进程向主库或上游备库发送有关复制进度的信息的最小频度,它可以使用pg_stat_replication视图看到。 备库将报告它已经写入的上一个预写式日志位置、它已经刷到磁盘的上一个位置以及它已经应用的最后一个位置。 这个参数的值是报告之间的最大间隔,以秒为单位。 每次写入或刷出位置改变时会发送状态更新,或者按这个参数的指定的频度发送。 因此,应用位置可能比真实位置略微滞后。 默认值是 10 秒。 将此参数设置为零会完全禁用状态更新。 这个参数只能在postgresql.conf文件中或在服务器命令行上设置。

hot_standby_feedback (boolean) #

指定一个热备机是否将会向主库或上游备库发送有关于备库上当前正被执行的查询的反馈。这个参数可以被用来排除由于记录清除导致的查询取消,但是可能导致在主库上用于某些负载的数据库膨胀。反馈消息的发送频度不会高于每个wal_receiver_status_interval周期发送一次。默认值是off。这个参数只能在postgresql.conf文件中或在服务器命令行上设置。

如果使用级联复制,反馈将被向上游传递直到它最后到达主库。备库在接收到反馈之后除了传递给上游不会做任何其他操作。

此设置不会覆盖主库上old_snapshot_threshold的行为。 如果备库上的快照超过了主库的快照年龄阈值,它可能失效,从而导致备库上的事务被取消。 这是因为old_snapshot_threshold旨在为死行版本导致表膨胀的持续时间设定一个绝对限制, 而备库的配置不应允许违反这个限制。

wal_receiver_timeout (integer) #

终止处于非活动状态超过指定毫秒数的复制连接。这有助于接收数据的备库检测主库节点崩溃或网络中断。 值零禁用超时机制。此参数只能在postgresql.conf文件中或在服务器命令行上设置。 默认值为 60 秒。

wal_retrieve_retry_interval (integer) #

指定当从任何来源(流复制、本地pg_wal或者 WAL 归档)都得不到 WAL 数据时,备库应该等待多久才去重新尝试获取 WAL 数据。 如果指定值时没有单位,则以毫秒为单位。默认值是 5 秒。 这个参数只能在postgresql.conf文件或者服务器命令行中设置。

当恢复中的节点需要控制等待新 WAL 数据可用的时间时,此参数很有用。例如,在归档恢复中,减小此参数的值可以让恢复更快地检测到新的 WAL 日志文件。 在 WAL 活动较少的系统上,增大此值会减少访问 WAL 归档所需的请求数;这在例如按基础设施访问次数计量的云环境中很有用。

19.6.4. 订阅者 #

这些设置控制逻辑复制订阅者的行为。它们在发布者上的值与此无关。

注意,配置参数wal_receiver_timeoutwal_receiver_status_interval以及wal_retrieve_retry_interval也影响逻辑复制工作者。

max_logical_replication_workers (int) #

指定逻辑复制工作者的最大数目。这同时包括应用工作者和表同步工作者。

逻辑复制工作者是从max_worker_processes定义的池中取出的。

默认值是4。 这个参数只能在服务器启动时被设置。

max_sync_workers_per_subscription (integer) #

每个订阅的同步工作者的最大数目。这个参数控制订阅初始化期间或者新表增加时的初始数据拷贝的并行度。

当前,每个表只能有一个同步工作者。

同步工作者是从max_logical_replication_workers定义的池中取出的。

默认值为2。 这个参数只能在postgresql.conf文件中或服务器命令行上设置。