19.6. Replication

这些设置控制内置*“流复制” *功能的行为(请参阅Section 26.2.5)。服务器将是主服务器或备用服务器。主服务器可以发送数据,而备用数据库始终是复制数据的接收者。使用级联复制(请参见Section 26.2.7)时,备用服务器也可以是发送者,也可以是接收者。参数主要用于发送和备用服务器,尽管某些参数仅在主服务器上有意义。如果需要,整个群集中的设置可能会有所不同,而不会出现问题。

19 .6.1. 发送服务器

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

  • max_wal_senders ( integer )

    • 指定来自备用服务器或流式基本备份 Client 端的最大并发连接数(即,同时运行的 WAL 发送器进程的最大数)。默认值为 10.值 0 表示禁用复制。 WAL 发送方进程计入连接总数,因此此参数的值必须小于max_connections减去superuser_reserved_connections。突然的流 Client 端断开连接可能会留下孤立的连接插槽,直到达到超时为止,因此应将此参数设置为略高于预期 Client 端的最大数量,以便断开连接的 Client 端可以立即重新连接。该参数只能在服务器启动时设置。另外,wal_level必须设置为replica或更高版本,以允许来自备用服务器的连接。
  • max_replication_slots ( integer )

    • 指定服务器可以支持的最大复制插槽数(请参见Section 26.2.6)。默认值为 10.只能在服务器启动时设置此参数。将其设置为小于当前现有复制插槽数的值将阻止服务器启动。另外,必须将wal_level设置为replica或更高版本,以允许使用复制插槽。
  • 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中所述。将有一个或多个活动的同步备用数据库;这些备用服务器确认收到数据后,将允许 await 提交的事务 continue 进行。同步备用数据库将是名称显示在此列表中的备用数据库,并且它们当前都已连接并且正在实时传输数据(如pg_stat_replication视图中streaming的状态所示)。指定多个同步备用数据库可以实现很高的可用性并防止数据丢失。

为此,备用服务器的名称是备用服务器的application_name设置,如备用服务器的连接信息中所设置。如果是物理复制备用数据库,则应在recovery.confprimary_conninfo设置中进行设置;默认值为walreceiver。对于逻辑复制,可以在订阅的连接信息中设置它,并且默认为订阅名称。对于其他复制流使用者,请查阅其文档。

该参数使用以下两种语法之一指定备用服务器列表:

[FIRST] num_sync ( standby_name [, ...] )
ANY num_sync ( standby_name [, ...] )
standby_name [, ...]

其中* num_sync 是事务需要 await 其回复的同步备用数据库的数量,而 standby_name *是备用服务器的名称。 FIRSTANY指定从列出的服务器中选择同步备用数据库的方法。

关键字FIRST与* num_sync 结合在一起,指定了基于优先级的同步复制,并使事务提交 await,直到其 WAL 记录被复制到 num_sync *根据其优先级选择的同步备用数据库中。例如,设置FIRST 3 (s1, s2, s3, s4)将导致每个提交都 await 来自备用服务器s1s2s3s4的三个优先级较高的备用服务器的答复。名称在列表中较早出现的备用数据库具有更高的优先级,并将被视为同步数据库。此列表后面出现的其他备用服务器代表潜在的同步备用服务器。如果任何当前同步备用数据库由于某种原因断开连接,它将立即替换为次高优先级备用数据库。关键字FIRST是可选的。

关键字ANY与* num_sync 结合使用,指定了基于仲裁的同步复制,并使事务提交 await,直到将其 WAL 记录复制到至少* * num_sync *列出的备用数据库。例如,设置为ANY 3 (s1, s2, s3, s4)会导致每次提交,只要s1s2s3s4的至少三个待机状态都得到答复就 continue 进行。

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

第三种语法在 PostgreSQL 9.6 版之前使用,现在仍然受支持。它与FIRST和* num_sync *等于 1 的第一种语法相同。例如,FIRST 1 (s1, s2)s1, s2具有相同的含义:选择s1s2作为同步备用数据库。

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

没有机制来强制备用名称的唯一性。在重复的情况下,匹配的备用数据库之一将被视为更高的优先级,尽管确切地说哪个是不确定的。

Note

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

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

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

  • vacuum_defer_cleanup_age ( integer )
    • 指定VACUUM和 HOT 更新将延迟清除死行版本的事务数量。默认值为零事务,这意味着可以尽快删除死行版本,也就是说,一旦它们对任何打开的事务不再可见,就可以将它们删除。您可能希望在支持热备用服务器的主服务器上将此值设置为非零值,如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 条目冲突的备用查询之前应 await 的时间,如Section 26.5.2所述。从 WAL 存档中读取 WAL 数据(因此不是当前)时,适用max_standby_archive_delay。默认值为 30 秒。如果未指定,单位为毫秒。值-1 允许备用数据库永远 await 冲突的查询完成。只能在postgresql.conf文件或服务器命令行中设置此参数。

请注意,max_standby_archive_delay与取消之前查询可以运行的最大时间长度不同;而是应用任何一个 WAL 段数据所允许的最大总时间。因此,如果一个查询导致 WAL 段中更早的延迟,则后续冲突查询的宽限时间将少得多。

  • max_standby_streaming_delay ( integer )
    • 当“热备用”处于活动状态时,此参数确定备用服务器在取消与即将应用的 WAL 条目冲突的备用查询之前应 await 的时间,如Section 26.5.2所述。 max_standby_streaming_delay适用于通过流复制接收 WAL 数据的情况。默认值为 30 秒。如果未指定,单位为毫秒。值-1 允许备用数据库永远 await 冲突的查询完成。只能在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文件或服务器命令行中设置此参数。

如果使用级联复制,则反馈将一直传递到上游,直到最终到达主级。备用服务器除了通过上游之外,没有其他利用收到的反馈的方法。

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

  • wal_receiver_timeout ( integer )

    • 终止不活动的复制连接的时间超过指定的毫秒数。这对于接收备用服务器检测主节点崩溃或网络中断很有用。零值将禁用超时机制。此参数只能在postgresql.conf文件或服务器命令行中设置。默认值为 60 秒。
  • wal_retrieve_retry_interval ( integer )

    • 指定在尝试从任何源(流复制,本地pg_wal或 WAL 存档)无法获得 WAL 数据时,备用服务器应 await 多长时间,然后再尝试检索 WAL 数据。只能在postgresql.conf文件或服务器命令行中设置此参数。默认值为 5 秒。如果未指定,单位为毫秒。

此参数在恢复中的节点需要控制 await 新 WAL 数据可用的时间量的配置中很有用。例如,在归档恢复中,可以通过减小此参数的值来使恢复在检测新的 WAL 日志文件时更具响应性。在 WAL 活动较低的系统上,增加 WAL 活动会减少访问 WAL 存档所需的请求数量,例如,在考虑了访问基础结构次数的云环境中,这很有用。

19.6.4. Subscribers

这些设置控制逻辑复制订阅服务器的行为。它们对发布者的价值无关紧要。

请注意,wal_receiver_timeoutwal_receiver_status_intervalwal_retrieve_retry_interval配置参数也会影响逻辑复制工作程序。

  • max_logical_replication_workers ( int )
    • 指定逻辑复制工作程序的最大数量。这包括应用程序工作者和表同步工作者。

逻辑复制工作程序来自max_worker_processes定义的池。

预设值为 4.

  • max_sync_workers_per_subscription ( integer )
    • 每个订阅的最大同步工作者数。此参数控制预订初始化期间或添加新表时初始数据副本的并行度。

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

同步工作程序来自max_logical_replication_workers定义的池。

预设值为 2.