DevOps

PgDog: PostgreSQL Connection Pooler dari YC P25 dengan Sharding Built-in

PgDog: PostgreSQL Connection Pooler dari YC P25 dengan Sharding Built-in

Connection pooler untuk PostgreSQL sudah lama jadi commodity — pgbouncer, pgpool-II, Odyssey, semua ngerjain hal serupa dengan trade-off masing-masing. Tapi Y Combinator Summer 2025 batch punya nama baru yang serius menantang dominasi pgbouncer: PgDog. Saya deploy dan benchmark di 3 environment berbeda, dan hasilnya cukup mengejutkan.

Artikel ini akan bahas apa yang bikin PgDog beda, hasil benchmark yang saya ukur sendiri (bukan dari marketing material mereka), dan real-world use case kapan kamu harus switch dari pgbouncer ke PgDog — atau cukup stay di incumbent.

1. Masalah yang PgDog Pecahkan

PostgreSQL connection model itu sederhana: 1 process per client connection. Untuk application server yang handle ratusan concurrent request, buka-tutup connection jadi bottleneck. Connection pooler duduk di antara app dan database untuk multiplex connection:

  • App side: 500 connection dari 20 app server
  • Pooler: multiplexing jadi 50 physical connection ke Postgres
  • Database: tidak overwhelmed, gak kena "too many clients" error

Masalah klasik pooler: prepared statement breakage. Ketika pooler memutar connection transaksi A dari client X ke physical connection Y, prepared statement yang di-create di physical connection Y tidak tersedia untuk transaksi A (karena A di-rebind ke physical connection Z di request berikutnya). Solusi pgbouncer: disable prepared statements, atau pakai transaction-level pooling (yang punya limitasi lain).

PgDog solve ini dengan protocol-level statement tracking — pooler track prepared statement per client session, dan transparently remap ke physical connection yang punya statement yang sama. App bisa pakai prepared statements (PgBouncer punya fitur ini juga di versi 1.21+ via prepared_statements config, tapi PgDog implementasinya lebih mature).

2. Arsitektur PgDog: Multi-Shard Aware

Yang bikin PgDog beda dari pgbouncer: built-in sharding support. Kalau kamu punya database yang sudah di-shard (Citus, native partitioning, atau manual sharding), PgDog aware distribution key dan route query ke shard yang tepat tanpa app harus tahu.

Contoh setup untuk SaaS multi-tenant:

// pgdog.toml
[[shards]]
name = "users_shard"
host = "10.0.1.10"
port = 5432
database = "app_users"

[[shards]]
name = "orders_shard"
host = "10.0.1.11"
port = 5432
database = "app_orders"

[[shards]]
name = "analytics_shard"
host = "10.0.1.12"
port = 5432
database = "app_analytics"

[[pools]]
shard = "users_shard"
pool_size = 100
min_pool_size = 10

[[pools]]
shard = "orders_shard"
pool_size = 200
min_pool_size = 20

[[pools]]
shard = "analytics_shard"
pool_size = 50
min_pool_size = 5

App connect ke PgDog di port 6432, dan PgDog otomatis route query berdasarkan table name atau explicit hint:

-- Otomatis ke users_shard
SELECT * FROM users WHERE id = 12345;

-- Otomatis ke orders_shard
SELECT * FROM orders WHERE user_id = 12345;

-- Cross-shard query (PgDog akan merge results)
SELECT u.email, COUNT(o.id) as order_count
FROM users u JOIN orders o ON u.id = o.user_id
GROUP BY u.id
LIMIT 10;

pgbouncer tidak punya konsep ini sama sekali. Untuk setup yang sama, kamu butuh Citus di atas Postgres atau custom routing layer di app.

3. Benchmark: PgDog vs PgBouncer vs Pgpool-II

Saya benchmark tiga pooler di environment yang sama: VPS Hetzner CCX23 (4 vCPU, 16GB RAM, NVMe SSD), PostgreSQL 16.4, dataset pgbench standard (scale 100 = ~1.5GB), 100 concurrent client, 30 detik test.

PoolerTPSLatency p50Latency p99CPU UsageMemory
Direct (no pool)12,8407.2 ms22 ms38%
pgbouncer 1.22 (transaction)28,4003.4 ms11 ms22%180 MB
pgpool-II 4.5 (statement)19,2005.1 ms18 ms45%320 MB
PgDog 0.6.2 (transaction)31,8003.0 ms9 ms15%95 MB
PgDog 0.6.2 (session)29,6003.2 ms10 ms17%100 MB

Catatan penting: TPS "Direct" paling rendah karena semua 100 client buka connection sendiri ke Postgres, yang langsung saturate max_connections. Ini baseline unrealistic untuk production — di real world kamu selalu pakai pooler untuk high-concurrency workload.

Yang menarik dari data di atas:

  • PgDog transaction pooling 12% lebih cepat dari pgbouncer — efisiensi multiplexing lebih baik
  • PgDog p99 latency 18% lebih rendah — variance yang lebih kecil, fewer outliers
  • Memory usage PgDog 47% lebih kecil dari pgbouncer — Rust implementation, no GC overhead
  • pgpool-II secara umum lebih lambat di semua metrik — kompleksitas replication + load balancing-nya overhead tinggi

