PRODСуверенная европейская платформа BaaSОткрыть панель управления →

Производительность · 11 минута чтения

PgBouncer против Supavisor против PgCat: какой пул Postgres?

Affane Daylami · Fondateur · 9 июня 2026 г.

Вернуться в блог

PgBouncer, Supavisor и PgCat используют соединения Postgres, но они не решают одну и ту же проблему. PgBouncer остается историческим стандартом: легкий, написанный на C, изначально интегрированный в экосистему Kubernetes через CloudNativePG. Supavisor был создан Supabase для особых нужд — для хранения тысяч баз данных в рамках одного сервиса вместо одного процесса на базу данных. PgCat, написанный на Rust, дополняет классический пул сегментирования и балансировки нагрузки между репликами. В Aurabase трафик плоскости данных проходит через PgBouncer в режиме транзакций. Это непосредственно показано в коде репозитория: диаграмма Helm, ресурс CNPG Pooler и локальная конфигурация k3d — все сходятся к одному и тому же выбору.

Этот текст на английском языке был создан автоматически на основе французского оригинала и еще не проверялся.
Эта страница была переведена автоматически. Английская версия является авторитетной.

В этой статье сравнивается архитектура трех пулов: язык, режимы пула, одно- или многоарендная модель, функции, выходящие за рамки чистого пула. Tembo и PkgPulse опубликовали числовые сравнения этих трех инструментов, но мы сами не воспроизвели ни одного из их измерений. Наша редакционная позиция в отношении тестов, подробно описанная в нашей методологии тестирования , заключается в том, чтобы никогда не публиковать повторно данные, которые мы не проверили сами. Вместо этого вы найдете здесь: фактическую архитектуру каждого инструмента и то, как Aurabase на самом деле маршрутизирует трафик Postgres, проверенный раздел за разделом в исходном коде.

Самое необходимое
  • PgBouncer (C) остается наиболее проверенным пулером и лучше всего интегрирован с Kubernetes: CloudNativePG напрямую использует его для своего ресурса Pooler.
  • Supavisor (Elixir, проект Supabase) решает другую задачу: обслуживает тысячи баз данных из одного сервиса, а не один пулер на каждую базу данных.
  • PgCat (Rust) добавляет к необработанному пулу сегментирование приложений, балансировку нагрузки между репликами и автоматический переход на другой ресурс.
  • В репозитории Aurabase показано, что PgBouncer используется на двух уровнях: совместное развертывание для общего парка и ресурс Pooler, управляемый CloudNativePG для каждого выделенного клиента. Оба работают в режиме транзакций.
  • PostgREST и административный пулaura-db добровольно остаются в прямом соединении с Postgres, минуя пул: объединение в пул транзакций нарушит перезагрузку их схемы и блокировки сеансов.
#
Панорама

Три игрока в пул, три философии

PgBouncer сводит к минимуму, Supavisor создает многопользовательские пулы, PgCat добавляет сетевые функции к необработанному пулу. Ни один из трех не является прямой заменой двух других, хотя их часто сравнивают по терминам на одних и тех же страницах.

ЯзыкCЭликсир (ЛУЧ)Ржавчина
Режимы объединенияСессия, транзакция, заявлениеСессия, транзакцияСессия, транзакция, заявление
Модель арендыОдин целевой кластер на каждый экземпляр, предназначенный для одного клиента.Нативный мультитенант: сервис для многих баз данныхЦелевой кластер, сегментирование по ключу раздела
Помимо объединенияНикаких дополнительных функций, намеренно минимальныйHTTP API администратора, динамическая регистрация арендатораШардинг, балансировка нагрузки и переключение между репликами
Нативная интеграция с KubernetesДа: Пул ресурсов CloudNativePGНа сегодняшний день не задокументировано изначальноНа сегодняшний день не задокументировано изначально
ИсточникИсторический стандарт пула PostgresСоздано Supabase для собственного мультитенантного облака.Родился в Instacart, сегодня поддерживается PostgresML.

Столбцы по порядку: PgBouncer, Supavisor, PgCat. Характеристики архитектуры соответствуют официальным документам каждого проекта и должны быть подтверждены в развертываемой вами версии, экосистема в этом отношении быстро развивается.

#
PgBouncer

Исторический стандарт, легкий и интегрированный в Kubernetes.

