9.3 9.4 9.5 9.6 10 11 12 13 14 15 16 17 Current(18)
PostgreSQL中文社区 问题报告 纠错本页面

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.12 节

19.6.1. 发送服务器 #

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

max_wal_senders (integer) #

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

指定在检查点时,replication slots(复制槽)允许在pg_wal目录中保留的WAL文件的最大大小。 如果max_slot_wal_keep_size为-1(默认值),复制槽可以保留无限量的WAL文件。否则,如果复制槽的restart_lsn落后于当前LSN超过给定大小, 使用该槽的备用服务器可能由于所需的WAL文件被删除而无法继续复制。您可以在pg_replication_slots中查看复制槽的WAL可用性。 如果此值未指定单位,则视为兆字节。此参数只能在postgresql.conf文件或服务器命令行中设置。

idle_replication_slot_timeout (integer) #

使未在此持续时间内被使用的复制槽失效(未被 复制连接 使用)。 如果此值未指定单位,则视为秒。 值为零(默认值)将禁用空闲超时失效机制。 此参数只能在 postgresql.conf 文件或服务器命令行中设置。

由于空闲超时导致的槽失效发生在检查点期间。 由于检查点在 checkpoint_timeout 间隔内发生,因此在超过 idle_replication_slot_timeout 和 在下一个检查点触发槽失效之间可能会有一些延迟。 为了避免这种延迟,用户可以强制检查点以迅速使 非活动槽失效。槽的非活动持续时间是使用槽的 pg_replication_slots.inactive_since 值计算的。

请注意,空闲超时失效机制不适用于不保留 WAL 的槽 或在从主服务器同步的备用服务器上的槽(即,备用槽 具有 pg_replication_slots.syncedtrue)。同步槽始终被视为 非活动,因为它们不执行逻辑解码以产生更改。

wal_sender_timeout (integer) #

中断那些停止活动超过这个时间量的复制连接。这对发送服务器检测一个备用服务器崩溃或网络中断有用。 如果指定值时没有单位,则以毫秒为单位。默认值是 60 秒。值 0 将禁用超时机制。

对于跨越多个地理位置分布的集群,每个位置使用不同的值可以为集群管理带来更大的灵活性。 对于具有低延迟网络连接的备用服务器,较小的值有助于更快的故障检测; 对于位于远端位置的具有高延迟网络连接的备用服务器,较大的值有助于更好地判断备用服务器的健康状况。

track_commit_timestamp (boolean) #

记录事务的提交时间。 此参数只能在服务器启动时设置。 默认值为 off

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 是备用服务器的名称。 num_sync 必须是大于零的整数值。 FIRSTANY 指定从列出的服务器中选择 同步备用的方法。

关键词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会被选中作为同步备用服务器。

特殊项*匹配任意备用名称。

没有机制强制后备服务器名称的唯一性。在出现重复的情况下,匹配的后备之一将被认为是较高优先级,不过无法弄清到底是哪一个。

注意

每一个standby_name都应该具有合法 SQL 标识符的形式,除非它是*。如果必要你可以使用双引号。但是注意在比较standby_name和后备应用程序名称时是大小写不敏感的(不管有没有双引号)。

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

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

synchronized_standby_slots (string) #

以逗号分隔的流复制备用服务器插槽名称列表,逻辑 WAL 发送进程将等待这些插槽。 逻辑 WAL 发送进程只有在指定的复制插槽确认接收 WAL 后,才会将解码后的更改发送给插件。 这保证了逻辑复制故障转移插槽不会消耗更改,直到这些更改被接收并刷新到相应的物理备用节点。 如果逻辑复制连接打算在备用节点提升后切换到物理备用节点,则应在此处列出备用节点的物理复制插槽。 注意,如果 synchronized_standby_slots 中指定的插槽不存在或已失效, 逻辑复制将不会继续。此外,复制管理函数 pg_replication_slot_advance pg_logical_slot_get_changes pg_logical_slot_peek_changes 在与逻辑故障转移插槽一起使用时, 会阻塞,直到 synchronized_standby_slots 中指定的所有物理插槽确认接收了 WAL。

与物理复制槽对应的备用节点,在synchronized_standby_slots中必须配置 sync_replication_slots = true,以便它们能够接收来自主节点的逻辑故障转移槽变更。

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为空字符串)。 如果没有设置primary_conninfo或服务器没有处于备用模式,则此设置无效。

hot_standby (boolean) #

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

max_standby_archive_delay (integer) #

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

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

max_standby_streaming_delay (integer) #

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

注意,max_standby_streaming_delay与取消之前一个查询能够运行的最长时间不同;它表示在从主服务器接收到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文件中或在服务器命令行上设置。

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

请注意,如果备用的时钟向前或向后移动,反馈消息可能不会在 所需的间隔内发送。在极端情况下,这可能导致主服务器上 长时间无法删除死行,因为反馈机制是基于时间戳的。

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,对于一个事务提交,只有当后备机上的系统时钟超过主服务器报告的提交时间至少 5 分钟时,后备机才会重放该事务。 如果指定值时没有单位,则以毫秒为单位。默认为 0,不增加延迟。

有可能服务器之间的复制延迟会超过这个参数的值,在这种情况下则不会增加延迟。 注意延迟是根据主服务器上写 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.12 节以了解更多详细信息。

max_active_replication_origins (integer) #

指定可以同时跟踪多少个复制源(参见 第 48 章),有效限制可以在 服务器上创建多少个逻辑复制订阅。将其设置为低于当前 跟踪的复制源数量(在 pg_replication_origin_status 中反映)将阻止服务器启动。默认值为10。此参数 只能在服务器启动时设置。 max_active_replication_origins必须至少设置为 将添加到订阅者的订阅数量,加上一些用于表同步的 备用。

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文件中或服务器命令行上设置。