Postgresql 中文操作指南

27.2. Log-Shipping Standby Servers #

连续归档可用于创建 high availability(HA)集群配置,其中一个或多个 standby servers 就绪,如果主服务器发生故障,便可接手操作。此功能通常称为 warm standbylog shipping

主服务器和备用服务器协同工作以提供此功能,尽管服务器只是松散耦合的。主服务器以连续归档模式运行,而每个备用服务器则以连续恢复模式运行,从主服务器中读取 WAL 文件。不需要对数据库表进行任何更改以启用此功能,因此与其他一些复制解决方案相比,它提供了较低管理开销。此配置对主服务器的性能影响也相对较小。

直接将 WAL 记录从一个数据库服务器移动到另一个数据库服务器通常称为日志传送。PostgreSQL 通过一次一个文件(WAL 段)传输 WAL 记录实现基于文件的日志传送。无论传输到邻近系统、同一站点上的另一个系统还是地球另一端的另一个系统,WAL 文件(16MB)都可以轻松且廉价地进行传输。此技术所需的带宽因主服务器的事务速率而异。基于记录的日志传送更加细致,并通过网络连接增量传输 WAL 更改(参见 Section 27.2.5)。

请注意,日志传送是异步的,也就是说,WAL 记录是在事务提交后传送的。因此,如果主服务器发生灾难性故障,将存在数据丢失的窗口;尚未传送的事务将丢失。可以使用 archive_timeout 参数限制基于文件的日志传送中的数据丢失窗口的大小,该参数可以低至几秒钟。但是,如此低的值将显著增加文件传输所需的带宽。流复制(参见 Section 27.2.5)允许的数据丢失窗口要小得多。

恢复性能足够好,因此备用数据库一旦被激活,通常只需片刻即可完全可用。因此,这被称为热备用配置,它提供高可用性。从存档的基本备份和前滚恢复服务器需要花费更长的时间,因此该技术仅为灾难恢复提供解决方案,而不是高可用性。备用服务器也可以用于只读查询,在这种情况下,称为 hot standby 服务器。有关更多信息,请参见 Section 27.4

27.2.1. Planning #

通常情况下,最好创建尽可能相似的原始服务器和备用服务器,至少从数据库服务器的角度来看是这样。特别是,与表空间关联的路径名称将直接传递,因此,如果使用了此功能,则原始服务器和备用服务器必须具有相同的表空间装载路径。请记住,如果在原始服务器上执行 CREATE TABLESPACE ,则需要为其创建的任何新装载点必须在命令执行之前先在原始服务器和所有备用服务器上创建。硬件不必完全相同,但经验表明,在应用程序和系统的生命周期中维护两个相同系统比维护两个不同系统更容易。在任何情况下,硬件架构必须相同——例如,从 32 位系统传输到 64 位系统将不起作用。

一般情况下,无法在运行不同主要 PostgreSQL 发行级别的服务器之间进行日志传输。PostgreSQL 全球开发组的策略是,在次要发行升级期间不对磁盘格式进行任何更改,因此在主服务器和备用服务器上运行不同次要发行级别很可能能够成功运行。然而,对此未提供正式的支持,建议您尽可能将主服务器和备用服务器保持在相同的发行级别。当升级到新的次要发行时,最安全的策略是先更新备用服务器——与从较前次要发行读取 WAL 文件相比,较新的次要发行更有可能能够读取较前次要发行的 WAL 文件。

27.2.2. Standby Server Operation #

如果在启动服务器时服务器中存在 standby.signal 文件,则服务器将进入备用模式。

在备用模式下,服务器不断应用从主服务器接收的 WAL。备用服务器可以从 WAL 存档(见 restore_command)或直接从主服务器通过 TCP 连接(流复制)读取 WAL。备用服务器还将尝试恢复备用集群 pg_wal 目录中发现的任何 WAL。这通常发生在服务器重新启动之后,当时备用数据库再次重放故障转移之前从主数据库串流的 WAL,但是你也可以随时手动将文件复制到 pg_wal 来重放它们。

在启动时,备用服务器首先从档案库位置恢复所有可用的 WAL,并调用 restore_command。一旦到达那里可用的 WAL 的末尾,且 restore_command 失败,它将尝试恢复 pg_wal 目录中找到的任何 WAL。如果失败,并且已配置流复制,则备用服务器将尝试连接到主服务器,并尝试从存档或 pg_wal 中找到的最后一条有效记录开始流式传输 WAL。如果该尝试失败,或者未配置流复制,或者连接稍后断开,备用服务器将返回步骤 1,并尝试再次从存档恢复文件。此从档案库、pg_wal 和通过流复制进行重试的循环将一直持续到服务器停止或被提升。

