• Русский
  • Ошибка ограничения подключений 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, чем разрешено базой данных (превышено значение max_connections в PostgreSQL).

    Поиск и устранение неисправностей

    Проверьте логи развертывания Harbor Core. Убедитесь, что присутствует сообщение об ошибке pq: sorry, too many clients already.

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

    Решение

    У вас есть два варианта изменений — выберите один или оба в зависимости от вашей диагностики.

    Определите, слишком ли низко максимальное значение PG или слишком высок пул подключений Harbor на один Pod для вашего количества реплик, затем отрегулируйте значения. После внесения изменений пиковое количество подключений Harbor должно оставаться ниже лимита PG.

    Вариант 1 — Увеличение возможностей PostgreSQL

    Если значение max_connections в PostgreSQL слишком низкое для вашего масштаба Harbor, увеличьте его на стороне PostgreSQL. Конкретные шаги зависят от способа управления PG и выходят за рамки данной инструкции.

    Вы можете использовать следующую команду для проверки возможностей PostgreSQL и текущего использования:

    -- Показать глобальный верхний предел одновременных подключений, разрешённых этим экземпляром PostgreSQL.
    -- Примечание: эффективный лимит для обычных пользователей ≈ max_connections - superuser_reserved_connections.
    SHOW max_connections;
    
    -- Показать количество подключений, зарезервированных для суперпользователей,
    -- чтобы администраторы могли войти, когда все обычные слоты заняты.
    SHOW superuser_reserved_connections;
    
    -- Подсчитать общее количество текущих открытых подключений к backend во всех базах данных и состояниях
    -- (например, активные, бездействующие, бездействующие в транзакции, autovacuum, репликация).
    SELECT count(*) AS current_connections FROM pg_stat_activity;

    Вариант 2 — Настройка пула базы данных Harbor

    Если Harbor открывает слишком много подключений, уменьшите настройки пула Harbor. Помните:

    • database.maxOpenConns применяется на каждый Pod (каждый экземпляр компонента Harbor); увеличение количества реплик увеличивает общее потенциальное количество подключений.
    • При изменении maxOpenConns проверьте maxIdleConns, чтобы оно оставалось разумным (обычно ≤ maxOpenConns).

    Шаг 1 — Измените CR с новыми значениями

    Замените <NAME> на имя вашего Harbor CR и <NAMESPACE> на 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>
            }
          }
        }
      }'

    Шаг 2 — Проверьте, что настройки применились

    Проверьте, что сгенерированная конфигурация отражает новые значения.

    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"

    Шаг 3 — Проверьте стабильную работу Harbor

    После внесения изменений пиковое количество подключений Harbor должно оставаться ниже лимита PG.