PRODEgemen Avrupa BaaS platformuKontrol Panelini Aç →

Performans · 11 dk. okuma

PgBouncer vs Supavisor vs PgCat: hangi Postgres havuzlayıcı?

Affane Daylami · Fondateur · 9 Haziran 2026

Bloga geri dön

PgBouncer, Supavisor ve PgCat'in tümü Postgres bağlantılarını paylaşıyor ancak aynı sorunu çözmüyorlar. PgBouncer tarihi standart olmaya devam ediyor: hafif, C dilinde, CloudNativePG aracılığıyla Kubernetes ekosistemine yerel olarak entegre edilmiş. Supavisor, Supabase tarafından belirli bir ihtiyaç için, veritabanı başına bir işlem yerine binlerce veritabanını tek bir hizmetin arkasında tutmak amacıyla geliştirildi. Rust'ta yazılan PgCat, replikalar arasında klasik parçalama ve yük dengeleme işlemlerine katkıda bulunur. Aurabase'de veri düzlemi trafiği, işlem modunda PgBouncer üzerinden geçer. Bu doğrudan depo kodunda gösterilir: Helm şeması, CNPG Pooler kaynağı ve yerel k3d konfigürasyonunun tümü aynı seçime doğru birleşir.

Bu İngilizce metin, Fransızca orijinalinden otomatik olarak oluşturulmuştur ve henüz incelenmemiştir.
Bu sayfa otomatik olarak çevrildi. İngilizce versiyonu yetkilidir.

Bu makale, üç havuzlayıcının mimarisini karşılaştırmaktadır: dil, havuzlama modları, tek veya çok kiracılı model, saf havuzlamanın ötesindeki işlevler. Tembo ve PkgPulse bu üç aracın sayısal karşılaştırmalarını yayınladı ancak biz bunların ölçümlerinden hiçbirini kendimiz çoğaltmadık. kıyaslama metodolojimiz'de ayrıntıları verilen, kıyaslamalarla ilgili editoryal tutumumuz, kendimiz doğrulamadığımız bir rakamı asla yeniden yayınlamamaktır. Bunun yerine burada ne bulacaksınız: Her bir aracın gerçek mimarisi ve Aurabase'in Postgres trafiğini gerçekte nasıl yönlendirdiği, kaynak kodunda bölüm bölüm doğrulanmıştır.

Temeller
  • PgBouncer (C), en kanıtlanmış havuzlayıcı ve Kubernetes ile en iyi entegre olmaya devam ediyor: CloudNativePG, Poolerkaynağı için doğrudan ona güveniyor.
  • Supavisor (Elixir, Supabase projesi) farklı bir sorunu hedefliyor: veritabanı başına bir havuzlayıcı yerine aynı hizmetten binlerce veritabanına hizmet vermek.
  • PgCat (Rust), uygulama parçalama, replikalar arasında yük dengeleme ve ham havuzlamaya otomatik yük devretme özelliklerini ekler.
  • Aurabase deposu, PgBouncer'ın iki düzeyde kullanıldığını gösterir: paylaşılan filo için paylaşılan bir dağıtım ve tahsis edilmiş kiracı başına CloudNativePG tarafından yönetilen bir Pooler kaynak. Her ikisi de işlem modunda çalışır.
  • PostgREST veaura-db yönetim havuzu, havuzlayıcıdan geçmeden gönüllü olarak Postgres ile doğrudan bağlantıda kalır: işlem havuzu, şema yeniden yüklemelerini ve oturum kilitlerini bozar.
#
Panorama

Üç havuzcu, üç felsefe

PgBouncer simge durumuna küçültür, Supavisor çok kiracılı ölçekte havuz oluşturur, PgCat ham havuzlamaya ağ işlevleri ekler. Her ne kadar sıklıkla aynı sayfalarda dönem dönem karşılaştırılsalar da, üçünden hiçbiri diğer ikisinin yerini doğrudan almaz.