当运行 pg_ctl promote 或调用 pg_promote() 时,将退出备用模式,服务器将切换到正常操作。在故障转移之前,将恢复档案库或 pg_wal 中立即可用的任何 WAL,但不尝试连接到主服务器。

27.2.3. Preparing the Primary for Standby Servers #

Section 26.3 中所述的在主数据库上设置连续归档到备用数据库可以访问的归档目录。即使主数据库关闭,备用数据库也应该能够访问归档位置,也就是说,它应该驻留在备用服务器本身或另一个受信任的服务器上,而不是主服务器上。

如果您要使用流复制,请在主服务器上设置身份验证,以允许备用服务器的复制连接;即创建角色并在 pg_hba.conf 中提供设置数据库字段为 replication 的适当条目。还要确保在主服务器的配置文件中将 max_wal_senders 设置为足够大的值。如果要使用复制插槽,请确保也将 max_replication_slots 设置得足够高。

按照 Section 26.3.2 中所述进行基本备份以引导备用服务器。

27.2.4. Setting Up a Standby Server #

要设置备用服务器,请恢复从原始服务器获取的 base 备份(参见 Section 26.3.4 )。在备用服务器的集群数据目录中创建一个 standby.signal 文件。将 restore_command 设置为一个简单命令,以从 WAL 存档复制文件。如果您计划使用多个备用服务器来保证高可用性,请确保将 recovery_target_timeline 设置为 latest (默认值),以使备用服务器在故障转移至其他备用服务器时遵循时间表的变化。

Note

如果文件不存在, restore_command 应立即返回;如果需要,服务器将再次重试该命令。

如果你想使用流复制,请使用一个 libpq 连接字符串填充 primary_conninfo,包括主机名(或 IP 地址)和连接到主服务器所需的任何其他详细信息。如果主服务器需要密码进行身份验证,密码也需要在 primary_conninfo 中指定。

如果您出于高可用性目的而设置备用服务器,请像设置主服务器那样设置 WAL 归档、连接和身份验证,因为故障转移后备用服务器将作为主服务器工作。

如果您正在使用 WAL 存档,可以使用 archive_cleanup_command 参数来最小化其大小,以删除备用服务器不再需要的文件。pg_archivecleanup 实用程序专门用于在典型的单备用配置中与 archive_cleanup_command 配合使用,请参见 pg_archivecleanup 。但请注意,如果您将存档用于备份目的,则需要保留至少最新 base 备份所需的文件,即使备用服务器不再需要这些文件。

配置的一个简单示例是:

primary_conninfo = 'host=192.168.1.50 port=5432 user=foo password=foopass options=''-c wal_sender_timeout=5000'''
restore_command = 'cp /path/to/archive/%f %p'
archive_cleanup_command = 'pg_archivecleanup /path/to/archive %r'

可以使用任意数量的备用服务器,但如果使用流复制,请确保在主服务器中设置 max_wal_senders 足够高,以允许它们同时连接。

27.2.5. Streaming Replication #

流复制允许备用服务器比使用基于文件的日志传输更加最新。备用连接到主服务器,它将 WAL 记录流式传输到备用,因为它们被生成,而不等待 WAL 文件被填充。

流复制默认情况下是异步的(见 Section 27.2.8),在这种情况下,在主数据库中提交事务与备用数据库中可见更改之间有一个小的延迟。然而,此延迟远小于基于文件的日志传输,通常在备用数据库足够强大以跟上负载的情况下,小于一秒。使用流复制时,不需要 archive_timeout 来减少数据丢失窗口。

如果您使用流复制而不使用基于文件的连续归档,则服务器可能会在备用接收旧的 WAL 段之前回收旧的 WAL 段。如果发生这种情况,则需要从新的基本备份重新初始化备用。可以通过将 wal_keep_size 设置为足够大的值以确保不会过早回收 WAL 段,或为备用配置复制槽来避免这种情况。如果您设置了备用可访问的 WAL 存档,则不需要这些解决方案,因为如果备用保留足够多的段,则备用始终可以使用存档来追赶。

