18.6. 复制

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

18.6.1. 发送服务器

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

max_wal_senders (integer)

指定来自后备服务器或流式基础备份客户端的并发连接的最大数量(即同时运行 WAL 发送进程的最大数)。默认值是零,它意味着禁用复制。WAL 发送进程被计算在连接总数内,因此该参数不能被设置为高于max_connections的值。这个参数只能在服务器启动时被设置。wal_level必须设置为archivehot_standby以允许来自后备服务器的连接。

wal_keep_segments (integer)

指定在后备服务器需要为流复制获取日志段文件的情况下,pg_xlog目录下所能保留的过去日志文件段的最小数目。每个段通常是 16 兆字节。如果一个连接到发送服务器的后备服务器落后了超过wal_keep_segments个段,发送服务器可以移除一个后备机仍然需要的 WAL 段,在这种情况下复制连接将被中断。最终结果是下行连接也将最终失败(不过,如果在使用 WAL 归档,后备服务器可以通过从归档获取段来恢复)。

只设置pg_xlog中保留的文件段的最小数目;系统可能需要为 WAL 归档或从一个检查点恢复保留更多段。如果wal_keep_segments为零(默认值), 更多的空间来 存放WAL归档或从一个检查点恢复。如果wal_keep_segments是零(缺省), 系统不会为后备目的保留任何多余的段,因此后备服务器可用的旧 WAL 段的数量是一个上个检查点位置和 WAL 归档状态的函数。这个参数只能在postgresql.conf文件中或在服务器命令行上设置。

wal_sender_timeout (integer)

中断那些停止活动超过指定毫秒数的复制连接。这对发送服务器检测一个后备机崩溃或网络中断有用。零值将禁用该超时机制。这个参数只能在postgresql.conf文件中或在服务器命令行上设置。默认值是 60 秒。

18.6.2. 主服务器

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

synchronous_standby_names (string)

指定一个由逗号分隔的后备机名称列表,这些后备机能够支持同步复制,如Section 25.2.7中所述。在任何一个时刻,只能有最多一个活动的同步后备机;等待提交的事务只有在后备服务器确认收到了它们的数据之后才被允许继续。该同步备份机将是这个列表中第一个被提到的后备机,它当前已连接并且实时获取流数据(在pg_stat_replication视图中以streaming状态显示)。出现在这个列表后面的其他后备服务器表示潜在的同步后备机。如果当前的同步后备机由于某种原因断开连接,它将立刻被下一个优先级最高的后备机替换。指定多于一个后备机名称可以允许很高的可用性。

用于此目的的一个后备服务器的名称是后备服务器的application_name设置,正如在后备机的 walreceiver 的primary_conninfo中所设置的。现在没有机制可以强制唯一性。在重名的情况下,匹配的后备机之一将被选中为同步后备机,但是究竟是哪一个被选中是无法判断的。特殊项*可匹配任意application_name,包括walreceiver的默认应用名称。

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

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

vacuum_defer_cleanup_age (integer)

指定VACUUMHOT更新在清除死亡行版本之前,应该推迟多久(以事务数量计)。默认值是零个事务,表示死亡行版本将被尽可能快地清除,即当它们不再对任何打开的事务可见时尽快清除。在一个支持热后备服务器的主服务器上,你可能希望把这个参数设置为一个非零值,如Section 25.5中所述。这允许后备机上的查询有更多时间来完成而不会由于先前的行清除产生冲突。但是,由于该值是用在主服务器上发生的写事务的数目衡量的,很难预测对后备机查询可用的附加时间到底是多少。这个参数只能在postgresql.conf文件中或在服务器命令行上设置。

你也可以考虑设置后备服务器上的hot_standby_feedback作为使用这个参数的一种替代方案。

18.6.3. 后备服务器

这些设置空值接收复制数据的一个后备服务器的行为。它们的值与主服务器无关。

hot_standby (boolean)

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

max_standby_archive_delay (integer)

当热后备机处于活动状态时,这个参数决定取消那些与即将应用的 WAL 项冲突的后备机查询之前,后备服务器应该等待多久,如Section 25.5.2中所述。当 WAL 数据被从 WAL 归档(并且因此不是当前的 WAL)时,max_standby_archive_delay可以应用。默认值是 30 秒。如果没有指定,衡量单位是毫秒。值 -1 允许后备机一直等到冲突查询结束。这个参数只能在postgresql.conf文件中或在服务器命令行上设置。

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

max_standby_streaming_delay (integer)

当热后备机处于活动状态时,这个参数决定取消那些与即将应用的 WAL 项冲突的后备机查询之前,后备服务器应该等待多久,如Section 25.5.2中所述。当 WAL 数据正在通过流复制被接收时,max_standby_streaming_delay可以应用。默认值是 30 秒。如果没有指定,衡量单位是毫秒。值 -1 允许后备机一直等到冲突查询结束。这个参数只能在postgresql.conf文件中或在服务器命令行上设置。

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

wal_receiver_status_interval (integer)

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

hot_standby_feedback (boolean)

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

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

wal_receiver_timeout (integer)

中止处于非活动状态超过指定毫秒数的复制链接。这对于正在接收的后备服务器检测主服务器崩溃或网络断开有用。值零会禁用超时机制。这个参数只能在postgresql.conf文件中或在服务器命令行上设置。默认值是 60 秒。