DilCİksir (BEAM)Pas
Havuzlama modlarıOturum, işlem, bildirimOturum, işlemOturum, işlem, bildirim
Kiracılık modeliTek kiracılı olacak şekilde tasarlanmış örnek başına bir hedef kümeYerel çok kiracılı: birçok veritabanına yönelik bir hizmetBölüm anahtarına göre parçalanan bir hedef küme
Havuzlamanın ötesindeEk fonksiyon yok, kasıtlı olarak minimum düzeydeYönetici HTTP API'si, dinamik kiracı kaydıReplikalar arasında parçalama, yük dengeleme ve yük devretme
Yerel Kubernetes entegrasyonuEvet: CloudNativePG Kaynak HavuzlayıcıBugüne kadar yerel olarak belgelenmediBugüne kadar yerel olarak belgelenmedi
MenşeiPostgres havuzlamanın tarihsel standardıSupabase tarafından kendi çok kiracılı bulutu için oluşturulduInstacart'ta doğdu, bugün PostgresML tarafından sürdürülüyor

Sütunlar sırasıyla: PgBouncer, Supavisor, PgCat. Her projenin resmi dosyalarına göre mimari özellikleri, dağıttığınız sürümde onaylanacak, ekosistem bu noktada hızla gelişiyor.

#
PgBouncer

Tarihi standart, hafif ve Kubernetes'e entegre

PgBouncer yalnızca tek bir şey yapar: Postgres bağlantılarını herhangi bir ek işlev olmadan havuzda tutar. Bu kasıtlı olarak dar kapsam, uzun ömürlülüğünü ve üretimdeki çoğu Postgres yığınında temel yapı taşı olarak benimsenmesini büyük ölçüde açıklamaktadır.

Three pooling modes are available. Session mode opens one server connection per client connection, the most permissive. Transaction mode reuses a server connection between several clients, released at each end of a transaction. Statement mode goes even further, and is rarely used in production. It is the transaction mode that brings the real pooling gain, but it imposes strict rules. Any session state (SETvariables, advisory locks, LISTEN/NOTIFY) does not survive beyond a transaction. We detail these rules and their pitfalls in our dedicated article on the transaction pooling mode of PgBouncer.

Geçmişte tek işlem olan PgBouncer örneği, varsayılan olarak tek bir CPU çekirdeği kullanır. Aynı bağlantı noktasının arkasında birden fazla örneğin çalıştırılması (SO_REUSEPORTaracılığıyla), bir başlangıç ​​tasarım özelliği değil, projenin daha yeni bir gelişimidir. Kimlik doğrulama tarafında PgBouncer, bir rolün parolasını dinamik olarak çözmek için her bağlantıda yürütülen bir SQL işlevi olan yapılandırılabilir bir auth_queryöğesini destekler. Bu mekanizma, her kullanıcıyı önceden listeleyen statik bir dosyaya bağlı kalmayı önler. Aurabase'in proje başına rolleri için kullandığı mekanizma tam olarak budur (bölüm 05).

Astuce

PgBouncer, CloudNativePG'nin Poolerkaynağının arkasında yerel olarak dağıttığı havuzlayıcıdır. CloudNativePG operatörü tarafından yönetilen bir Postgres kümesinde, yönetilen bir havuzlayıcıyı etkinleştirmek, pratikte PgBouncer'ı elle yapılandırmadan etkinleştirmeye eşdeğerdir.

#
Supavisor

Supabase'in bulutta yerel çok kiracılı havuzlayıcısı

Supavisor, PgBouncer'ın asla bu ölçekte çözmek için tasarlanmadığı bir sorunu ele alıyor. Bu, veritabanı başına bir havuzlayıcı örneği yerine, tek bir hizmetten çok sayıda farklı kiracı veritabanına hizmet vermeyi içerir. Elixir'de yazılan ve Erlang sanal makinesinde (BEAM) yürütülen proje, Supabase tarafından açık kaynak olarak kendi GitHub deposunda geliştirilmekte ve sürdürülmektedir.

Yerel çok kiracılı model gerçek yapısal farklılıktır. Klasik bir PgBouncer filosunun hedef taban başına bir süreç (veya bir dizi özel bağlantı) gerektirdiği durumlarda Supavisor farklı şekilde çalışır. Kiracıları bir HTTP yönetim arayüzü aracılığıyla dinamik olarak kaydeder ve gelen her bağlantıyı, hizmeti yeniden başlatmadan doğru veritabanına yönlendirir. Supabase, tam da bu nedenle kendi Bulut projelerini PgBouncer'dan Supavisor'a taşıdı. Her veritabanı için bir tane içeren klasik bir havuz kümesi, yüz binlerce projeyi barındıran çok kiracılı bir buluta ölçeklenmez.

