Bitnami PostgreSQL HA通过PgPool II创库时出现会话上下文获取失败错误
问题描述
在Kubernetes集群中部署Bitnami的PostgreSQL HA Helm Chart并完成配置后,使用PgPool II的连接字符串从.NET应用创建数据库时,出现PID XXX Unable to get session context错误。
应用逻辑为先创建不存在的数据库,再执行数据迁移,相关测试结果:
- 手动创建数据库后,应用可正常完成迁移,证明连接字符串无误;
- 跳过PgPool直接连接PostgreSQL服务器时,应用也能正常创建并迁移数据库;
- 所有操作均使用超级用户。
pg_hba.conf 配置
host all repmgr 0.0.0.0/0 trust host repmgr repmgr 0.0.0.0/0 trust host repmgr repmgr ::/0 trust host replication repmgr 0.0.0.0/0 trust host replication repmgr ::/0 trust #hostssl all all 0.0.0.0/0 cert #hostssl all all ::/0 cert host all all 0.0.0.0/0 trust host all all ::/0 trust local all all trust
pool_hba.conf 配置
local all all trust host all repmgr all trust host all aio all scram-sha-256 host all wide all trust host all pop_user all trust host all all all scram-sha-256
请问通过PgPool连接时,是否需要修改代码以获取会话上下文?
解决方案分析
不需要修改代码,这个错误是PgPool II的配置问题导致的,核心原因是创建数据库的DDL操作必须在主节点执行,而PgPool默认的负载均衡策略可能将请求分发到了从节点,或是缺少路由规则让PgPool识别这类需主节点处理的操作。
具体解决步骤:
- 确认PgPool能正确识别主节点:检查
pool.conf中的主节点检测配置(如sr_check_user、sr_check_password)是否正确配置,确保PgPool可自动识别当前主库。 - 添加SQL路由规则:在
pool.conf中配置规则,将创建数据库的语句强制路由到主节点:# 匹配CREATE DATABASE语句,路由至主节点 backend_clustering_rule_list = 'CREATE DATABASE:*:primary' - 检查超级用户的PgPool认证规则:确保你使用的超级用户在
pool_hba.conf中拥有正确的访问权限,当前配置最后一行是host all all all scram-sha-256,如果超级用户是postgres,可单独添加信任规则简化认证:host all postgres all trust - 验证会话上下文相关配置:确认
pool.conf中enable_pool_hba = on,且store_session等会话上下文存储配置处于启用状态(默认已开启)。
跳过PgPool直接连主库能成功的测试结果,也验证了问题出在PgPool的路由配置上,调整上述配置后即可解决错误,无需修改应用代码。
内容的提问来源于stack exchange,提问作者Dardan Lubishtani
相关产品推荐
相关产品推荐