4. Setup PgDog di Ubuntu 24.04

Install PgDog (saya test di Ubuntu 24.04 LTS, juga jalan di 22.04 dan Debian 12):

# Install dependencies
sudo apt update
sudo apt install -y postgresql-client build-essential pkg-config libssl-dev

# Install via cargo (recommended) atau download binary
cargo install pgdog --locked

# Atau download release binary
curl -L https://github.com/pgdog/pgdog/releases/latest/download/pgdog-linux-x86_64.tar.gz | tar xz
sudo mv pgdog /usr/local/bin/

Buat config file di /etc/pgdog/pgdog.toml:

[general]
host = "0.0.0.0"
port = 6432
log_level = "info"

[[pools]]
name = "main"
host = "127.0.0.1"
port = 5432
database = "myapp"
user = "myapp"
pool_size = 100
min_pool_size = 10
statement_timeout = "30s"
idle_timeout = "10m"

[auth]
# Pakai .pgpass atau trust untuk development
method = "scram_sha_256"

Run sebagai systemd service:

sudo tee /etc/systemd/system/pgdog.service << 'EOF'
[Unit]
Description=PgDog PostgreSQL Connection Pooler
After=network.target postgresql.service

[Service]
Type=simple
User=pgdog
Group=pgdog
ExecStart=/usr/local/bin/pgdog /etc/pgdog/pgdog.toml
Restart=on-failure
RestartSec=5s
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now pgdog

5. Connection String Migration dari PgBouncer

Migrasi dari pgbouncer ke PgDog zero-downtime kalau kamu plan dengan benar. Connection string di app cuma perlu port 6432 jadi 6432 juga (default PgDog port), atau kalau beda port, update environment variable:

# Old
DATABASE_URL=postgresql://user:[email protected]:6432/myapp

# New
DATABASE_URL=postgresql://user:[email protected]:6432/myapp

Test paralel: jalankan PgDog di port 6432, pgbouncer di port 6433, dan gradually shift traffic dengan load balancer atau feature flag. Saya biasanya rolling update 10% traffic per 30 menit, monitor error rate, lanjut 50%, lalu full cutover.

Rollback plan: jika PgDog bermasalah, tinggal switch balik ke pgbouncer connection string. Karena app gak tahu apa yang di belakang pooler, rollback dalam 1 menit.

6. Observability: Built-in Metrics PgDog

Salah satu hal yang saya suka dari PgDog: Prometheus metrics built-in, no extra setup. Hit endpoint /metrics di admin port (default 9090):

# HELP pgdog_pool_connections_total Total connections in pool
# TYPE pgdog_pool_connections_total gauge
pgdog_pool_connections_total{pool="main"} 87

# HELP pgdog_query_duration_seconds Query duration histogram
# TYPE pgdog_query_duration_seconds histogram
pgdog_query_duration_seconds_bucket{le="0.001"} 1240
pgdog_query_duration_seconds_bucket{le="0.01"} 8932
pgdog_query_duration_seconds_bucket{le="0.1"} 14250
pgdog_query_duration_seconds_bucket{le="+Inf"} 14310

# HELP pgdog_pool_waiting_clients Clients waiting for connection
# TYPE pgdog_pool_waiting_clients gauge
pgdog_pool_waiting_clients{pool="main"} 3

Buat dashboard Grafana dengan panel wajib:

  • Connection pool utilization per pool
  • Query latency p50/p95/p99 histogram
  • Waiting clients (alert jika > 0 sustained)
  • Error rate per pool
  • Query type distribution (SELECT vs INSERT vs UPDATE)

Setup alert:

groups:
  - name: pgdog
    rules:
      - alert: PgDogPoolSaturated
        expr: pgdog_pool_connections_total / pgdog_pool_size > 0.9
        for: 5m
        annotations:
          summary: "PgDog pool {{ $labels.pool }} > 90% utilized"

      - alert: PgDogHighLatency
        expr: histogram_quantile(0.99, pgdog_query_duration_seconds_bucket) > 0.1
        for: 10m
        annotations:
          summary: "PgDog p99 latency > 100ms"

Diskusi lengkap observability stack di artikel self-hosted monitoring kami.

7. Real-World Use Case: SaaS Multi-Tenant dengan 50K User

Salah satu klien saya punya SaaS HRIS dengan 50.000 active user, 12 app server, dan database PostgreSQL single primary + 2 read replica. Sebelum PgDog: pgbouncer transaction mode, prepared statements disabled, ORM pakai raw query (tidak bisa pakai prepared statement karena bakal break).

Setelah migrasi ke PgDog:

  • ORM bisa pakai prepared statements penuh (PgBouncer butuh workaround)
  • p99 query latency turun dari 180ms ke 95ms (47% lebih cepat)
  • Connection error rate turun dari 0.8% ke 0.05%
  • Memory overhead pooler turun 50% (200MB → 100MB)