Bu mimari tercihin belgelenmiş bir dezavantajı var. Gelişmiş vakalarda PgBouncer ile özellik benzerliğinin, projenin başlatılmasından sonra istikrara kavuşması zaman aldı. İki örnek: LISTEN/NOTIFYöğesinin belirli davranışları ve işlem modunda hazırlanan ifadelerin hassas yönetimi. Uygulamanızın bu belirli davranışlara bağlı olup olmadığını geçişten önce sürümünüzü kontrol edin.

#
PgCat

Rust'ın yabancısı: yerel parçalama ve yük dengeleme

PgCat açıkça Rust'ta yazılan PgBouncer'a alternatif olarak konumlandırılmıştır. Ne PgBouncer ne de Supavisor'un yerel olarak katıştırmadığı klasik havuzlamaya ağ işlevleri ekler. Özellikle üçü: bölüm anahtarına göre uygulama parçalama, okuma replikaları arasında yük dengeleme ve başarısız bir replikadan otomatik olarak yük devretme. Proje, bugün PostgresML tarafından devralınmadan ve sürdürülmeden önce Instacart'ta doğdu.

Somut olarak, PgCat normalde iki farklı katmanın üstleneceği rolü oynayabilir: bir bağlantı havuzlayıcısı ve çeşitli Postgres örnekleri arasında yönlendirme için bir uygulama proxy'si. Verilerini zaten elle parçalayan bir ekip, kodunu PgCat ile basitleştirebilir. Okumaları dahili olarak geliştirilen kopyalar arasında dağıtmaya yönelik mantık için de aynı şey geçerlidir: özel bir ağ katmanı doğrudan onun yerini alır.

Tam tersi bir uzlaşma da mevcut: PgCat, PgBouncer'dan çok daha küçük bir dokümantasyon ve üretim geri bildirimi ekosistemine sahip daha genç bir projedir. Parçalama ve yük devretme işlevlerini benimsemek aynı zamanda yalnızca havuzlama kapasitesine değil, bu belirli bileşenin olgunluğuna da bağlı olmayı kabul etmek anlamına gelir.

#
Giriş kodu

Aurabase kodunun gösterdiği şey: İşlem havuzu oluşturmanın her şeyi bozduğu durumlar dışında her yerde PgBouncer

Aurabase deposu, PgBouncer'ı her ikisi de işlem modunda olmak üzere iki ayrı katmanda dağıtır. Paylaşılan filo için Helm grafiği, paylaşılan veri düzleminin (deploy/helm/aurabase/templates/infra/pgbouncer.yaml, görüntü edoburu/pgbouncer) önünde özel bir PgBouncer dağıtımını tanımlar. Tahsis edilmiş bir örnekteki kiracı için, hazırlayıcı, CloudNativePG tarafından yerel olarak yönetilen bir Pooler kaynağı oluşturur (deploy/cnpg/tenant-pooler.yaml, k8s_tenant.rstarafından oluşturulur). İkisi de Supavisor veya PgCat kullanmıyor. Kod, bu seçimden önce yapılan açık bir karşılaştırmayı belgelemiyor. Öte yandan, PgBouncer'ın yerel havuzlama tuğlası olduğu gerçeğiyle tutarlı olarak CloudNativePG ekosistemiyle derin ve halihazırda operasyonel bir entegrasyon gösterir.

işlem
HAVUZLAMA MODU
Özel kiracı tarafından paylaşılan filo ve havuz sağlayıcı
1000
MAKS MÜŞTERİ BAĞLANTISI
Eş zamanlı müşteri tavanı, Dümen grafiği varsayılanı
80
VARSAYILAN HAVUZ BOYUTU
Sunucu bağlantıları (temel, rol), varsayılan Dümen şeması

