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

时间:2016-05-06 01:04:12

标签: postgresql replication mvcc

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

现在我有一个主人和奴隶。分析师使用从属设备来运行查询和执行分析。当从属设备正在复制时,当分析师同时运行查询时,我可以看到复制延迟很长时间。如果查询长时间运行,则复制滞后时间很长,如果主服务器上的写入次数恰好是相当高,然后我最终丢失WAL文件和复制可以更长时间。我只需要旋转另一个奴隶。为什么会这样?如何在姿势上同时允许查询和复制?是否有任何参数设置可以应用于实现此目的?

1 个答案:

答案 0 :(得分:1)

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

您可能设置了一个高max_standby_streaming_delay以避免"canceling statement due to conflict with recovery" errors

如果您打开hot_standby_feedback,副本可以告诉主人保留这些行。但是主人无法有效地清理可用空间,如果备用数据库远远落后,它可能会在pg_xlog中耗尽空间。

请参阅PostgreSQL manual: Handling Query Conflicts

至于WAL保留部分:为您的备用数据库启用WAL归档和restore_command。无论如何,您应该真正使用它,以便进行时间点恢复。 PgBarman现在使用barman get-wal命令轻松实现这一点。如果您不想要WAL归档,则可以将副本服务器设置为使用复制槽连接到主服务器,因此主服务器知道无限期地保留它们所需的WAL。当然,这会导致主人在pg_xlog中空间不足并停止运行,因此如果你这样做,你需要更密切地监控。