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

26.2. 日志传送后备服务器 #

26.2.1. 规划
26.2.2. 备用服务器操作
26.2.3. 为待机服务器准备主服务器
26.2.4. 设置待机服务器
26.2.5. 流复制
26.2.6. 复制槽
26.2.7. 级联复制
26.2.8. 同步复制
26.2.9. 备用机上的连续归档

连续归档可以被用来创建一个高可用性(HA)集群配置,其中有一个或多个备用服务器随时准备在主服务器失效时接管操作。这种能力被广泛地称为温备日志传送

主服务器和备用服务器一起工作来提供这种能力,但这些服务器只是松散地组织在一起。主服务器在连续归档模式下操作,而每一个备用服务器在连续恢复模式下操作并且持续从主服务器读取 WAL 文件。要启用这种能力不需要对数据库表做任何改动,因此它相对于其他复制方案降低了管理开销。这种配置对主服务器的性能影响也相对较低。

直接从一个数据库服务器移动 WAL 记录到另一台服务器通常被描述为日志传送。PostgreSQL通过一次一文件(WAL 段)的 WAL 记录传输实现了基于文件的日志传送。不管 WAL 文件(16 MB)要被送到一个临近的系统、同一站点的另一个系统或是在地球遥远的另一端的一个系统上,它都可以在任何距离上被简单和便宜地传送。这种技术所需的带宽取决于主服务器的事务率而变化。基于记录的日志传送具有更细的粒度并且能够在网络连接上以流的方式增量传递 WAL 的改变(见第 26.2.5 节)。

需要注意的是日志传送是异步的,即 WAL 记录是在事务提交后才被传送。正因为如此,在一个窗口期内如果主服务器发生灾难性的失效则会导致数据丢失,还没有被传送的事务将会被丢失。基于文件的日志传送中这个数据丢失窗口的尺寸可以通过使用参数archive_timeout进行限制,它可以被设置成低至数秒。但是这样低的设置大体上会增加文件传送所需的带宽。流复制(见第 26.2.5 节)允许更小的数据丢失窗口。

恢复性能足够好,因此备用服务器一旦被激活,通常只需几秒钟就能达到全面可用状态。因此,这被称为温备配置,它提供了高可用性。 从存档的基本备份和回滚来恢复服务器会花费更长时间,因此该技术仅提供灾难恢复解决方案,而不是高可用性。 备用服务器还可以用于只读查询,此时称为热备份服务器。有关更多信息,请参见第 26.4 节

26.2.1. 规划 #

创建主服务器和备用服务器通常是明智的,因此它们可以尽可能相似,至少从数据库服务器的角度来看是这样。特别地,与表空间相关的路径名将被未经修改地传递,因此如果该特性被使用,主、备用服务器必须对表空间具有完全相同的挂载路径。记住如果CREATE TABLESPACE在主服务器上被执行,在命令被执行前,它所需要的任何新挂载点必须在主服务器和所有备用服务器上先创建好。硬件不需要完全相同,但是经验显示,在应用和系统的生命周期内维护两个相同的系统比维护两个不相似的系统更容易。在任何情况下硬件架构必须相同 — 从一个 32 位系统传送到一个 64 位系统将不会工作。

通常,不能在两个运行着不同主版本PostgreSQL的服务器之间传送日志。PostgreSQL 全球开发组的策略是不在次版本升级中改变磁盘格式,因此在主服务器和备用服务器上运行不同次版本将会成功地工作。不过,在这方面并没有提供正式的支持,因此我们建议让主备用服务器上运行的版本尽可能相同。当升级到一个新的次版本时,最安全的策略是先升级备用服务器 — 一个新的次版本发行更可能兼容从前一个次版本读取 WAL 文件。

26.2.2. 备用服务器操作 #

服务器启动时,数据目录中存在 standby.signal 文件,服务器进入备用模式。