Ancak her şey havuzlayıcıdan geçmiyor ve bu, kodun kendisinde belgelenen kasıtlı bir seçimdir. PostgREST, asla PgBouncer aracılığıyla değil, Postgres'e canlı olarak bağlı kalır. Helm grafiği yorumu bunun nedenini açıkça ortaya koyuyor: işlem havuzu oluşturma, pgrstkanalındaki bir LISTEN'ye bağlı olan şema yeniden yüklemesini bozacaktır. Bu mekanizma, istemciler arasındaki geri dönüştürülmüş sunucu bağlantılarıyla uyumlu değildir.aura-db yönetim havuzu (şema, DDL, oturum danışma kilitleri) de aynı temel nedenden dolayı doğrudan bağlantıda kalır. İşlem kapsamlı olmayan SET search_path ve oturum kilitleri, işlem modu havuzlayıcısında hayatta kalamaz.

deploy/helm/aurabase/templates/infra/pgbouncer.yaml (extrait commenté)yaml
# Veri düzlemi aura-db: PgBouncer aracılığıyla her şey işlem kapsamlıdır (SET LOCAL)
DATABASE_URL: postgresql://aura_authenticator:...@pgbouncer:5432/aura_db_master

# Havuz yöneticisi (DDL, iç gözlem): Postgres'te DIRECT, asla PgBouncer
# SET search_path YEREL olmayan + oturum kilitleri işlem havuzunu bozar
ADMIN_DATABASE_URL: postgresql://aura:...@postgres:5432/aura_db_master

Kimlik doğrulama, statik bir userlist.txt dosyası olmadan, bölüm 02: AUTH_QUERY: SELECT * FROM pgbouncer.user_lookup($1)'de açıklanan auth_query modelini izler. Bu, proje başına dinamik olarak oluşturulan rollerin (project_<uuid>_authenticator), her yeni proje için havuzlayıcıyı yeniden dağıtmadan PgBouncer aracılığıyla kimlik doğrulaması yapmasına olanak tanıyan şeydir.

Bu makaleyi yazarken edinilen operasyonel bir ders

Yerel Kubernetes'teki PgBouncer sağlık kontrolü yorumu, halihazırda düzeltilmiş olan gerçek bir hatayı belgeliyor. PgBouncer'a karşı yapılan bir pg_isready çalıştırması yalnızca proxy anlaşmasını doğrular, aktardığı Postgres arka ucuyla gerçek bağlantıyı asla doğrulamaz. PgBouncer, arka uç durdurulduğunda bile "bağlantıları kabul ederek" yanıt vererek istekleri sıraya koyar. Yıkıcı bir test sırasında gözlemlenen sonuç: Hizmet 5 ardışık döngü boyunca healthy kaldı ve Postgres'e ulaşılamadı. Düzeltme, kontrolü, havuzlayıcı aracılığıyla arka uca kadar gerçek bir uçtan uca psql isteğiyle değiştirir. Düzeltme sonrasındaki sonuç, tekrar oynatılan aynı testte: 7 döngüde, yaklaşık 35 saniyede unhealthy algılandı.

Küçük ama açıklayıcı son bir ayrıntı: Helm grafiği varsayılan olarak edoburu/pgbouncer:v1.24.1-p1 pinini koyarken, yerel k3d tezgahı v1.25.2-p0kullanıyor. Bu mimari bir tercih değil, yalnızca iki ortam arasındaki sürüm senkronizasyonunun hafif bir eksikliği; bir kod incelemesinin bir blog gönderisinden daha hızlı yakaladığı türden bir ayrıntı. Giydirmek yerine olduğu gibi belgeliyoruz. Bu havuzlayıcının hizmet verdiği şema bölümlemenin ayrıntıları içinçok kiracılı RLS yalıtımıhakkındaki makalemize bakın.

#
Karar

Üçü arasında nasıl seçim yapılır

Aşağıdaki durumlarda PgBouncer'ı seçin…

  • Genel olarak CloudNativePG veya Kubernetes tarafından yönetilen Postgres kümesi
  • En kanıtlanmış ve en iyi belgelenmiş bilardo oyuncusunu istiyorsunuz
  • Havuz oluşturucu örneği başına bir hedef tabanı size uygundur

Aşağıdaki durumlarda Supavisor'u seçin:

  • Aynı hizmetin arkasında yüzlerce veya binlerce üs
  • Kiracıları yeniden dağıtım olmadan bir API aracılığıyla dinamik olarak kaydetmeniz gerekiyor
  • Zaten Supabase ekosistemindesiniz veya ona bağlı olmaya isteklisiniz

