【问题标题】:Pgpool master-slave replication with load balancing - prepared statement "S_380" does not exist具有负载平衡的 Pgpool 主从复制 - 准备好的语句“S_380”不存在
【发布时间】:2017-10-09 07:22:50
【问题描述】:

我们正在使用 pgpool 以主从模式运行 2 个 postgresql 服务器,并具有负载平衡。

有时(不一致,其他时候工作正常),我在应用程序日志中看到此异常 -

09-10-17 01:35:01:627 - {ERROR} util.JDBCExceptionReporter 线程[https-jsse-nio-8443-exec-3];错误:无法在只读事务中执行更新

这是对应用服务器调用的 write psql 函数的调用。没有看到其他 write 语句有任何问题,只有这个。

不知道是不是pgpool的问题。

【问题讨论】:

    标签: postgresql jpa database-replication master-slave pgpool


    【解决方案1】:

    您需要告诉 Pgpool-II SELECT 语句中写入函数的使用。

    原因是在主从模式下启用负载均衡时,Pgpool 将写查询发送到 MASTER 数据库,并对读查询进行负载均衡。更具体地说,诸如 DELETE、INSERT、UPDATE 之类的语句被路由到 Master,而 SELECT 得到负载平衡。现在的问题是,当 SELECT 语句使用 write 函数时,Pgpool 仍然认为该语句是只读的并对其进行负载平衡。因为它没有函数定义的可见性。 所以简而言之,Pgpool-II 需要知道 SELECT 语句中可以写入数据库的函数的用法,以确保这样的 SELECT 不应该是负载平衡的。

    为此,您有两种选择。

    1. 使用 Pgpool 的 black_function_list 或 whitle_function_list 配置。 http://www.pgpool.net/docs/latest/en/html/runtime-config-load-balancing.html

    2. 对包含 write 的查询使用 /*NO LOAD BALANCE*/ 前缀 功能。

    /*NO LOAD BALANCE*/ SELECT my_writing_function();
    

    但后者需要修改现有应用程序的 SQL 语句,这使得它不是一个非常可行的选择。

    【讨论】:

    • 这救了我的命,谢谢。
    【解决方案2】:

    我找到了原因,这是一个更新数据库的 psql 函数,这些函数应该包含在 pgpool 配置中的 black_function_list 中。

    【讨论】:

      【解决方案3】:

      在 pgpool 配置中的 black_function_list 参数中添加写函数名列表。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-12-31
        • 1970-01-01
        • 1970-01-01
        • 2014-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多