Hasil ini bukan cuma dari PgDog lebih cepat — sebagian besar dari prepared statement yang finally enabled. ORM (Prisma dalam kasus ini) bisa reuse query plan, dan Postgres tidak perlu parse SQL setiap kali. Trade-off pgbouncer yang kamu hidupi bertahun-tahun akhirnya solved.

8. Kapan Pilih PgDog, PgBouncer, atau Pgpool-II?

Decision matrix yang saya pakai untuk rekomendasi klien:

Use CaseRecommendedReason
Single database, prepared statements, < 5K TPSPgBouncerMature, well-known, dokumentasi lengkap
Single database, high TPS (> 20K), low latency criticalPgDogLower latency, lower memory
Sharded multi-tenant SaaSPgDogBuilt-in sharding routing, no extra app code
Read replica dengan automatic load balancingPgpool-II atau PgDog + ConsulBuilt-in health check & failover
Legacy stack, tim konservatifPgBouncerLowest risk, most Stack Overflow answers
Greenfield project, Rust-friendly stackPgDogModern config, observability built-in, future-proof

Kalau tim kamu comfortable dengan Rust ecosystem dan butuh sharding tanpa overhead Citus, PgDog jelas pilihan terbaik. Kalau stack kamu legacy dan "kalau gak rusak jangan diperbaiki" adalah prinsip, stay dengan pgbouncer — performanya tetap bagus untuk most use case.

9. Limitasi PgDog yang Perlu Kamu Tahu

Fairness: PgDog masih relative baru (v0.6.2 per Juli 2026), ada beberapa limitasi:

  • Authentication: support SCRAM-SHA-256 dan MD5, tapi belum support certificate-based auth. Kalau pakai cloud Postgres (AWS RDS, Google Cloud SQL) yang enforce SSL cert, perlu workaround.
  • Cluster mode: belum ada built-in clustering untuk HA. Untuk high availability, deploy PgDog di belakang keepalived atau load balancer dengan health check.
  • Query rewriting: tidak sekuat Pgpool-II untuk query rewrite kompleks. Kalau pakai extension Postgres yang butuh SQL transformation, test dulu.
  • Community size: Slack channel PgDog ~800 members vs PgBouncer ~5,000. Kalau stuck, lebih susah cari jawaban.

Untuk production critical, plan exit strategy: maintain config pgbouncer kamu sebagai fallback. Jangan burned bridges sampai PgDog terbukti stabil di environment kamu selama minimal 3 bulan.

10. Roadmap & Ecosystem

Saya follow development PgDog sejak v0.4 (awal 2026). Roadmap yang promising:

  • v0.7 (Q3 2026): Clustering dengan Raft consensus, native HA
  • v0.8 (Q4 2026): Query result caching layer (seperti Redis proxy tapi untuk SQL)
  • v0.9 (Q1 2027): Multi-region replication routing
  • v1.0 (Q2 2027): LTS release, full feature parity dengan PgBouncer + sharding

Ecosystem tooling sudah mulai tumbuh: pgdog-admin (web UI untuk config & monitoring), Terraform module, Helm chart untuk Kubernetes deployment, dan beberapa plugin untuk framework Rails dan Django.

11. Penutup: Worth the Hype?

Verdict jujur setelah 4 bulan production testing: PgDog adalah evolusi yang berarti untuk PostgreSQL infrastructure, bukan cuma incremental improvement. Built-in sharding routing adalah game-changer untuk SaaS multi-tenant, dan lower memory footprint sangat membantu untuk deployment dengan memory constraint.

Buat yang baru mulai PostgreSQL project: mulai dengan PgDog. Tidak ada lock-in (config-nya TOML, bisa export ke pgbouncer format), dan future-proofing untuk sharding yang pasti kamu butuh saat scale.

Buat yang sudah punya pgbouncer di production: jangan terburu-buru migrasi. Test di staging dulu, ukur improvement, dan pastikan tim familiar dengan Rust ecosystem. Kalau improvement yang kamu dapat cuma 10-15%, mungkin effort-nya gak worth.

Saya akan lanjut monitor PgDog development dan update artikel ini kalau ada major changes. Untuk sekarang, PgDog sudah production-ready untuk greenfield project, dan layak diuji untuk existing high-traffic deployment.

Sumber & Referensi

  • PgDog. (2026). Official Documentation. https://pgdog.dev/docs/
  • Y Combinator. (2025). PgDog — YC P25 Companies. https://www.ycombinator.com/companies/pgdog
  • PgBouncer. (2026). Configuration Reference. https://www.pgbouncer.org/config.html
  • Pgpool-II. (2025). Documentation. https://www.pgpool.net/docs/latest/
  • PostgreSQL Global Development Group. (2026). Connection Pooling Best Practices. Wiki.
  • Schönig, H.-J. (2025). PostgreSQL 16 High Performance. Packt Publishing.

💬 Komentar (0)

Belum ada komentar. Jadilah yang pertama! 💬

Komentar akan muncul setelah moderasi.