在待机模式中,服务器持续地应用从主服务器接收到的 WAL。待机服务器可以从一个 WAL 归档(restore_command)或者通过一个 TCP 连接直接从主服务器(流复制)读取 WAL。待机服务器也将尝试恢复在待机集簇的pg_wal目录中找到的 WAL。那通常在一次服务器重启后发生,那时待机服务器将再次重播在重启之前从主服务器流过来的 WAL,但你也可以在任何时候手动拷贝文件到pg_wal以便让它们被重播。

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

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

26.2.3. 为待机服务器准备主服务器 #

第 25.3 节中所述,在主服务器上设置连续归档到一个待机服务器可访问的归档目录。即使主服务器宕机,该归档位置也应当是待机服务器可访问的,即它应当位于待机服务器本身或者另一个可信赖的服务器,而不是位于主服务器上。

如果你想要使用流复制,在主服务器上设置认证来允许来自待机服务器的复制连接;即创建一个角色并且在pg_hba.conf中提供一个或多个数据库域被设置为replication的项。还要保证在主服务器的配置文件中max_wal_senders被设置为足够大的值。如果要使用复制槽,请确保max_replication_slots也被设置得足够高。

第 25.3.2 节所述取得一个基础备份来引导待机服务器。

26.2.4. 设置待机服务器 #

要建立备用服务器,恢复从主服务器取得的基础备份(第 25.3.5 节)。在备用服务器的集簇数据目录中创建一个文件standby.signal。将restore_command设置为一个从 WAL 归档中复制文件的简单命令。 如果你计划为了高可用性目的建立多个备用服务器,确认recovery_target_timeline被设置为latest (默认)来使得该备用服务器遵循发生在故障转移到另一个备用服务器之后发生的时间线改变。

注意

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

如果你想要使用流复制,在primary_conninfo中填入一个 libpq 连接字符串,其中包括主机名(或 IP 地址)和连接到主服务器所需的任何附加细节。如果主服务器需要一个密码用于认证,密码也应该被指定在primary_conninfo中。

如果你正在为高可用性目的建立备用服务器,像主服务器一样建立 WAL 归档、连接和认证,因为在故障转移后该备用服务器将作为一个主服务器工作。

如果你正在使用一个 WAL 归档,可以使用archive_cleanup_command参数来移除备用服务器不再需要的文件,这样可以最小化 WAL 归档的尺寸。pg_archivecleanup工具被特别设计为在典型单一备用配置下与archive_cleanup_command共同使用,见pg_archivecleanup。不过要注意,如果你正在为备份目的使用归档,有一些文件即使备用服务器不再需要你也需要保留它们,它们被用来从至少最后一个基础备份恢复。

配置的一个简单例子是:

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设置得足够高,这样可以允许它们能同时连接。

26.2.5. 流复制 #

流复制允许一台后备服务器比使用基于文件的日志传送更能保持最新的状态。后备服务器连接到主服务器,主服务器则在 WAL 记录产生时即将它们以流式传送给后备服务器而不必等到 WAL 文件被填充。

默认情况下流复制是异步的(见第 26.2.8 节),在这种情况下主服务器上提交一个事务与该变化在后备服务器上变得可见之间存在短暂的延迟。不过这种延迟比基于文件的日志传送方式中要小得多,在后备服务器的能力足以跟得上负载的前提下延迟通常低于一秒。在流复制中,不需要archive_timeout来缩减数据丢失窗口。

如果你使用流复制而没有基于文件的连续归档,该服务器可能在后备机收到 WAL 段之前回收这些旧的 WAL 段。如果发生这种情况,后备机将需要重新从一个新的基础备份初始化。通过设置wal_keep_size为一个足够高的值来确保旧的 WAL 段不会被太早重用,或者为后备机配置一个复制槽,可以避免发生这种情况。如果设置了一个后备机可以访问的 WAL 归档,就不需要这些解决方案,因为该归档可以为后备机保留足够的段,后备机总是可以使用该归档来追赶主控机。