Aşağıdaki durumlarda PgCat'i seçin:

  • Uygulama paylaşımı halihazırda mevcut veya havuz oluşturucu düzeyinde planlanıyor
  • Ayrı uygulama katmanı olmadan yük dengeleme ve yük devretme kopyası
  • Daha genç bir projeyle rahat, PgBouncer'dan daha az belgelenmiş

Hangi havuzlayıcı seçilirse seçilsin, Postgres'in boyutunun yerini almaz. Havuz boyutu ve sunucu max_connections birbiri ardına değil, birlikte düşünülmelidir. Çok düşük bir max_connections önündeki cömert havuz, doygunluğu bir seviyeden diğerine kaydırır. ayarlama max_connections hakkındaki kılavuzumuz, havuzunuzun boyutunu ayarlamadan önce uygulanacak boyutlandırma formülünün ayrıntılarını verir.

#
Sık sorulan sorular

Bize en sık sorulanlar

PgBouncer ve Pgpool-II, fark nedir?+
Pgpool-II, bağlantı havuzu oluşturmanın ötesine geçer: kopyalar arasında yük dağıtımı, bellek içi sorgu önbelleği, uygulama çoğaltması. PgBouncer yalnızca tek bir şey yapar: havuz bağlantıları. Bu kısmen, neden daha geniş bir platformla değiştirilmek yerine, gerekiyorsa başka araçlarla desteklenen temel bir yapı taşı olarak seçildiğini açıklayan şeydir.
PgBouncer'ı Supabase ile kullanabilir miyiz?+
Tarihsel olarak evet: Supabase, Supavisor'u geliştirmeden önce PgBouncer'a güveniyordu. Her ikisi de bağlantı bağlamına göre resmi belgelerinde sunulmaya devam eder: Doğrudan IPv4, havuzlayıcı işlemi, havuzlayıcı oturumu. Bu hassas nokta, bir projeyi yapılandırırken kontrol etmek için hızla gelişir.
PgCat hazırlanan ekstreleri işlem modunda yönetiyor mu?+
Sürüm 1.21'den bu yana, PgBouncer, Aurabase Helm grafiğinde belgelenen bir davranış olan, protokolle hazırlanmış ifadeleri işlem modunda anında izler ve yeniden hazırlar. PgCat benzer sunucu tarafı desteğini talep ediyor. Gerçek yük koşullarında ne birini ne de diğerini ölçmedik; bu nedenle, belirleyici bir seçim kriteri haline getirmeden önce kendi trafiğinizi kontrol edin.
Supavisor açık kaynak mı?+
Evet, depo GitHub'da (supabase/supavisor) herkese açıktır. Bu, Supabase'in Postgres çekirdeğinden farklı, Elixir ile yazılmış, sonradan uyarlanmak yerine başlangıçtan itibaren çoklu kiracı için tasarlanmış bir projedir.
#
Özetle

Evrensel bir havuz sağlayıcı yoktur, yalnızca kiracılığınıza uygun olan vardır

PgBouncer, Supavisor ve PgCat aynı aracın üç versiyonunu değil, aynı problemin üç varyasyonunu çözüyor. Platformunuz zaten Kubernetes ve CloudNativePG'ye bağlı olduğunda veya yalnızca en fazla belgelenen havuzlayıcıyı istediğinizde PgBouncer en güvenli seçim olmaya devam ediyor. Supavisor, aynı hizmetten hizmet veren belirli sayıdaki üslerin ötesinde alakalı hale geliyor. Daha genç bir projenin olgunluğunu kabul etmeniz koşuluyla, ağ düzeyinde parçalamayı ve replika yük devretmeyi kaçırırsanız, PgCat yoldan sapmaya değer.

Aurabase kodu tarafsız değil tutarlı bir seçim gösterir: İşlem modunda PgBouncer, iki düzeyde, paylaşılan filo ve tahsis edilmiş kiracı başına CNPG havuzlayıcı. PostgREST ve şema yönetimi için belgelenmiş iki istisna kalmıştır. Bu projenin kağıt üzerinde değil uygulamalı olarak dağıldığını görmek istiyorsanız, Performans sayfamız ilgili ölçüm metodolojisini belgelemektedir.

DAĞITILMAYA HAZIR MISINIZ?

Beş dakika içinde arka ucunuz.

Kredi kartı gerekmez · 500 MB ücretsiz · 50.000 MAU