Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

19.6. 复制 #

19.6.1 发信服务器
19.6.2 主服务器
19.6.3 备用服务器
19.6.4 订阅者

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

对于流复制,服务器将是主键服务器或从服务器。主键可以发送数据,而从服务器始终是复制数据的接收器。当使用级联式复制(请参见第 26.2.7 节)时,从服务器既可以是发送器,也可以是接收器。参数主要针对发送和从服务器,尽管某些参数在主键服务器上才有意义。如果需要,集群范围内的设置可以有差别,这没有问题。

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

19.6.1. 发送服务器 #

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

max_wal_senders (整数) #

指定来自从服务器或流基准备份客户端的最大并发连接数(即同时运行的 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) #

指定 WAL 文件的最大大小,以允许 复制槽 在检查点时间保存在 pg_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 (string) #

指定可支持同步复制的备用服务器列表,如第 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是可选的。

关键字 ANY 结合 num_sync 指定基于法定的同步复制,并将事务提交延迟至 WAL 记录复制到 num_sync 所列备用服务器中的 至少

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 (string) #

指定待机服务器用于连接到发送服务器的连接字符串。此字符串的格式如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 (string) #

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

hot_standby (boolean) #

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

max_standby_archive_delay (integer) #

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

请注意,max_standby_archive_delay 并不等于查询在被取消之前能够运行的最长时间;相反,它是应用任何一个 WAL 段数据所允许的最大总时间。因此,如果一个查询已在 WAL 段中较早时间导致明显延迟,那么随后的有冲突查询的宽限期将少很多。

max_standby_streaming_delay (integer) #

当热备用激活时,此参数确定备用服务器在取消与将要应用的 WAL 条目相冲突的备用查询之前应等待多久,如第 26.4.2 部分所述。当通过流复制接收 WAL 数据时,将应用 max_standby_streaming_delay。如果不带单位指定此值,则此值将被视为毫秒。默认值为 30 秒。值 -1 允许备用服务器无限制地等待冲突查询完成。此参数仅可在 postgresql.conf 文件或服务器命令行中设置。

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

wal_receiver_create_temp_slot (boolean) #

指定当没有配置可使用的永久复制槽时(使用 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 秒。0 的值会禁用超时机制。此参数只能在 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 文件中或在服务器命令行上设置。