要使用流复制,按第 26.2 节所述建立一个基于文件的日志传送后备服务器。将一个基于文件日志传送后备服务器转变成流复制后备服务器的步骤是把primary_conninfo设置为指向主服务器。设置主服务器上的listen_addresses和认证选项(见pg_hba.conf),这样后备服务器可以连接到主服务器上的伪数据库replication(见第 26.2.5.1 节)。

在支持 keepalive 套接字选项的系统上,设置tcp_keepalives_idletcp_keepalives_intervaltcp_keepalives_count有助于主服务器迅速注意到一个断开的连接。

设置来自后备服务器的并发连接的最大数目(详见max_wal_senders)。

当后备服务器被启动并且primary_conninfo被正确设置,后备服务器将在重放完归档中所有可用的 WAL 文件之后连接到主服务器。如果连接被成功建立,你将在后备服务器中看到一个walreceiver,并且在主服务器中有一个相应的walsender进程。

26.2.5.1. 认证 #

设置好用于复制的访问权限非常重要,这样只有受信的用户可以读取 WAL 流,因为很容易从 WAL 流中抽取出需要特权才能访问的信息。 后备服务器必须作为一个具有REPLICATION特权的账户或一个超级用户来向主服务器认证。 推荐为复制创建一个专用的具有REPLICATIONLOGIN特权的用户账户。 虽然REPLICATION特权给出了非常高的权限,但它不允许用户修改主系统上的任何数据,而SUPERUSER特权则可以。

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

# 允许用户 "foo" 从主机 192.168.1.100 连接到主服务器
# 作为复制备用,如果正确提供用户的密码。
#
# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    replication     foo             192.168.1.100/32        scram-sha-256

主服务器的主机名和端口号、连接用户名和密码在primary_conninfo中指定。在后备服务器上还可以在~/.pgpass文件中设置密码(在database字段中指定replication)。例如,如果主服务器运行在主机 IP 192.168.1.50、端口5432上,并且密码为foopass,管理员可以在后备服务器的postgresql.conf文件中增加下列行:

# 后备机要连接到的主控机运行在主机 192.168.1.50 上,
# 端口号是 5432,连接所用的用户名是 "foo",密码是 "foopass"。
primary_conninfo = 'host=192.168.1.50 port=5432 user=foo password=foopass'

26.2.5.2. 监控 #

流复制的一个重要健康指标是在主服务器上产生但还没有在后备服务器上应用的 WAL 记录数。你可以通过比较主服务器上的当前 WAL 写位置和后备服务器接收到的最后一个 WAL 位置来计算这个滞后量。这些位置分别可以用主服务器上的pg_current_wal_lsn和后备服务器上的pg_last_wal_receive_lsn来检索(详见表 9.97表 9.98)。后备服务器的最后 WAL 接收位置也被显示在 WAL 接收者进程的进程状态中,即使用ps命令显示的状态(详见第 27.1 节)。

你可以通过pg_stat_replication视图检索 WAL 发送者进程的列表。 pg_current_wal_lsnsent_lsn字段之间的巨大差异可能表示主服务器承受着巨大的负载,而sent_lsn和后备服务器上pg_last_wal_receive_lsn之间的差异可能表示网络延迟,或者后备服务器正承受着巨大的负载。

在一台热后备上,WAL接收者进程的状态可以通过 pg_stat_wal_receiver视图检索到。 pg_last_wal_replay_lsn和该视图的flushed_lsn的差异表示WAL的接收速度大于它被重放的速度。

26.2.6. 复制槽 #

复制槽提供了一种自动化的方法,确保主服务器不会删除WAL段,直到所有备机 都已接收这些段,并且主服务器不会删除可能导致 恢复冲突的行,即使备机处于断开状态。

代替使用复制槽,可以通过 wal_keep_size 防止旧 WAL 段被删除, 或者通过使用 archive_commandarchive_library 将这些段存储在归档中。这些方法的一个缺点是它们通常会保留比所需更多的 WAL 段, 而复制槽只保留已知需要的段数。

