在从属服务器上发布热备用和长时间运行的查询



问题:在热备用模式下在从属服务器上应用 WAL 更新(从属角色作为报告数据库服务器(时,是否可以运行长时间运行的查询 (30s+(?它现在的工作方式是,要么设置下面的参数来终止长时间运行的查询,以便可以应用 WAL 更新,要么无限期延迟 WAL 更新,直到没有查询运行来应用它们。我们可以两者兼而有之吗?同时应用长时间运行的查询和 WAL 更新?

案例实现:我们目前使用热备用模式将任何更改从一个主设备同步到一个从设备。从属角色是作为报表数据库服务器,查询持续并发运行(有些以毫秒为单位,有些以秒为单位,一些在几分钟内。在从站上运行没有活动查询的间隙是非常罕见的。

我们调整了这两个参数,以允许在热备用数据库上进行长时间查询:

max_standby_archive_delay = -1  # max delay before canceling queries
max_standby_streaming_delay = -1  # max delay before canceling queries

在postgres邮件列表中查看类似于我们的存档邮件问题:

http://www.postgresql.org/message-id/AANLkTinLg+bpzcjzdndsnGGNFC=D1OsVh+hKb85A-s=n@mail.gmail.com

我了解阻止 WAL 更新应用于的概念查询运行时的从属服务器。但是,我认为使用MVCC,从站上的活动查询(长时间运行,30秒+(可以运行读取从一个版本/快照,同时应用 WAL 更新,因此后续查询将在该 WAL 事务承诺。我还没有完全消化PostgreSQL中使用的MVCC模型。https://devcenter.heroku.com/articles/postgresql-concurrency,所以这是只是我的假设 - 即使一个表在WAL 更新,当前正在运行的查询应该仍然有效,因为它使用的是要查询的表的版本/快照?

总结:无论如何(即使使用第三方扩展(我们是否可以同步从属从主控服务器,并将来自主控服务器的这些更新应用于立即从属,同时让任何执行时间的查询继续运行直到他们在备用/从属上完成?如果热备用无法做到这一点,对于这种情况,您会推荐什么?我们的场景是,我们是使用持续并发运行的查询命中 Postgres(一些在毫秒,有些在几秒钟内,有些在几分钟内,(几乎没有时间进行 WAL要应用的更新。我们用过布卡多,但这不是一个好事在这种情况下的选择,因为我们需要超过200 +表同步,包括视图以及 40+ 其他数据库,除了我们的主数据库数据库。

任何帮助将不胜感激。

谢谢!

感谢纪尧姆的回答,但幸运的是,从PostgreSQL 9.1开始,PostgreSQL有hot_standby_feedback选项(你在postgresql.conf的备用服务器上设置了这个选项(,它不会杀死长时间运行的查询,并允许对备用服务器进行WAL更新。这个答案归功于PostgreSQL邮件列表中的三个人(Raja/Albe/Scott(,他们在那个邮件线程中帮助了我。希望这对在stackoverflow上搜索此答案的人有所帮助。电子邮件线程可以在这里找到:

http://www.postgresql.org/message-id/D274E3C1.1113E8%awilliams@dresourcesgroup.com

http://www.postgresql.org/docs/9.1/static/hot-standby.html

摘录:

如果发现备用查询取消次数不可接受,则存在补救可能性。第一个选项是设置参数 hot_standby_feedback ,这可以防止VACUUM删除最近失效的行,因此不会发生清理冲突。如果这样做,则应注意,这将延迟主服务器上死行的清理,这可能会导致不希望的表膨胀。但是,清理情况不会比直接在主服务器上运行备用查询更糟糕,并且您仍然可以获得将执行卸载到备用服务器的好处。 在这种情况下,max_standby_archive_delay必须保持较大,因为延迟的 WAL 文件可能已经包含与所需备用查询冲突的条目。

解决方案实施

以下是应在备用服务器上配置postgresql.conf的内容:

max_standby_archive_delay = -1
max_standby_streaming_delay = -1
hot_standby_feedback = on

PostgreSQL是一个非常好的数据库引擎,因为大多数查询都不会锁定表。在内部,它在你的表中的每一行都有一个修订系统,这意味着它可以在你的其他读取事务期间继续写入 WAL。

日志也非常抗延迟,除非您有大量流量,否则它总是会在某个时候赶上。

只要确保不使用锁定命令,你就会没事的。

最新更新