1

我正在运行启用负载平衡的 pgpool-II,以便它向我集群中的两台服务器发送只读查询。

但是,在某些情况下,我的 CTE 查询包含 UPDATE 命令,但底层查询是 SELECT,因此 pgpool 将其发送到从属服务器并由于只读性质而失败。

例如,此查询查找要显示的匹配项,并将它们标记为同时查看:

WITH matches AS (
    WITH user_liked AS (
          SELECT liked_user_id FROM likes WHERE user_id='x' AND active IS TRUE
    )
    SELECT user_id, liked_user_id, liked_user_viewed, created_ts, matched_ts AS pointer
          FROM likes 
          WHERE 
          user_id IN(SELECT * FROM user_liked) 
          AND 
          active IS TRUE
          AND 
          liked_user_id='x' 
          ORDER BY matched_ts DESC
     ),
     update_liked_user_viewed AS (
          UPDATE likes
          SET liked_user_viewed=TRUE
          WHERE liked_user_id='x' AND user_id IN(SELECT user_id FROM matches)
     )
     SELECT * FROM matches

有什么建议可以让 pgpool 将其识别为写入查询,那么我应该将写入分开吗?

4

1 回答 1

2

显式打开一个读/写事务。

BEGIN TRANSACTION READ WRITE;

告诉 PgPool 事务应该转到 master,或者SET transaction_read_only = off,这是等价的。

我认为 PgPool 支持将语句路由到主节点的注释提示,但在快速扫描文档时没有看到对它的引用。

您的另一个选择是修补 PgPool 以使其查询解析器更智能地识别这样的可写 CTE。

于 2014-01-09T00:03:39.443 回答