Postgresql 中文操作指南

20.6. Replication #

这些设置控制内置 _streaming replication_功能(请参见 Section 27.2.5)和内置 _logical replication_功能(请参见 Chapter 31)的行为。

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

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

20.6.1. Sending Servers #

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

  • max_wal_senders (integer) #

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

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

  • max_replication_slots (integer) #

    • 指定服务器可以支持的最大复制槽数(请参见 Section 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) #

    • 指定 replication slots允许在检查点时间在 _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. Primary Server #

可以在要向一个或多个备用服务器发送复制数据的主服务器上设置这些参数。请注意,除了这些参数外,还必须在主服务器上正确设置 wal_level,并且还可以选择启用 WAL 归档(请参见 Section 20.5.3)。即使您可能希望将其设置在那里以准备备用服务器成为主服务器的可能性,但这些参数在备用服务器上的值无关紧要。

  • synchronous_standby_names (string) #

    • 指定可支持 synchronous replication 的备用服务器列表,如 Section 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 记录被复制到 at least 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 被选作同步备用。

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

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

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

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

Note

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

20.6.3. Standby Servers #

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

  • primary_conninfo (string) #

    • 指定备用服务器用于与发送服务器连接时要使用的连接字符串。此字符串的格式如 Section 34.1.1中所述。如果此字符串中未指定任何选项,则将检查相应的环境变量(请参见 Section 34.15)。如果同时未设置环境变量,则将使用默认值。

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

    • 此参数只能在 postgresql.conf 文件中或在服务器命令行上设置。如果在 WAL 接收器进程运行期间更改了此参数,则向该进程发出关闭信号,并期望使用新设置重新启动(除非 primary_conninfo 为空字符串)。如果服务器未处于备用模式,则此设置无效。

  • primary_slot_name (string) #

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

  • hot_standby (boolean) #

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

  • max_standby_archive_delay (integer) #

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

    • 请注意, max_standby_archive_delay 与查询在取消之前可以运行的最大时间长度不同;而是对应用任何一个 WAL 段数据允许的最大总时间。因此,如果一个查询在 WAL 段的前面产生了明显的延迟,那么后续的冲突查询将有较少的宽限期。

  • max_standby_streaming_delay (integer) #

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

    • 请注意,max_standby_streaming_delay 与查询在取消前可以运行的最大时间长度不同;相反,它是从主服务器接收 WAL 数据后允许应用 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 将因使用此功能而延迟,这可能会导致主服务器上的膨胀;应谨慎同时使用这两个功能。

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

Warning

synchronous_commit 设置为 remote_apply 时,同步复制会受到此设置的影响;每个 COMMIT 都需要等待被应用。

20.6.4. Subscribers #

这些设置控制逻辑复制订阅者的行为。它们在发布者上的值与之无关。有关更多详情,请参见 Section 31.10

  • max_replication_slots (integer) #

    • 指定可以同时跟踪多少个复制源(参见 Chapter 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 文件或服务器命令行中设置。