PostgreSQL 连接数限制错误

问题描述

Harbor 组件日志(例如 core、jobservice)中出现如下数据库错误:

2025-09-24T06:36:11Z [ERROR] [/lib/http/error.go:54]: {"errors":[{"code":"UNKNOWN","message":"unknown: pq: sorry, too many clients already"}]}
2025-09-24T06:36:11Z [ERROR] [/lib/orm/orm.go:72]: begin transaction failed: pq: sorry, too many clients already
2025-09-24T06:36:11Z [ERROR] [/lib/http/error.go:54]: {"errors":[{"code":"UNKNOWN","message":"unknown: pq: sorry, too many clients already"}]}
2025-09-24T06:36:11Z [ERROR] [/lib/orm/orm.go:72]: begin transaction failed: pq: sorry, too many clients already
2025-09-24T06:36:11Z [WARNING] [/controller/quota/controller.go:334][requestID="9a20e70b-18ba-46b7-9e5a-dfa80a8fc05d"]: unreserve resources {"storage":14872} for project 9437 failed, error: pq: sorry, too many clients already

根本原因

Harbor 打开的并发 PostgreSQL 连接数超过了数据库允许的最大连接数(超过了 PostgreSQL 的 max_connections 配置)。

故障排查

检查 Harbor Core Deployment 的日志,确认是否存在 pq: sorry, too many clients already 错误信息。

kubectl -n <NAMESPACE> logs <RELEASE>-harbor-core-xxxxx

解决方案

您有两条修改路径——根据诊断结果选择其中一条或两条同时执行。

判断是 PostgreSQL 的最大连接数设置过低,还是 Harbor 单 Pod 的连接池设置对于您的副本数来说过高,然后调整相应的值。 调整后,Harbor 的峰值连接数应保持在 PostgreSQL 限制之下。

路径一 - 增加 PostgreSQL 容量

如果 PostgreSQL 的 max_connections 对于您的 Harbor 规模来说过低,请在 PostgreSQL 端增加该值。具体操作步骤取决于您如何管理 PostgreSQL,本文不做详细说明。

您可以使用以下命令检查 PostgreSQL 的容量和当前使用情况:

-- 显示该 PostgreSQL 实例允许的最大并发连接数全局上限。
-- 注意:非超级用户可用的有效连接数约为 max_connections 减去 superuser_reserved_connections。
SHOW max_connections;

-- 显示为超级用户保留的连接数,
-- 以便管理员在所有普通连接槽被占满时仍能登录。
SHOW superuser_reserved_connections;

-- 统计当前所有数据库和状态下(如活动、空闲、事务中空闲、自动清理、复制)的后端连接总数。
SELECT count(*) AS current_connections FROM pg_stat_activity;

路径二 - 调整 Harbor 的数据库连接池

如果 Harbor 打开的连接数过多,请减少 Harbor 的连接池配置。请注意:

  • database.maxOpenConns 是针对每个 Pod(即每个 Harbor 组件实例)生效的;副本数增加会导致总连接数增加。
  • 修改 maxOpenConns 时,请同时检查 maxIdleConns,确保其设置合理(通常不超过 maxOpenConns)。

第一步 - 使用新值更新 CR

<NAME> 替换为您的 Harbor CR 名称,<NAMESPACE> 替换为 Harbor CR 所在命名空间。 将 <MAX_OPEN_CONNS><MAX_IDLE_CONNS> 替换为您期望的数值。

kubectl -n <NAMESPACE> patch harbors.operator.alaudadevops.io <NAME> --type merge \
  -p '{
    "spec": {
      "helmValues": {
        "database": {
          "maxOpenConns": <MAX_OPEN_CONNS>,
          "maxIdleConns": <MAX_IDLE_CONNS>
        }
      }
    }
  }'

第二步 - 验证配置生效

检查渲染后的配置是否反映了新的值。

kubectl -n <NAMESPACE> get cm <RELEASE>-harbor-core -o yaml | \
  egrep 'POSTGRESQL_MAX_(OPEN|IDLE)_CONNS'

输出应类似如下,且值应与您在 patch 命令中指定的相同

  POSTGRESQL_MAX_IDLE_CONNS: "40"
  POSTGRESQL_MAX_OPEN_CONNS: "80"

第三步 - 确认 Harbor 运行正常

调整后,Harbor 的峰值连接数应保持在 PostgreSQL 限制之下。