PgBouncer ile PostgreSQL Bağlantı Havuzlamanın Mimari Avantajları ve Uygulama Rehberi

 · 

PgBouncer ile PostgreSQL Bağlantı Havuzlamanın Mimari Avantajları ve Uygulama Rehberi

PgBouncer ile PostgreSQL Bağlantı Havuzlamanın Mimari Avantajları ve Uygulama Rehberi

PostgreSQL sunucuları, her yeni istemci bağlantısı için ayrı bir süreç (process) başlatır. Yüksek eşzamanlılık gerektiren uygulamalarda, bu durum önemli bellek ve CPU yüküne neden olabilir. Süreç oluşturma ve yok etme maliyeti, özellikle kısa ömürlü ve sık bağlantı açıp kapatan uygulamalar için darboğaz yaratır. Bu mimari kısıtlamayı aşmak ve veritabanı kaynak kullanımını optimize etmek amacıyla PgBouncer gibi bağlantı havuzlama çözümleri devreye girer.

PgBouncer Nedir ve Neden Gereklidir?

PgBouncer, PostgreSQL veritabanı sunucusu ile istemci uygulamaları arasına konumlanan hafif bir bağlantı havuzlama proxy'sidir. Temel amacı, istemciden gelen bağlantı taleplerini yakalamak, bunları daha önce kurulmuş ve hazır bekleyen veritabanı bağlantıları havuzuna yönlendirmek ve böylece veritabanı sunucusunun her yeni bağlantı için kaynak harcamasını engellemektir. Bu, hem sunucu üzerindeki yükü azaltır hem de istemci tarafında bağlantı kurma gecikmesini minimize eder.

Bir uygulamanın saniyede yüzlerce veya binlerce bağlantı açıp kapattığı bir senaryoyu ele alalım. Her bağlantıda yeni bir PostgreSQL backend süreci başlatılması, işletim sistemi seviyesinde bağlam değiştirme (context switching) yükünü artırır, bellek tüketimini yükseltir ve CPU döngülerini boşa harcar. PgBouncer, bu süreci soyutlayarak sınırlı sayıda kalıcı bağlantı kurar ve istemcilerin bu havuzdan bağlantı ödünç alıp geri vermesini sağlar.

PgBouncer'ın Çalışma Modları

PgBouncer, bağlantı havuzlamayı farklı stratejilerle yönetir. Bu modlar, uygulamanın bağlantı kullanım desenine göre dikkatlice seçilmelidir:

1. Session Pooling (Oturum Havuzlama)

Bu modda, istemci PgBouncer'a bağlandığında, PgBouncer havuzdan bir PostgreSQL bağlantısı alır ve istemci bağlantısı kapanana veya zaman aşımına uğrayana kadar bu bağlantıyı istemciye atar. İstemci bağlantısı sona erdiğinde, veritabanı bağlantısı temizlenir (örneğin, DISCARD ALL komutu ile) ve havuza geri döner. Bu mod, uzun ömürlü istemci bağlantıları ve birden fazla işlem yürüten uygulamalar için uygundur. En güvenli havuzlama modudur.

2. Transaction Pooling (İşlem Havuzlama)

Bu modda, PgBouncer bir bağlantıyı istemciye yalnızca bir işlem (transaction) süresince atar. İşlem sona erdiğinde (COMMIT veya ROLLBACK), veritabanı bağlantısı hemen havuza geri döner ve başka bir istemci tarafından kullanılabilir hale gelir. Bu mod, her isteğin ayrı bir işlem olduğu web servisleri veya mikroservisler gibi uygulamalar için idealdir. Daha fazla ölçeklenebilirlik sağlar ancak işlem sınırlarını iyi anlamak gerekir.

3. Statement Pooling (İfade Havuzlama)

Bu en agresif havuzlama modudur. PgBouncer, her SQL ifadesinden sonra bağlantıyı havuza geri döndürür. Bu, bir işlem içinde birden fazla SQL ifadesi varsa, her ifadenin farklı bir veritabanı bağlantısı üzerinden çalışabileceği anlamına gelir. Bu mod genellikle önerilmez çünkü işlem tutarlılığı sorunlarına yol açabilir ve SET komutları gibi oturum bazlı ayarların beklenmedik şekillerde davranmasına neden olabilir. Yalnızca çok özel, salt okunur ve durumsuz iş yükleri için kullanılabilir.

PgBouncer Yapılandırması

PgBouncer'ın temel yapılandırması pgbouncer.ini dosyası üzerinden yapılır. İşte tipik bir yapılandırma örneği ve önemli parametrelerin açıklamaları:

; pgbouncer.ini
[databases]
; Format: <virtual_database_name> = host=<db_host> port=<db_port> dbname=<real_db_name> auth_user=<pgbouncer_user>
my_app_db = host=127.0.0.1 port=5432 dbname=production_db auth_user=pgbouncer_monitor

[pgbouncer]
listen_addr = 0.0.0.0       ; PgBouncer'ın dinleyeceği IP adresi
listen_port = 6432          ; PgBouncer'ın dinleyeceği port
auth_type = md5             ; Kimlik doğrulama tipi (md5, plain, trust, hba)
auth_file = /etc/pgbouncer/userlist.txt ; Kullanıcı adı ve parola listesi