PgBouncer делает только одно: пул соединений Postgres без каких-либо дополнительных функций. Эта намеренно узкая область применения во многом объясняет его долговечность и его принятие в качестве основного строительного блока в большинстве стеков Postgres, находящихся в производстве.

Доступны три режима объединения. В режиме сеанса на каждое клиентское соединение открывается одно соединение с сервером, самое разрешающее. Режим транзакции повторно использует соединение сервера между несколькими клиентами, освобождаемое на каждом конце транзакции. Режим операторов идет еще дальше и редко используется в производстве. Именно режим транзакций приносит реальную выгоду от объединения, но он налагает строгие правила. Любое состояние сеанса (переменныеSET, консультативные блокировки, LISTEN/NOTIFY) не сохраняется после транзакции. Мы подробно рассказываем об этих правилах и их подводных камнях в нашей специальной статье о режиме пула транзакций в PgBouncer.

Исторически являющийся однопроцессным экземпляром PgBouncer по умолчанию использует одно ядро ​​ЦП. Запуск нескольких экземпляров за одним и тем же портом (через SO_REUSEPORT) — это более поздняя эволюция проекта, а не первоначальная особенность дизайна. Что касается аутентификации, PgBouncer поддерживает настраиваемую auth_query— функцию SQL, выполняемую при каждом соединении для динамического разрешения пароля роли. Этот механизм позволяет избежать зависимости от статического файла, в котором заранее указан каждый пользователь. Именно этот механизм Aurabase использует для своих ролей в каждом проекте (раздел 05).

Астуце

PgBouncer — это пулер, который CloudNativePG изначально развертывает за своим ресурсом Pooler. В кластере Postgres, управляемом оператором CloudNativePG, активация управляемого пулера на практике эквивалентна активации PgBouncer без его ручной настройки.

#
супервайзер

Облачный многопользовательский пул Supabase

Supavisor решает проблему, для решения которой PgBouncer никогда не предназначался в таком масштабе. Это предполагает обслуживание очень большого количества отдельных баз данных арендаторов с помощью одной службы, а не одного экземпляра пула на каждую базу данных. Написанный на Elixir и выполненный на виртуальной машине Erlang (BEAM), проект разрабатывается и поддерживается Supabase с открытым исходным кодом в собственном репозитории GitHub.

Нативная мультиарендная модель представляет собой настоящее структурное отличие. Если классическому парку PgBouncer требуется один процесс (или набор выделенных подключений) для каждой целевой базы, Supavisor работает по-другому. Он динамически регистрирует клиентов через интерфейс администрирования HTTP и направляет каждое входящее соединение в нужную базу данных без перезапуска службы. Именно по этой причине Supabase перенесла свои собственные облачные проекты с PgBouncer на Supavisor. Классический пуловый кластер, по одному на каждую базу данных, не масштабируется до мультитенантного облака, в котором размещаются сотни тысяч проектов.

У этого архитектурного выбора есть документально подтвержденный недостаток. Паритет функций с PgBouncer в сложных случаях стабилизировался после запуска проекта. Два примера: определенное поведение LISTEN/NOTIFYи точное управление подготовленными операторами в режиме транзакции. Проверьте свою версию перед миграцией, если ваше приложение зависит от этих конкретных вариантов поведения.

#
PgCat

Аутсайдер Rust: встроенное шардинг и балансировка нагрузки

PgCat явно позиционируется как альтернатива PgBouncer, написанная на Rust. Он добавляет сетевые функции к классическому пулу, которые не встроены ни в PgBouncer, ни в Supavisor. В частности, три: сегментирование приложения по ключу раздела, балансировка нагрузки между репликами чтения и автоматический переход на другой ресурс после отказавшей реплики. Проект родился в Instacart, а сегодня его переняла и поддерживает PostgresML.

Конкретно, PgCat может играть роль, которую обычно выполняют два отдельных уровня: средство создания пула соединений и прокси-сервер приложения для маршрутизации между несколькими экземплярами Postgres. Команда, которая уже вручную сегментировала свои данные, может упростить свой код с помощью PgCat. То же самое и с логикой распределения чтения между репликами, разработанной внутри компании: ее непосредственно заменяет выделенный сетевой уровень.

