4

Postgress 遵循 MVCC 规则。因此,在表上运行的任何查询都不会与表上发生的写入冲突。查询根据运行查询时的快照返回结果。

现在我有一个主人和奴隶。分析人员使用从站来运行查询和执行分析。当从服务器正在复制并且分析师同时运行他们的查询时,我可以看到复制滞后很长时间。如果查询长时间运行,则复制滞后很长时间,如果主服务器上的写入次数恰好是相当高,然后我最终会丢失 WAL 文件,并且复制可以再继续进行。我只需要启动另一个奴隶。为什么会这样?我如何允许查询和复制在姿势上同时发生?我可以应用任何参数设置来实现这一点吗?

4

1 回答 1

2

副本无法从主服务器应用更多的 WAL,因为主服务器可能已经覆盖了运行在副本上的查询仍然需要的数据块,这些数据块比主服务器上仍在运行的任何查询都旧。副本需要比主版本更旧的行版本。正是因为MVCC,这个暂停是必要的。

您可能设置一个高max_standby_streaming_delay以避免“由于与恢复冲突而取消语句”错误

如果您打开hot_standby_feedback,副本可以改为告诉主服务器保留这些行。但是主服务器无法有效地清理可用空间,pg_xlog如果备用服务器太落后,它可能会耗尽空间。

请参阅PostgreSQL 手册:处理查询冲突

至于 WAL 保留部分:启用 WAL 归档并restore_command为您的备用服务器启用。无论如何,您确实应该使用它来进行时间点恢复。PgBarman 现在使用该barman get-wal命令使这变得容易。如果您不希望 WAL 归档,您可以改为将副本服务器设置为使用复制槽连接到主服务器,以便主服务器知道无限期地保留他们需要的 WAL。当然,这可能会导致主服务器空间不足pg_xlog并停止运行,因此如果您这样做,您需要更密切地监控。

于 2016-05-06T09:11:28.950 回答