要使用流复制,请按照 Section 27.2 中所述设置基于文件的日志传输备用服务器。将基于文件的日志传输备用服务器转换为流复制备用服务器的步骤是将 primary_conninfo 设置指向主服务器。在主数据库上设置 listen_addresses 和身份验证选项(见 pg_hba.conf),以便备用服务器可以连接到主服务器上的 replication 伪数据库(见 Section 27.2.5.1)。

在支持保留套接字选项的系统上,设置 tcp_keepalives_idletcp_keepalives_intervaltcp_keepalives_count 有助于主数据库及时发现断开的连接。

设置来自备用服务器的最大并发连接数(有关详细信息,请参见 max_wal_senders)。

当备用启动并且 primary_conninfo 设置正确时,备用将在重播存档中可用的所有 WAL 文件后连接到主服务器。如果成功建立连接,您将在备用中看到 walreceiver,以及主服务器中相应的 walsender 进程。

27.2.5.1. Authentication #

设置复制的访问权限非常重要,只有受信任的用户才能读取 WAL 流,因为从中提取特权信息非常容易。备用服务器必须以具有 REPLICATION 权限或超级用户的帐户向主服务器进行身份验证。建议为复制创建具有 REPLICATIONLOGIN 权限的专用用户帐户。虽然 REPLICATION 权限授予非常高的权限,但它不允许用户修改主系统上的任何数据,而 SUPERUSER 权限则允许。

复制的客户端身份验证由 pg_hba.conf 记录控制,该记录在 database 字段中指定 replication。例如,如果备用在主机 IP 192.168.1.100 上运行,并且复制的帐户名称为 foo,则管理员可以在主服务器上的 pg_hba.conf 文件中添加以下行:

# Allow the user "foo" from host 192.168.1.100 to connect to the primary
# as a replication standby if the user's password is correctly supplied.
#
# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    replication     foo             192.168.1.100/32        md5

主数据库的主机名和端口号、连接用户名和密码在 primary_conninfo 中指定。密码也可以在备用服务器上的 ~/.pgpass 文件中设置(在 database 字段中指定 replication)。例如,如果主数据库在主机 IP 192.168.1.50、端口 5432 上运行,复制的帐户名称是 foo,密码是 foopass,则管理员可以在备用服务器上的 postgresql.conf 文件中添加以下行:

# The standby connects to the primary that is running on host 192.168.1.50
# and port 5432 as the user "foo" whose password is "foopass".
primary_conninfo = 'host=192.168.1.50 port=5432 user=foo password=foopass'

27.2.5.2. Monitoring #

流复制的一个重要健康指标是在主数据库中生成的大量 WAL 记录,但尚未在备用数据库中应用。您可以通过比较主数据库上的当前 WAL 写入位置与备用数据库接收到的最后一个 WAL 位置来计算此滞后。可以使用 pg_current_wal_lsn(在主数据库上)和 pg_last_wal_receive_lsn(在备用数据库上)分别检索这些位置(有关详细信息,请参见 Table 9.91Table 9.92)。备用数据库中的最后一个 WAL 接收位置也显示在 WAL 接收器进程的进程状态中,该状态使用 ps 命令显示(有关详细信息,请参见 Section 28.1)。

您可以通过 pg_stat_replication 视图来检索 WAL 发送器进程的列表。 pg_current_wal_lsn 和视图的 sent_lsn 字段之间较大的差异可能表明原始服务器负载过重,而备用服务器上的 sent_lsnpg_last_wal_receive_lsn 之间的差异可能表明网络延迟或备用服务器负载过重。

在热备用中,可以通过 pg_stat_wal_receiver 视图来检索 WAL 接收器进程的状态。 pg_last_wal_replay_lsn 和视图的 flushed_lsn 之间的较大差异表明接收 WAL 的速度比重放的速度快。

27.2.6. Replication Slots #

复制槽提供了一种自动化方式,以确保主数据库在备用数据库全部接收 WAL 段后才删除 WAL 段,并且即使备用数据库断开连接,主数据库也不会删除可能导致 recovery conflict 的行。

如果没有使用复制槽,可以使用 wal_keep_size 防止删除旧 WAL 段,或者使用 archive_commandarchive_library 将 WAL 段存储在存档中。但是,这些方法通常会导致保留比所需更多的 WAL 段,而复制槽只会保留已知需要的段数。另一方面,复制槽可以保留如此多的 WAL 段,以至于它们填满了为 pg_wal 分配的空间; max_slot_wal_keep_size 限制了复制槽保留的 WAL 文件的大小。

