当查询和复制同时发生时,Postgresql 上的复制会暂停

Ram*_*nan 5 postgresql replication mvcc

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

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

Cra*_*ger 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并停止运行,因此如果这样做,您需要更密切地监视。