postgres:什么是archive_command 以及何时使用它

Joe*_*e J 7 postgresql replication backup archive-log

我有一个主/从 postgresql 配置,其中从属是热备用,用作只读备份。目前,archive_command 设置为“cd”。(我读过的空话)。我的理解是archive_command可以将wal段复制到特定位置;通常我会看到使用 cp 命令将其复制到磁盘其他位置的示例。我将 wal_keep_segments 设置为 256,所以如果我理解正确的话,slave 可能会落后 wal 大约 4GB (16MB * 256) 的变化。这可能是为什么我从来不需要使用 archive_command 的原因,因为我有足够的 wal 段来解决一些滞后问题?

那么可选的 archive_command 的目的是为了保存比 wal_keep_segments 设置更多的 wal 段吗?因此,在我的情况下,数据库目录 (pg_xlog) 中将有 256 个 wal 段,并且 postgres 会在达到限制时自动轮换并清理这些 wal 段。

而且,如果我放置了一个 archive_command,它是否会继续将 wal 段保存到命令将文件复制到的任何位置(并继续添加越来越多的存档 wal 段,除非我添加了自己的清理过程)?这种想法正确吗?

那么,假设我对 archive_command 的理解是正确的,从站如何利用这些 wal 文件?从站是否首先尝试从主数据目录中检索 256 个 wal 文件,然后返回到 recovery_command 以检索早于此的 wal 文件?recovery_command 是在从站上运行还是以某种方式通过主站代理?recovery_command 的许多示例都显示它与 cp 一起使用,所以我不确定文件是如何传输到不同服务器的?

我已经尝试阅读许多关于此的指南,包括以下内容。
我什么时候必须使用 archive_command,什么时候不用 https://www.postgresql.org/docs/current/static/continuous-archiving.html

我对这些概念仍然有点模糊,并试图达到一些清晰度。有人可以澄清我上面的想法是否正确以及为什么我可以使用 archive_command 吗?谢谢阅读。

这是我的配置:

大师:postgresql.conf

listen_addresses = '*' 

wal_level = hot_standby
archive_mode = on 
max_wal_senders = 2
archive_command = 'cd .'
wal_keep_segments = 256 
hot_standby = on
Run Code Online (Sandbox Code Playgroud)

从站:postgresql.conf

listen_addresses = '*' 

wal_level = hot_standby
archive_mode = on 
max_wal_senders = 2
archive_command = 'cd .'
wal_keep_segments = 256 
hot_standby = on
Run Code Online (Sandbox Code Playgroud)

从站:recovery.conf

standby_mode = 'on'
primary_conninfo = 'host=IP-of-master port=5432 user=rep password=****'
trigger_file = '/tmp/postgresql.trigger.5432'
Run Code Online (Sandbox Code Playgroud)

Cra*_*ger 8

在以下archive_command情况下很有用:

  • 您希望在发生灾难(例如意外删除数据库)时从基础备份到某个过去的状态进行时间点恢复。

  • 您正在使用没有复制槽的流式复制。在这种情况下,如果副本落后超过wal_keep_segmentshot_standby_feedback关闭或副本暂时断开连接,则主节点将删除它需要的资源并且它会中断。如果您正在使用 WAL 归档,则副本可以回退到使用它restore_command来获取 WAL 以赶上并恢复。否则,您必须从新的pg_basebackup.