我有两个 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
UPDATE
或DELETE
语句),因此它在连接到只读服务器时会中断。
答案2
Citus(pgShard) 应该可以与标准 Amazon RDS 实例配合使用。但它也存在问题。如果您使用开源版本,您将面临单点故障。它的协调器节点没有重复。
你可以获得一个完全 HA 无缝故障转移版本,但你必须购买企业许可证,但价格非常昂贵。每年很容易花费 50,000 到 100,000 美元甚至更多。
而且他们现在确实在大力推广他们的云版本,其价格更是高得离谱。
还有 Postgres-XL,但它也没有故障转移功能。如果你丢失任何一个节点,你就失去了一切。