类似地, hot_standby_feedback 本身,如果不使用复制槽,可以防止 vacuum 删除相关行,但在备用数据库未连接的任何时间段内,并不提供任何保护。复制槽克服了这些缺点。

27.2.6.1. Querying and Manipulating Replication Slots #

每个复制槽都有一个名称,该名称可以包含小写字母、数字和下划线字符。

可以在 pg_replication_slots 视图中查看现有的复制槽及其状态。

插槽可以通过流复制协议(见 Section 55.4)或 SQL 函数(见 Section 9.27.6)创建和删除。

27.2.6.2. Configuration Example #

您可以这样创建一个复制槽位:

postgres=# SELECT * FROM pg_create_physical_replication_slot('node_a_slot');
  slot_name  | lsn
-------------+-----
 node_a_slot |

postgres=# SELECT slot_name, slot_type, active FROM pg_replication_slots;
  slot_name  | slot_type | active
-------------+-----------+--------
 node_a_slot | physical  | f
(1 row)

要配置备用使用此槽位,应该在备用上配置 primary_slot_name。这是一个简单的示例:

primary_conninfo = 'host=192.168.1.50 port=5432 user=foo password=foopass'
primary_slot_name = 'node_a_slot'

27.2.7. Cascading Replication #

级联复制功能允许备用服务器接受复制连接并将 WAL 记录流式传输到其他备用服务器,充当一个中继。这可用于减少到主机的直接连接数量,还可以最大程度地减少站点间带宽开销。

既作为接收者又作为发送者的备用称为级联备用。更直接连接到主机的备用称为上游服务器,而更“远”的备用服务器称为下游服务器。级联复制不会对下游服务器的数量或排列施加限制,尽管每个备用只连接到一个上游服务器,而上游服务器最终链接到一个主服务器。

级联备用发送的不仅从主接收的 WAL 记录,还包括从存档恢复的 WAL 记录。因此,即使某些上游连接中的复制连接终止,只要有新的 WAL 记录可用,流复制仍会继续进行下游部分。

级联复制当前是异步的。同步复制(见 Section 27.2.8)设置目前对级联复制没有影响。

热备用反馈向上游传播,不管级联的排列如何。

如果上游备用服务器被提升为新的主机,如果将 recovery_target_timeline 设置为 'latest'(默认值),下游服务器将继续从新主机流式传输。

要使用级联复制,请设置级联备用服务器,以便它可以接受复制连接(即,设置 max_wal_sendershot_standby,并配置 host-based authentication)。您还需要在下游备用服务器中设置 primary_conninfo 以指向级联备用服务器。

27.2.8. Synchronous Replication #

PostgreSQL 流复制默认是异步的。如果主机服务器崩溃,那么提交的一些事务可能没有复制到备用服务器,这会导致数据丢失。数据丢失的量与故障转移时的复制延迟成正比。

同步复制提供了确认事务所做的所有更改已传输到一个或多个同步备用服务器的功能。这扩展了事务提交提供的那一标准级别的持久性。这种保护级别在计算机科学理论中称为 2 安全复制,在将 synchronous_commit 设置为 remote_write 时称为组 1 安全(组安全和 1 安全)。

在请求同步复制时,每次提交写事务都会等待收到确认,表明该提交已同时写入主机和备用服务器磁盘上的预写日志。唯一可能丢失数据的情况是主机和备用同时发生崩溃。虽然这可以提供更高的持久性级别,但前提是 sysadmin 谨慎安置和管理这两台服务器。等待确认会增加用户对服务器崩溃时更改不会丢失的信心,但也一定会增加请求事务的响应时间。最短等待时间是主机和备用之间的往返时间。

只读事务和事务回滚不必等待备用服务器回复。子事务提交不等待备用服务器回复,只等待顶级提交。诸如数据加载或索引构建之类的长时间操作不等待最后的提交消息。所有两阶段提交操作都需要提交等待,包括准备和提交。

同步备用可以是物理复制备用或逻辑复制订阅者。它还可以是任何其他物理或逻辑 WAL 复制流消费者,该消费者知道如何发送适当的反馈消息。除了内置的物理和逻辑复制系统之外,这还包括诸如 pg_receivewalpg_recvlogical 这样的特殊程序以及一些第三方复制系统和自定义程序。有关同步复制支持的详细信息,请查看相应文档。

27.2.8.1. Basic Configuration #

