我有一些PostgreSQL触发器,我想编写哪些使用合理数量的CPU,然后NOTIFY
如果发生了复杂模式。这些触发器由我的应用程序动态创建。 (它调用的函数不一定是动态的;只是传递给触发器的参数。)
是否可以设置PostgreSQL流复制,以便有一个主服务器,我在那里进行所有“正常”写入,以及一组读取副本,我几乎完全连接到读取...但我在哪里还可以创建仅在只读副本上运行的触发器吗?也就是说,这会将触发器的CPU负载从主设备移动到潜在的大量副本。 (我可能会使用pg_temp
来完成this answer所述的功能。)
当我尝试使用例如Amazon RDS读取副本时,任何在只读副本上创建偶数pg_temp.*
函数的尝试都不会因cannot execute CREATE FUNCTION in a read-only transaction
而失败,但可能还有其他一些配置流复制的方法这样可能吗?
答案 0 :(得分:2)
是否可以设置PostgreSQL流复制,以便有一个主服务器,我可以在其中完成所有"正常"写道,和一组读取副本,我几乎完全连接到读取...但我还可以创建仅在只读副本上运行的触发器?
不,不是。流复制在块级别完成。它不知道哪些语句改变了哪些行,在哪里。它也是严格只读的。非常严格 - 即使是短暂的,您也无法执行任何更改系统目录的内容,例如pg_class
或pg_proc
。
你可能想看看Londiste。如果你创建一个触发器然后make it ENABLE REPLICA
它可以触发Londiste从主人那里复制的写入。
BDR project也可用于读取副本。它还不支持下游行写入的触发触发器,但它实现起来很实用,它还没有成为开发优先级。