gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 11:49:46 25 4
gpt4 key购买 nike

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

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

最佳答案

副本无法从主服务器应用更多 WAL,因为主服务器可能已经覆盖了在副本上运行的查询仍然需要的数据 block ,这些数据 block 比仍在主服务器上运行的任何数据 block 更旧。副本需要比主版本更旧的行版本。正是因为 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。当然,这可能会导致 master 耗尽 pg_xlog 中的空间并停止运行,因此如果这样做,您需要更密切地监控。

关于postgresql - 当查询和复制同时发生时,Postgresql 上的复制暂停,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37062636/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com