在配置了流复制后,配置同步复制只需要一个额外的配置步骤: synchronous_standby_names 必须设置为非空值。synchronous_commit 也必须设置为 on,但由于这是默认值,通常不需要更改。(请参见 Section 20.5.1Section 20.6.2。)此配置将导致每次提交都需要等待确认备用服务器已将提交记录写入到持久性存储中。synchronous_commit 可以由各个用户设置,因此它可以在配置文件中针对特定用户或数据库进行配置,或者在每个事务的基础上由应用程序动态控制持久性保证。

提交记录写入主机的磁盘后,WAL 记录将发送到备用。除非备用上将 wal_receiver_status_interval 设置为零,否则备用将在每次将新 WAL 数据批量写入磁盘时发送回复消息。如果将 synchronous_commit 设置为 remote_apply,则备用将在重新执行提交记录时发送回复消息,使事务可见。如果根据主服务器上 synchronous_standby_names 的设置将备用选为同步备用,那么将考虑来自该备用的回复消息以及其他同步备用的回复消息,以决定何时释放等待确认提交记录已接收的事务。这些参数允许管理员指定哪些备用服务器应该是同步备用。请注意,同步复制的配置主要在主机上进行。已命名的备用必须直接连接到主机;主机不知道使用级联复制的下游备用服务器。

synchronous_commit 设置为 remote_write 将导致每次提交都等待确认备用 đã收到提交记录并将其写入其自身操作系统,但不是等待将数据刷新到备用上的磁盘。此设置提供的持久性保证弱于 on:备用可能会在操作系统崩溃的情况下丢失数据,但不会在 PostgreSQL 崩溃的情况下丢失数据。但是,在实践中这是一种有用的设置,因为它可以减少事务的响应时间。只有当主机和备用同时崩溃且主机的数据库同时损坏时,才会丢失数据。

synchronous_commit 设置为 remote_apply 将导致每次提交都等待当前同步备用报告它们已重新执行事务,使其对用户查询可见。在简单的情况下,这允许具有因果一致性的负载平衡。

如果请求快速关闭,则用户将停止等待。但是,与使用异步复制一样,在所有未完成 WAL 记录传输到当前连接的备用服务器之前,服务器不会完全关闭。

27.2.8.2. Multiple Synchronous Standbys #

同步复制支持一个或多个同步备用服务器;事务将等待直到被视为同步的所有备用服务器确认收到其数据。事务必须等待从其收到答复的同步备用服务器的数量在 synchronous_standby_names 中指定。此参数还指定备用名称列表以及从已列出的备用名称中选择同步备用的方法 (FIRSTANY)。

方法 FIRST 指定了基于优先级的同步复制,并且使得事务提交等待到它们的 WAL 记录复制到根据其优先级选择的请求的同步备用服务器数量为止。在列表中较早出现名称的备用服务器具有较高优先级,并将被视为同步。稍后出现在此列表中的其他备用服务器表示潜在的同步备用服务器。如果当前任何同步备用服务器由于某种原因断开连接,则它将立即被具有次高优先级的备用服务器取代。

基于优先级的多个同步备用服务器的 synchronous_standby_names 示例如下:

synchronous_standby_names = 'FIRST 2 (s1, s2, s3)'

在此示例中,如果四个备用服务器 s1s2s3s4 正在运行,则两个备用服务器 s1s2 将被选为同步备用服务器,因为它们的名称出现在备用名称列表中较早的位置。s3 是一个潜在的同步备用服务器,当 s1s2 出现故障时,它将接管同步备用服务器的角色。s4 是一个异步备用服务器,因为其名称不在列表中。

方法 ANY 指定了基于法定的同步复制,并且使得事务提交等待到它们的 WAL 记录复制到请求的 @{17} 列表中的同步备用服务器数量为止。

基于法定的多个同步备用服务器的 synchronous_standby_names 示例如下:

synchronous_standby_names = 'ANY 2 (s1, s2, s3)'

在此示例中,如果四个备用服务器 s1s2s3s4 正在运行,则事务提交将等待来自 s1s2s3 的任何两个备用服务器的答复。s4 是一个异步备用服务器,因为其名称不在列表中。

可以使用 pg_stat_replication 视图查看备用服务器的同步状态。

27.2.8.3. Planning for Performance #

同步复制通常需要仔细计划并放置备用服务器,以确保应用程序性能可以接受。等待不会利用系统资源,但事务锁将继续保持,直到传输得到确认。因此,不谨慎地使用同步复制会因增加响应时间和更高的争用而降低数据库应用程序的性能。

