pgpool2 并行模式:非超级用户必须在连接字符串中提供密码

pgpool2 并行模式:非超级用户必须在连接字符串中提供密码

我有两个 AWS RDS postgres 节点支持 EC2 上的并行模式 pgpool 设置。使用 pgbench 填充测试表后,我从测试查询中得到奇怪的行为。任何使用函数的查询都会产生主题行中提到的错误,而其他查询则按预期工作。三个示例显示成功、预期失败和意外失败:

成功——产生预期的记录集:

psql -c "SELECT aid FROM pgbench_accounts" "host=localhost port=9999 user=pgpool password=pass dbname=bench_parallel"
# Giant record set is returned here.

由于支持节点位于 RDS 上,因此需要进行 md5 身份验证。在非功能查询的情况下,身份验证似乎工作正常,通过将上面的正确密码替换为错误密码可以看出。

预期身份验证失败:

psql -c "SELECT aid FROM pgbench_accounts" "host=localhost port=9999 user=pgpool password=notmypass dbname=bench_parallel"
psql: FATAL:  password authentication failed for user "pgpool"

以下是令我困惑的部分——如果我将 min() 或 count() 之类的函数放入查询中,我会遇到身份验证问题:

psql -c "SELECT count(aid) FROM pgbench_accounts" "host=localhost port=9999 user=pgpool password=pass dbname=bench_parallel"
ERROR:  password is required
DETAIL:  Non-superusers must provide a password in the connection string.

从最后一个查询可以看出,密码在连接字符串中提供(无论如何,在前端),并且它是第一个查询中显示的正确密码。

为什么我的第一个查询可以正常工作且没有身份验证问题,但第三个查询却失败了?我是否忽略了某个设置?

编辑2014-10-23:添加更多信息。

我在 (前端) 系统数据库上为用户 pgpool 添加了超级用户权限,不再出现Non-superusers must provide a password in the connection string错误。现在我得到:

ERROR:  could not establish connection
DETAIL:  fe_sendauth: no password supplied

打开 pgpool 的调试并查看日志,我看到查询被重写如下,在对 dblink 的调用中,不包含原始连接字符串中指定的密码:

2014-10-23 19:59:10 DEBUG: pid 1643: OneNode_do_command: Query:  SELECT 
    sum(pool_g$0) AS count FROM 
    dblink('host=ip-10-1-2-17 dbname=bench_parallel port=9999 user=pgpool',
    'SELECT pool_parallel("SELECT count(aid) FROM pgbench_accounts")',false) 
    AS pool_t$0g (pool_g$0 bigint )

答案1

这可能是因为 pgpool 将该查询视为只读,但由于它实际上调用了一个函数(可能包含INSERT UPDATEDELETE语句),因此它在连接到只读服务器时会中断。

答案2

Citus(pgShard) 应该可以与标准 Amazon RDS 实例配合使用。但它也存在问题。如果您使用开源版本,您将面临单点故障。它的协调器节点没有重复。

你可以获得一个完全 HA 无缝故障转移版本,但你必须购买企业许可证,但价格非常昂贵。每年很容易花费 50,000 到 100,000 美元甚至更多。

而且他们现在确实在大力推广他们的云版本,其价格更是高得离谱。

https://www.citusdata.com/

还有 Postgres-XL,但它也没有故障转移功能。如果你丢失任何一个节点,你就失去了一切。

相关内容