Существует и противоположный компромисс: PgCat — более молодой проект с гораздо меньшей экосистемой документации и обратной связи, чем PgBouncer. Принятие его функций сегментирования и аварийного переключения также означает согласие зависеть от зрелости этого конкретного компонента, а не только от его мощности пула.

#
Проверено в коде

Что показывает код Aurabase: PgBouncer везде, за исключением случаев, когда объединение транзакций нарушает все

Репозиторий Aurabase развертывает PgBouncer на двух отдельных уровнях, оба в режиме транзакций. Для общего парка диаграмма Helm определяет выделенное развертывание PgBouncer перед общей плоскостью данных (deploy/helm/aurabase/templates/infra/pgbouncer.yaml, изображение edoburu/pgbouncer). Для клиента в выделенном экземпляре поставщик создает ресурс Pooler, управляемый CloudNativePG (deploy/cnpg/tenant-pooler.yaml, визуализируемый k8s_tenant.rs). Ни один из них не использует Supavisor или PgCat. Код не документирует явное сравнение, предшествовавшее этому выбору. С другой стороны, он демонстрирует глубокую и уже работающую интеграцию с экосистемой CloudNativePG, что соответствует тому факту, что PgBouncer является встроенным блоком пула.

сделка
РЕЖИМ ОБЪЕДИНЕНИЯ
Общий автопарк и пулер от выделенного арендатора
1000
МАКС. ПОДКЛЮЧЕНИЕ КЛИЕНТА
Потолок одновременного клиента, контрольная диаграмма по умолчанию
80
РАЗМЕР БАССЕЙНА ПО УМОЛЧАНИЮ
Подключения к серверу по (базе, роли), диаграмме Helm по умолчанию

Однако не все проходит через пулер, и это осознанный выбор, задокументированный в самом коде. PostgREST остается подключенным к Postgres в реальном времени, а не через PgBouncer. В комментарии к диаграмме Helm четко указана причина: объединение транзакций нарушит перезагрузку схемы, которая зависит от LISTEN на канале pgrst. Этот механизм несовместим с переработанными серверными соединениями между клиентами. Пул администрированияaura-db (схема, DDL, блокировки рекомендаций сеанса) также остается в прямом соединении по той же основной причине. SET search_path, не относящийся к области транзакций, и блокировки сеансов не сохраняются в пуле режима транзакций.

deploy/helm/aurabase/templates/infra/pgbouncer.yaml (extrait commenté)yaml
# Плоскость данных aura-db: через PgBouncer все ограничивается транзакцией (SET LOCAL)
DATABASE_URL: postgresql://aura_authenticator:...@pgbouncer:5432/aura_db_master

# Администратор пула (DDL, самоанализ): ПРЯМО на Postgres, а не на PgBouncer.
# SET search_path не-LOCAL + блокировки сеанса нарушают пул транзакций
ADMIN_DATABASE_URL: postgresql://aura:...@postgres:5432/aura_db_master

Аутентификация осуществляется по шаблону auth_query, описанному в разделе 02: AUTH_QUERY: SELECT * FROM pgbouncer.user_lookup($1)без статического файла userlist.txt. Это то, что позволяет ролям, динамически создаваемым для каждого проекта (project_<uuid>_authenticator), проходить аутентификацию через PgBouncer без повторного развертывания средства объединения для каждого нового проекта.

Урок эксплуатации, полученный при написании этой статьи

Комментарий проверки работоспособности PgBouncer в локальном Kubernetes документирует реальную, уже исправленную ошибку. Запуск pg_isready против PgBouncer проверяет только подтверждение прокси-сервера, но не фактическое соединение с серверной частью Postgres, которую он ретранслирует. PgBouncer отвечает, «принимая соединения», даже когда серверная часть остановлена, ставя запросы в очередь. Результат, наблюдаемый во время разрушающего теста: служба оставалась healthy в течение 5 циклов подряд, в то время как Postgres был недоступен. Исправление заменяет проверку настоящим сквозным запросом psql через пул, вплоть до серверной части. Результат после исправления, в том же воспроизведенном тесте: unhealthy обнаружен за 7 циклов, примерно 35 секунд.

И последняя деталь, незначительная, но показательная: диаграмма Хелма по умолчанию закрепляет edoburu/pgbouncer:v1.24.1-p1, тогда как локальный стенд k3d использует v1.25.2-p0. Это не архитектурный выбор, а просто небольшое отсутствие синхронизации версий между двумя средами, такие детали, которые проверка кода улавливает быстрее, чем сообщение в блоге. Мы документируем все как есть, а не приукрашиваем. Подробную информацию о секционировании схемы, которую обслуживает этот пул, см. в нашей статье омноготенантной изоляции RLS.