PostgreSQL 允许应用程序开发人员通过复制指定所需的持久性级别。这可针对整个系统指定,尽管也可以针对特定用户或连接,甚至是单个事务指定。

例如,应用程序工作负载可能包括:10% 的更改是重要的客户详细数据,而 90% 的更改是不太重要的数据,如果丢失,业务可以更轻松地应对,例如用户之间的聊天消息。

通过在应用程序级别(在主服务器上)指定的同步复制选项,我们可以为最重要的更改提供同步复制,而不会减慢全部工作负载的大部分。应用程序级别选项是允许高性能应用程序获得同步复制优势的重要且实用的工具。

您应该考虑到网络带宽必须高于 WAL 数据生成速率。

27.2.8.4. Planning for High Availability #

synchronous_commit 设置为 onremote_applyremote_write 时,synchronous_standby_names 指定事务提交将等待其答复的同步备用服务器的数量和名称。如果任何同步备用服务器发生崩溃,则此类事务提交可能永远无法完成。

实现高可用性的最佳解决方案是确保您保持尽可能多的请求同步备用服务器。这可以通过使用 synchronous_standby_names 命名多个潜在同步备用服务器来实现。

在基于优先级的同步复制中,名称出现在列表中较早位置的备用服务器将用作同步备用服务器。这些备用服务器之后列出的备用服务器将在当前备用之一发生故障时接管同步备用服务器的角色。

在基于法定的同步复制中,出现在列表中的所有备用服务器都将用作同步备用服务器候选。即使其中一个发生故障,其他备用服务器也将继续执行同步备用服务器候选的角色。

当备用服务器首次连接到主服务器时,它仍未正确同步。这被称为 catchup 模式。一旦备用服务器和主服务器之间的滞后第一次达到零,我们将进入实时 streaming 状态。恢复持续时间在备用服务器创建后立即可能很长。如果关闭备用服务器,则恢复时间段将根据备用服务器关闭的时间长度增加。一旦达到 streaming 状态,备用服务器才能够成为同步备用服务器。可以通过 pg_stat_replication 视图查看此状态。

如果在提交等待确认时主数据库重新启动,则主数据库恢复后这些等待的事务将被标记为已完全提交。无法确定所有备用数据库在主数据库崩溃时都收到了所有未处理的 WAL 数据。即使备用数据库上显示一些事务已提交,但它们在主数据库上也可能显示为已提交。我们提供的保证是,在所有同步备用数据库安全收到 WAL 数据之前,应用程序不会收到事务已成功提交的明确确认。

如果您确实无法保留尽可能多的同步备用数据库,那么您应该减少事务提交必须等待响应的同步备用数据库数量 synchronous_standby_names(或将其禁用),并重新加载主服务器上的配置文件。

如果主数据库与其余备用服务器隔离,则应该故障转移到这些其他剩余备用服务器中最好的备用服务器。

如果您需要在事务等待时重新创建备用服务器,请确保在会话中运行命令 pg_backup_start() 和 pg_backup_stop(),其中 synchronous_commit = off,否则这些请求将无限期等待备用服务器出现。

27.2.9. Continuous Archiving in Standby #

在备用服务器中使用连续 WAL 归档时,有两种不同的情况:WAL 归档可以在主数据库和备用数据库之间共享,或者备用数据库可以有自己的 WAL 归档。当备用数据库有自己的 WAL 归档时,将 archive_mode 设置为 always,备用数据库将为其接收的每一段 WAL 调用归档命令,无论它是通过从归档中恢复还是通过流复制。共享归档可以以类似的方式处理,但是 archive_commandarchive_library 必须测试被归档的文件是否已存在,并且现有文件是否具有相同的内容。这要求在 archive_commandarchive_library 中更加小心,因为它必须小心不要用其他内容覆盖现有文件,但在两次归档完全相同的文件时返回成功状态。并且所有这些都必须在没有竞争条件的情况下完成,如果两台服务器尝试同时归档同一个文件。

如果将 archive_mode 设置为 on,则在恢复或备用模式期间不会启用归档器。如果备用服务器已提升,则它将在提升后开始归档,但不会归档它自己未生成的任何 WAL 或时间线历史文件。若要在归档中获得 WAL 文件的完整系列,必须确保在 WAL 到达备用数据库之前对所有 WAL 进行归档。使用基于文件的日志传输时,必然会遇到这种情况,因为备用数据库只能恢复归档中找到的文件,但启用流复制时则不会。当服务器不在恢复模式中时,on 模式和 always 模式之间没有区别。