查询PgPool II并命令show pool_nodes不工作



我有一个网络核心应用程序,它通过PgPool II集群连接到PostgreSQL服务器。它工作得很好,当我尝试使用pgpool-sql命令时,比如"显示池节点";,这些命令似乎经过了pgpool,而是进入了一个PostgreSQL服务器,该服务器会抛出一个错误(应该是这样(。

似乎Npgsql使用了";"扩展查询协议";它们不适用于pgpool-sql命令。他们需要";简单查询协议";。

有什么方法可以使用";"简单查询协议";使用Npgsql?如果没有,有没有其他方法可以在不使用Npgsql的情况下使用net core发送PostgreSQL查询?

不,目前还没有办法通过PostgreSQL简单协议发送用户指定的查询。Npgsql对一些内部命令(例如COMMIT(使用简单协议,但面向用户的查询API总是使用扩展协议。

我想向PgPool II提出这个问题,看起来他们也应该拦截扩展协议消息——毕竟这是标准PostgreSQL协议的一部分(请在这里发布问题链接(。如果由于某种原因确实不可能,您可以在Npgsql repo上打开一个问题,添加一些API来生成简单的查询。

我用一个变通方法解决了这个问题。

从net核心代码中,我调用psql命令应用程序,并让它处理对pgpool集群的请求。这不是我想要的好的解决方案,但它很有效。

我也想查询pool_nodes,截至2023年,这个问题仍然存在。此外,文件也很稀少。这就是我最终解决问题的方法:

在通过NpgSQL查询的数据库上运行以下操作:

CREATE EXTENSION postgres_fdw;
CREATE SERVER ds1 FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host 'localhost');
CREATE USER MAPPING FOR localuserhere SERVER ds1 OPTIONS (USER 'pcpuserhere', PASSWORD 'pcppasswordhere');
CREATE EXTENSION pgpool_adm;
  • ds1:将要查询的服务器的名称。你可以用任何东西
  • localhost:更改是否通过IP/主机名连接
  • localuserhere:这是您在其他Npgsql查询中使用的普通用户
  • pcpuserhere:您的pcp用户
  • pcppasswordhere:您的pcp密码

您现在应该能够通过Npgsql使用此查询来获得类似于show pool_nodes:中的一行的node_info状态

SELECT * FROM public.pcp_node_info(0,'ds1');
  • 0:您的节点索引(0,1,2等(
  • ds1:您为服务器输入的名称

然而,在我的情况下,上面的查询返回了一个错误:

Returned row contains 11 attributes, but query expects 4.

可能是因为pgpool2/pgpool_adm的版本不匹配?

所以我不得不创建这个函数:

CREATE OR REPLACE FUNCTION public.my_node_info(node_id integer, pcp_server text, 
OUT host text, 
OUT port integer, 
OUT status text,
OUT pg_status TEXT,
OUT lb_weight REAL,
OUT status_role TEXT,
OUT pg_role TEXT,
OUT replication_delay bigint,
OUT replication_state TEXT,
OUT sync_replication_state TEXT,
OUT last_status_change timestamp
)
RETURNS record
LANGUAGE c
STRICT
AS '$libdir/pgpool_adm', $function$_pcp_node_info$function$
;

所以现在我可以运行:

SELECT * FROM public.my_node_info(0,'ds1');

我终于可以通过npgsql查看节点状态了。

以上是针对pgpool 4.2的,在4.4中,相关函数是pgpool_adm_pcp_node_info。也许他们也用不匹配的参数修复了这个错误,没有时间进行测试。

最新更新