同样,hot_standby_feedback 本身,如果不同时使用复制槽, 可以防止相关行被真空清理删除,但在备用服务器未连接的任何时间段内不提供保护。

小心

注意复制槽可能导致服务器保留大量WAL段,直到占满为 pg_wal分配的空间。 max_slot_wal_keep_size 可用于限制复制槽保留的 WAL文件大小。

26.2.6.1. 查询和操纵复制槽 #

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

已有的复制槽和它们的状态可以在 pg_replication_slots 视图中查看。

槽可以通过流复制协议(见第 54.4 节) 或者 SQL 函数(见第 9.28.6 节)创建并删除。

26.2.6.2. 配置示例 #

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

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'

26.2.7. 级联复制 #

级联复制特性允许一台后备服务器接收复制连接并将 WAL 记录流式传送给其他后备服务器,充当中继。这可以用来减少对主控机的直接连接数,并且使得站点间的带宽开销最小化。

一台同时扮演接收者和发送者角色的后备服务器被称为级联后备服务器。更直接连接到主控机的后备服务器被称为上游服务器,而那些离得更远的后备服务器被称为下游服务器。级联复制并没有对下游服务器的数量或布置设定限制,尽管每台后备服务器仅连接到一台上游服务器,最终链接到一台主控服务器。

一台级联后备服务器不仅发送从主控机接收到的 WAL 记录,还发送那些从归档中恢复的记录。因此即使某些上游连接中的复制连接被中断,只要还有新的 WAL 记录可用,下游的流复制都会继续下去。

级联复制目前是异步的。同步复制(见第 26.2.8 节)设置当前对级联复制无影响。

热备份反馈向上传播,无论级联排列如何。

如果一台上游后备服务器被提升为新的主控机,且下游服务器的recovery_target_timeline被设置为'latest'(默认),下游服务器将继续从新的主控机进行流复制。

要使用级联复制,需要建立级联后备服务器以接受复制连接(即设置max_wal_sendershot_standby,并配置基于主机的认证)。你还需要在下游后备服务器中设置primary_conninfo指向级联后备服务器。

26.2.8. 同步复制 #

PostgreSQL流复制默认是异步的。如果主服务器崩溃,则某些已提交的事务可能还没有被复制到后备服务器,这会导致数据丢失。数据的丢失量与故障转移时的复制延迟成比例。

同步复制能够保证一个事务的所有修改都能被传送到一台或者多台同步后备服务器。这扩大了由一次事务提交所提供的标准持久化级别。在计算机科学理论中这种保护级别被称为 2-safe 复制。而当synchronous_commit被设置为remote_write时,则是 group-1-safe (group-safe 和 1-safe)。

当请求同步复制时,每个写事务的提交都会等待确认,直到收到已将提交写入主服务器和备用服务器的预写式日志的确认为止。 数据可能丢失的唯一可能性是主服务器和备用服务器同时崩溃。这可以提供更高级别的耐用性,尽管只有在系统管理员谨慎地放置和管理这两台服务器时才能实现。 等待确认可以增加用户对在服务器崩溃时不会丢失更改的信心,但也必然会增加请求事务的响应时间。 最短等待时间是主服务器和备用服务器之间的往返时间。

只读事务和事务回滚不需要等待后备服务器的回复。子事务提交也不需要等待后备服务器的响应,只有顶层提交才需要等待。长时间运行的动作(如数据载入或索引构建)不会等待最后的提交消息。所有两阶段提交动作要求提交等待,包括预备和提交。

同步后备可以是物理复制后备或者是逻辑复制订阅者。它还可以是任何其他物理或者逻辑 WAL 复制流的消费者,它懂得如何发送恰当的反馈消息。除内建的物理和逻辑复制系统之外,还包括pg_receivewalpg_recvlogical之类的特殊程序,以及一些第三方复制系统和定制程序。同步复制支持的细节请查看相应的文档。

26.2.8.1. 基本配置 #

