为PostgreSQL的hot_standby设置wal_keep_segments

6
我遇到了在设置 PostgreSQL 热备份时的麻烦。在运行 pg_basebackup 后尝试启动数据库时,我收到了“FATAL: could not receive data from WAL stream: ERROR: requested WAL segment 00000001000006440000008D has already been removed” 的错误信息(在postgresql.log中)。通过IRC进行了简要讨论后,我理解这个错误可能源于写密集型数据库的 wal_keep_segments 设置过低。
如果可能的话,我该如何计算出适当的 wal_keep_segments 设置?这个设置的可接受值是多少?
我正在使用:
  • Postgresql 9.3
  • Debian 7.6
1个回答

3

wal_keep_segments 可以估算为每分钟在 pg_xlog 目录中新增 WAL 日志段的平均数量,乘以你想要保证安全的时间(单位:分钟)。请注意,当将 wal_level 从其默认值 minimal 更改为 archivehot_standby 后,速率预计会增加。唯一的成本是硬盘空间,默认情况下每个日志段为 16 MB。

通常我使用 2 的幂次方作为值。以每分钟约 1 个日志段的速率计算,256 的值给我大约 4 小时的时间来设置备用系统。

你也可以考虑使用带有 pg_basebackup 的 WAL 流式传输,通过其选项 --xlog-method=stream 来实现。不幸的是,至少截至 2013 年,根据PostgreSQL邮件列表上的一个讨论,仍然建议将 wal_keep_segments 设置为非零值 - 这是为了防止流无法跟上而产生风险。如果您确实使用了 pg_basebackup,也不要忘记使用 --checkpoint=fast


1
您也可以在主服务器上启用WAL归档,并将尽可能多的WAL积压存储到磁盘空间中。WAL归档与活动数据库WAL分离(仅为副本),并且可以具有远超过wal_keep_segments历史持续时间(在较慢、较便宜的磁盘上),为备用服务器提供多天的恢复空间。 - Robert Casey
@RobertCasey 是的,我记得我做过类似的事情。我还使用了 xz 进行压缩。那是太久以前的事了。 - Asclepius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接