pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
pg_standby 支持创建“温备”数据库服务器。它既是可用于生产环境的程序,也是可定制的模板,便于在有需要时进行特定修改。
pg_standby 设计为一个会等待的 restore_command,而把标准归档恢复转变为温备运行 正需要这样的命令。此外还需要其他配置,服务器的主手册中对此均有 介绍(参见 第 24.4 节)。
pg_standby 的特性包括:
用 C 语言编写,因此移植性很好,易于安装
源代码易于修改,并且专门划分出了若干区域,供你按自身需要修改
已在 Linux 和 Windows 上经过测试
要配置备库使用 pg_standby,请将以下内容放入其 recovery.conf 配置文件:
restore_command = 'pg_standby archiveDir %f %p %r'
其中,archiveDir 是恢复 WAL 段文件时所读取的目录。
pg_standby 命令行的完整语法为:
pg_standby [option... ]archivelocationnextwalfilexlogfilepath[restartwalfile]
在 restore_command 中使用时,应为 nextwalfile 和 xlogfilepath 分别 指定 %f 和 %p 宏,以提供恢复所需的 实际文件和路径。
如果指定了 restartwalfile(通常使用 %r 宏),就会从 archivelocation 中删除逻辑上位于该文件之前的所有 WAL 文件。这样既能尽量减少需要保留的文件数量,又能保留崩溃后重启的能力。如果 archivelocation 是专供此备库使用的临时暂存区,就适合使用此参数;但如果 archivelocation 用作长期 WAL 归档区,就不应使用。
pg_standby 假定 archivelocation 是服务器所属用户可读的目录。如果指定了 restartwalfile(或 -k),archivelocation 目录还必须可写。
表 F.23. pg_standby 选项
| 选项 | 默认值 | 描述 |
|---|---|---|
-c |
yes | 使用 cp 或 copy 命令从归档恢复 WAL 文件。 |
-d |
no | 在 stderr 上打印大量调试日志输出。 |
-k numfiles |
0 | 从 archivelocation 中删除文件,使归档中当前文件之前保留的 WAL 文件不超过该数量。零(默认值)表示不从 archivelocation 删除任何文件。如果指定了 restartwalfile,此参数将被静默忽略,因为那种指定方式能更准确地确定正确的归档截断点。从 PostgreSQL 8.3 起,此参数的使用已被弃用;指定 restartwalfile 参数更安全也更高效。设置过小可能导致删除备库重启仍然需要的文件,而设置过大则会浪费归档空间。 |
-r maxretries |
3 | 设置复制命令失败时的最大重试次数。每次失败后,会等待 sleeptime * num_retries,以使等待时间逐步递增。因此默认情况下,会先等待 5 秒、10 秒,再等 15 秒,然后才向备库报告失败。这会被解释为恢复结束,备库将据此完全启动。 |
-s sleeptime |
5 | 设置两次检查待恢复的 WAL 文件是否已出现在归档中之间休眠的秒数(最多 60)。默认设置未必是推荐值;相关讨论请参见 第 24.4 节。 |
-t triggerfile |
none | 指定一个触发文件,其出现应导致故障切换。建议使用结构化的文件名,以避免在同一系统上存在多个服务器时混淆究竟要触发的是哪一个;例如 /tmp/pgsql.trigger.5432。 |
-w maxwaittime |
0 | 设置等待下一个 WAL 文件的最大秒数,超过该时间后将执行快速故障切换。设置为零(默认值)表示无限等待。默认设置未必是推荐值;相关讨论请参见 第 24.4 节。 |
主库发生故障时,切换到“温备”数据库服务器有以下两种方式:
在智能故障切换中,服务器会先应用归档中所有可用的 WAL 文件,再正式启动。即使备库已经落后,这也能做到零数据丢失;但如果尚未应用的 WAL 很多,备库可能需要很长时间才能就绪。要触发智能故障切换,请创建包含单词 smart 的触发文件,或者直接创建一个空的触发文件。
在快速故障切换中,服务器会立即正式启动。归档中所有尚未应用的 WAL 文件都会被忽略,这些文件中的全部事务都会丢失。要触发快速故障切换,请创建触发文件,并在其中写入单词 fast。也可以配置 pg_standby,使其在指定时间间隔内没有出现新 WAL 文件时,自动执行快速故障切换。
在 Linux 或 Unix 系统上,可以这样使用:
archive_command = 'cp %p .../archive/%f' restore_command = 'pg_standby -d -s 2 -t /tmp/pgsql.trigger.5442 .../archive %f %p %r 2>>standby.log' recovery_end_command = 'rm -f /tmp/pgsql.trigger.5442'
这里,归档目录实际位于备库上,因此 archive_command 通过 NFS 访问该目录,但这些文件对备库而言是本地文件(因此可以 使用 ln)。此配置会:
将调试输出写入 standby.log
每隔 2 秒检查一次下一个 WAL 文件是否可用
仅在名为 /tmp/pgsql.trigger.5442 的触发文件出现时 停止等待,并根据其内容执行故障切换
恢复结束时删除触发文件
从归档目录中移除不再需要的文件
在 Windows 上,可以使用:
archive_command = 'copy %p ...\\archive\\%f' restore_command = 'pg_standby -d -s 5 -t C:\pgsql.trigger.5442 ...\archive %f %p %r 2>>standby.log' recovery_end_command = 'del C:\pgsql.trigger.5442'
注意,需要双写反斜杠的是 archive_command,而 无需双写的是 restore_command 或 recovery_end_command。此配置会:
使用 copy 命令从归档恢复 WAL 文件
将调试输出写入 standby.log
每隔 5 秒检查一次下一个 WAL 文件是否可用
仅在名为 C:\pgsql.trigger.5442 的触发文件出现时 停止等待,并根据其内容执行故障切换
恢复结束时删除触发文件
从归档目录中移除不再需要的文件
Windows 上的 copy 命令会在文件复制完成之前设置最终文件大小,这通常会让 pg_standby 产生误判。因此,pg_standby 一旦看到正确的文件大小,还会等待 sleeptime 秒。GNUWin32 的 cp 只有在文件复制完成后才设置文件大小。
由于 Windows 示例在两端都使用 copy,任一服务器或两个服务器都可能通过网络访问归档目录。
pg_standby 设计为与 PostgreSQL 8.2 及更高版本配合使用。
PostgreSQL 8.3 提供了 %r 宏,用于让 pg_standby 知道需要保留的最后一个文件。使用 PostgreSQL 8.2 时,如果需要清理归档,就必须使用 -k 选项。该选项在 8.3 中仍然可用,但已弃用。
PostgreSQL 8.4 提供了 recovery_end_command 选项。如果没有此选项,遗留的 触发文件可能带来危险。
Simon Riggs <simon@2ndquadrant.com>
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。