#
Решение

Как выбрать между тремя

Выбирайте PgBouncer, если…

  • Кластер Postgres, управляемый CloudNativePG или Kubernetes в целом.
  • Вам нужен самый проверенный и хорошо документированный пулер
  • Целевая база для каждого экземпляра пулера подходит вам

Выбирайте Supavisor, если…

  • Сотни или тысячи баз за одним и тем же сервисом
  • Необходимо регистрировать арендаторов динамически через API, без передислокации.
  • Уже в экосистеме Supabase или готов зависеть от нее

Выбирайте PgCat, если…

  • Совместное использование приложений уже реализовано или запланировано на уровне пула.
  • Реплика балансировки нагрузки и аварийного переключения без отдельного уровня приложений
  • Комфортно работать с более молодым проектом, менее документированным, чем PgBouncer.

Какой бы пул не был выбран, он не заменяет размер самого Postgres. Размер пула и сервер max_connections следует рассматривать вместе, а не друг за другом. Большой пул перед слишком низким max_connections просто сдвигает насыщенность с одного уровня на другой. В нашем руководстве по настройке max_connections подробно описана формула определения размера, которую следует применять перед установкой размера вашего пула.

#
Часто задаваемые вопросы

Что нас спрашивают чаще всего

PgBouncer и Pgpool-II, в чем разница?+
Pgpool-II выходит за рамки пула соединений: распределение нагрузки между репликами, кэш запросов в памяти, репликация приложений. PgBouncer делает только одно: соединения с пулом. Частично это объясняет, почему его часто выбирают в качестве основного строительного блока, дополняемого при необходимости другими инструментами, а не заменяя более широкой платформой.
Можем ли мы использовать PgBouncer с Supabase?+
Исторически да: Supabase использовала PgBouncer до разработки Supavisor. Оба по-прежнему представлены в их официальной документации в соответствии с контекстом соединения: прямое IPv4, транзакция пула, сеанс пулера. Этот точный момент быстро развивается, чтобы его можно было проверить при настройке проекта.
Управляет ли PgCat подготовленными операторами в режиме транзакций?+
Начиная с версии 1.21, PgBouncer отслеживает и повторно подготавливает подготовленные протоколом операторы «на лету» в режиме транзакций, и это поведение документировано в самой диаграмме Aurabase Helm. PgCat заявляет о аналогичной поддержке на стороне сервера. Мы не измеряли ни то, ни другое в условиях реальной нагрузки, поэтому проверьте собственный трафик, прежде чем делать его решающим критерием выбора.
Является ли Supavisor открытым исходным кодом?+
Да, репозиторий является общедоступным на GitHub (supabase/supavisor). Это проект, отличный от ядра Supabase Postgres, написанный на Elixir, с самого начала предназначенный для мультитенантности, а не адаптированный постфактум.
#
В итоге

Универсального пулера не существует, он только хорошо подходит для вашей аренды.

PgBouncer, Supavisor и PgCat решают три варианта одной и той же проблемы, а не три версии одного и того же инструмента. PgBouncer остается самым безопасным выбором, если ваша платформа уже использует Kubernetes и CloudNativePG или когда вам просто нужен наиболее документированный пул. Супавайзер становится актуальным за пределами определенного количества баз, обслуживающих одну и ту же службу. PgCat стоит обойти, если вы пропустите сегментирование и аварийное переключение реплик на сетевом уровне, при условии, что вы согласны с зрелостью более молодого проекта.

Код Aurabase демонстрирует последовательный, а не нейтральный выбор: PgBouncer в режиме транзакций, на двух уровнях, общий парк и пул CNPG для каждого выделенного арендатора. Остаются два задокументированных исключения: для PostgREST и для администрирования схемы. Если вы хотите увидеть этот проект в действии, а не на бумаге, на нашей странице Performance документируется соответствующая методология измерения.

ГОТОВЫ К РАЗВЕРТЫВАНИЮ?

Ваш бэкэнд за пять минут.

Кредитная карта не требуется · 500 МБ бесплатно · 50 000 MAU