我有两个AWS RDS postgres节点支持EC2上的并行模式pgpool设置。 使用pgbench填充testing表后,我从testing查询中得到奇怪的行为。 任何使用函数的查询都会产生主题行中提到的错误,而其他查询则按预期工作。 三个例子显示成功,预期失败和意外失败:
成功 – 产生预期的logging集:
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上,所以需要md5authentication。 在非function查询的情况下,身份validation看起来工作正常,可以通过用不正确的密码replace上面的正确密码来看到。
预期的身份validation失败:
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()这样的函数放到查询中,我得到了身份validation问题:
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.
从最后一个查询中可以看出,密码是在连接string中提供的(无论如何都是前面的),并且它是正确的密码,如第一个查询所示。
为什么我的第一个查询没有authentication问题,但第三个失败? 我忽略了某个地方的设置吗?
编辑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的debugging并查看日志,我发现查询被重写为以下内容,在调用dblink时,它不包含原始连接string中指定的密码:
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 )
这可能是因为pgpool将此查询视为只读,但由于它实际上正在调用一个函数(可能包含INSERT UPDATE或DELETE语句),因此在连接到只读服务器时会中断该查询。
Citus(pgShard)应该与标准的Amazon RDS实例一起工作。 它虽然有捕获。 如果您使用开放源码版本,您将会遇到单点故障。 它的协调节点不重复。
你可以得到完全HA无缝的故障转移版本,但你必须购买企业许可证,但它是疯狂的昂贵。 每年很容易花费你5万到10万美元甚至更多。
而且他们现在真的推动他们的云版本,这是更加昂贵的。
还有Postgres-XL,但它也没有故障转移。 如果你失去了任何节点,你会失去一切。