一旦流复制已经被配置,配置同步复制就只需要一个额外的配置步骤:synchronous_standby_names必须被设置为一个非空值。synchronous_commit也必须被设置为on,但由于这是默认值,通常不需要改变(见第 19.5.1 节第 19.6.2 节)。这样的配置将导致每一次提交都等待确认消息,以保证后备服务器已经将提交记录写入到持久化存储中。synchronous_commit可以由个体用户设置,因此它可以在配置文件中配置、可以为特定用户或数据库配置或者由应用动态配置,这样可以在每事务基础上控制持久性保证。

在一个提交记录已经在主服务器上被写入到磁盘后,WAL 记录接着被发送到后备服务器。每次一批新的 WAL 数据被写入到磁盘后,后备服务器会发送回复消息,除非在后备服务器上wal_receiver_status_interval被设置为零。如果synchronous_commit被设置为remote_apply,当提交记录被重放时后备服务器会发送回应消息,这会让该事务变得可见。如果根据主服务器的synchronous_standby_names设置选中该后备服务器作为一个同步后备,将会根据来自该后备服务器和其他同步后备的回应消息来决定何时释放正在等待确认提交记录被收到的事务。这些参数允许管理员指定哪些后备服务器应该是同步后备。注意同步复制的配置主要在主控机上。命名的后备服务器必须直接连接到主控机,主控机对使用级联复制的下游后备服务器一无所知。

synchronous_commit设置为remote_write将导致每次提交都等待后备服务器已经接收提交记录并将其写出到其自身所在的操作系统的确认,但并非等待数据都被刷出到后备服务器上的磁盘。这种设置提供了比on要弱一点的持久性保障:在一次操作系统崩溃事件中后备服务器可能丢失数据,尽管它不是一次PostgreSQL崩溃。不过,在实际中它是一种有用的设置,因为它可以减少事务的响应时间。只有当主服务器和后备服务器都崩溃并且主服务器的数据库同时被损坏的情况下,数据丢失才会发生。

synchronous_commit设置为remote_apply将导致每一次提交都会等待,直到当前的同步后备服务器报告说它们已经重放了该事务,这样就会使该事务对用户查询可见。在简单的情况下,这为带有因果一致性的负载均衡留出了余地。

如果请求一次快速关闭,用户将停止等待。不过,在使用异步复制时,在所有未解决的 WAL 记录被传输到当前连接的后备服务器之前,服务器将不会完全关闭。

26.2.8.2. 多个同步后备服务器 #

同步复制支持一个或多个同步后备服务器;事务将会等待,直到所有同步后备服务器都确认收到了它们的数据为止。事务必须等待其回复的同步后备的数量由synchronous_standby_names指定。这个参数还指定一个后备服务器名称及方法(FIRSTANY)的列表来从列出的后备中选取同步后备。

方法FIRST指定一种基于优先的同步复制并且让事务提交等待,直到它们的WAL记录被复制到基于优先级选中的所要求数量的同步后备上为止。在列表中出现较早的后备被给予较高的优先级,并且将被考虑为同步后备。其他在这个列表中位置靠后的后备服务器表示可能的同步后备。如果任何当前的同步后备由于任何原因断开连接,它将立刻被下一个最高优先级的后备所替代。

基于优先的多同步后备的synchronous_standby_names示例为:

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

在这个例子中,如果有四个后备服务器s1s2s3s4在运行,两个后备服务器s1s2将被选中为同步后备,因为它们出现在后备服务器名称列表的前部。s3是一个潜在的同步后备,当s1s2中的任何一个失效,它就会取而代之。s4则是一个异步后备,因为它的名字不在列表中。

方法ANY指定一种基于规定数量的同步复制并且让事务提交等待,直到它们的WAL记录至少被复制到列表中所要求数量的同步后备上为止。

synchronous_standby_names的基于规定数量的多同步后备的例子:

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