pool_mode = transaction     ; Havuzlama modu: session, transaction, statement
default_pool_size = 20      ; Her veritabanı için varsayılan havuz boyutu
max_client_conn = 1000      ; PgBouncer'a eşzamanlı maksimum istemci bağlantısı
max_db_connections = 100    ; PgBouncer'ın PostgreSQL'e açabileceği maksimum bağlantı (tüm havuzlar için)
server_idle_timeout = 60    ; Boşta kalan sunucu bağlantılarının kapatılma süresi (saniye)
server_connect_timeout = 15 ; Sunucu bağlantı denemesi zaman aşımı (saniye)
client_idle_timeout = 300   ; Boşta kalan istemci bağlantılarının kapatılma süresi (saniye)
log_connections = 1         ; Bağlantı olaylarını logla
log_disconnections = 1      ; Bağlantı kesme olaylarını logla
log_queries = 0             ; Sorguları logla (yüksek performans yükü oluşturabilir)

; Admin ayarları
admin_users = pgbouncer_admin ; Yönetim konsoluna erişebilecek kullanıcılar
stats_users = pgbouncer_monitor ; İstatistikleri görebilecek kullanıcılar

userlist.txt dosyası, PgBouncer'ın kimlik doğrulama için kullanacağı kullanıcı bilgilerini içerir. Formatı genellikle şöyledir:

"pgbouncer_monitor" "hashed_password"
"my_app_user" "hashed_password"

Parolalar genellikle md5(password + username) şeklinde hash'lenmelidir, ancak auth_type = plain kullanılıyorsa düz metin de olabilir (güvenlik açısından önerilmez).

Gerçek Üretim Senaryosu: Mikroservis Mimarisi

Bir e-ticaret platformunun mikroservis mimarisine sahip olduğunu varsayalım. Bu platformda "Ürün Kataloğu", "Sipariş Yönetimi", "Kullanıcı Profilleri" ve "Ödeme İşlemleri" gibi farklı mikroservisler tek bir PostgreSQL veritabanı kümesini kullanıyor olsun. Her bir mikroservis, kendi iş yüküne göre veritabanına sıkça ve bazen yoğun bir şekilde bağlanma ihtiyacı duyabilir.

PgBouncer olmadan:

  • Her mikroservis, veritabanına doğrudan bağlanmaya çalışır.
  • Binlerce eşzamanlı istek geldiğinde, PostgreSQL sunucusu binlerce yeni süreç başlatmak zorunda kalır.
  • Bu durum, özellikle anlık trafik artışlarında (Black Friday, özel indirimler) veritabanı sunucusunun kaynaklarını aşırı kullanmasına ve performans düşüşlerine hatta kesintilere yol açabilir. max_connections limiti kolayca aşılabilir.

PgBouncer ile:

  • Her mikroservis, doğrudan PostgreSQL'e değil, PgBouncer'a bağlanır.
  • PgBouncer, her mikroservis için veya genel olarak belirlenmiş sayıda kalıcı PostgreSQL bağlantısı havuzu tutar (örneğin, default_pool_size = 50).
  • Mikroservisler, PgBouncer'dan bir bağlantı talep ettiğinde, PgBouncer havuzdan hazır bir bağlantıyı onlara atar. İşleri bittiğinde bağlantı havuza geri döner.
  • Bu sayede PostgreSQL sunucusu üzerinde yalnızca 50 (veya max_db_connections kadar) aktif bağlantı süreci bulunur. Mikroservis tarafında binlerce bağlantı olsa bile, PostgreSQL tarafındaki yük sabit ve yönetilebilirdir.
  • pool_mode = transaction bu tür bir mikroservis mimarisi için genellikle en uygun seçimdir, çünkü çoğu mikroservis isteği tek bir işlem içinde tamamlanır ve bağlantılar hızla havuza geri dönebilir.

Bu senaryoda, PgBouncer, veritabanı katmanında önemli bir stabilite ve performans artışı sağlar, uygulamaların veritabanı bağlantılarını daha verimli kullanmasına olanak tanır ve ani yük artışlarında bile PostgreSQL sunucusunun ayakta kalmasına yardımcı olur. Ayrıca, PgBouncer'ı ayrı bir EC2 instance üzerinde veya uygulama sunucularından birinde çalıştırmak, mimariyi daha da esnek hale getirir.

PgBouncer Yönetimi ve İzleme

PgBouncer, özel bir yönetim konsolu sunar. psql -p 6432 -U pgbouncer_admin -d pgbouncer komutu ile bağlanarak çeşitli durum bilgilerini ve istatistikleri görüntüleyebilirsiniz:

SHOW STATS;       -- Havuzlama istatistikleri
SHOW POOLS;       -- Her havuzun anlık durumunu gösterir
SHOW CLIENTS;     -- Bağlı istemcileri gösterir
SHOW SERVERS;     -- PgBouncer'ın PostgreSQL'e olan bağlantılarını gösterir
SHOW DATABASES;   -- Tanımlı veritabanlarını gösterir
RELOAD;           -- Yapılandırma dosyasını yeniden yükler

Bu komutlar, PgBouncer'ın performansını ve bağlantı havuzlarının etkinliğini izlemek için kritik öneme sahiptir.

Sonuç

PostgreSQL tabanlı yüksek performanslı ve ölçeklenebilir uygulamalar geliştirirken, bağlantı havuzlama bir lüks değil, bir gerekliliktir. PgBouncer, hafif yapısı, esnek havuzlama modları ve kolay yapılandırması ile bu ihtiyacı etkin bir şekilde karşılar. Doğru yapılandırıldığında, PgBouncer, veritabanı sunucusu üzerindeki yükü önemli ölçüde azaltarak, uygulamanın genel yanıt süresini iyileştirir ve ani trafik artışlarına karşı dayanıklılığını artırır. Mimarinize entegre etmeden önce uygulamanızın bağlantı kullanım desenini iyi analiz etmek ve uygun havuzlama modunu seçmek, PgBouncer'dan maksimum verim almanın anahtarıdır.

← Blog Listesine Dön