在这个例子中,如果有四台后备服务器s1s2s3以及s4正在运行,事务提交将会等待来自至少其中任意两台后备服务器的回复。s4是一台异步后备,因为它的名字不在该列表中。

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

26.2.8.3. 性能规划 #

同步复制通常要求仔细规划和放置后备服务器来确保应用程序的性能令人满意。等待并不利用系统资源,但事务锁会持续保持直到传输被确认。因此,不谨慎使用同步复制将由于响应时间增加和更高的争用而降低数据库应用的性能。

PostgreSQL允许应用开发者通过复制来指定所要求的持久性级别。这可以为整个系统指定,不过它也可以为特定的用户或连接,甚至单个事务指定。

例如,一个应用的工作负载可能由以下组成:10%的更改是重要的客户详情,而90%的更改是相对不重要的数据,即使丢失也能让业务更容易承受,例如用户间的聊天消息。

通过在应用级别(在主服务器上)指定的同步复制选项,我们可以为最重要的更改提供同步复制,而不会拖慢大部分的整体工作负载。应用级别选项是使高性能应用享受同步复制的一个重要和实用的工具。

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

26.2.8.4. 高可用性规划 #

synchronous_standby_names指定了在synchronous_commit设置为onremote_applyremote_write时,事务提交时等待响应的同步备用的数量和名称。 如果任何一个同步备用发生崩溃,这样的事务提交可能永远无法完成。

高可用的最佳方案是确保有所要求数量的同步备用。这可以通过使用synchronous_standby_names指定多个潜在同步备用来实现。

在基于优先的同步复制中,出现在该列表前部的同步备用将被用作同步备用。后面的同步备用将在当前同步备用失效时取而代之。

在基于法定人数的同步复制中,所有出现在该列表中的同步备用都将被用作同步备用的候选。即使其中的一个失效,其他同步备用仍将继续担任候选同步备用的角色。

当一台后备服务器第一次附加到主服务器时,它将处于一种还没有正确同步的状态。这被描述为追赶模式。一旦后备服务器和主服务器之间的延迟第一次变成零,我们就来到了实时的流式状态。在后备服务器被创建之后的很长一段时间内可能都是追赶模式。如果后备服务器被关闭,则追赶周期将被增加,增加量由后备服务器被关闭的时间长度决定。只有当后备服务器到达流式状态后,它才能成为一台同步备用。这种状态可以使用pg_stat_replication视图查看。

如果在提交正在等待确认时主服务器重启,那些正在等待的事务将在主数据库恢复时被标记为完全提交。没有办法确认所有后备服务器已经收到了在主服务器崩溃时所有未处理的 WAL 数据。某些事务可能不会在后备服务器上显示为已提交,即使它们在主服务器上显示为已提交。我们提供的保证是:在 WAL 数据已经被所有同步备用安全地收到之前,应用将不会收到一个事务成功提交的显式确认。

如果实在无法保持所要求数量的同步备用,那么应该减少synchronous_standby_names中指定的事务提交应该等待其回应的同步备用的数量(或者禁用),并且在主服务器上重载配置文件。

如果主服务器与剩下的同步备用服务器是隔离的,你应当故障转移到那些其他剩余同步备用中的最佳候选者上。

如果您需要在事务等待时重新创建备用服务器,请确保在会话中运行函数 pg_backup_start()pg_backup_stop(), 并且 synchronous_commit 设置为 off,否则这些请求将永远等待备用服务器出现。

26.2.9. 备用机上的连续归档 #

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

如果archive_mode被设置为on,归档器在恢复或者备用模式中无法启用。 如果备用服务器被提升,它将在被提升后开始归档,但是它将不会归档任何不是它自身产生的WAL或时间线历史文件。 要在归档中得到完整的一系列WAL文件,您必须确保所有WAL在到达备用机之前都被归档。 对于基于文件的日志传输来说天然就是这样,因为备用机只能恢复在归档中找到的文件,而启用了流复制时则不是这样。 当一台服务器不在恢复模式中时,在onalways模式之间没有差别。