PgBouncer'da Session/Transaction/Statement modlarından hangisini seçmeliyim?
Soru
Mikroservislerimiz (toplam ~50 pod) PostgreSQL'e doğrudan bağlanıyor ve her pod en az 10 bağlantı açıyor. Yoğun yükte `max_connections` limitine (örneğin 500) dayanıp hata alıyoruz; limiti artırmak RAM'i dikeyde katlıyor. Araya PgBouncer koymayı planlıyoruz. Session, Transaction, Statement modlarından hangisini seçmeliyiz? Uygulamadaki prepared statement'lar bu seçimden nasıl etkilenir?
Cevap
Kısa cevap: Web/mikroservis filosu için Transaction modu — çok-statement’lı trafikte bağlantı yeniden kullanımını en yükseğe çıkaran en pratik seçenek bu.
Kısa cevap
Yaşadığın şey net: 50 pod × min bağlantı, max_connections’ı tüketiyor. PgBouncer tam da bunu çözer — çok sayıda client bağlantısını az sayıda sunucu bağlantısına multiplexler, yani max_connections’ı şişirmeden RAM’i kurtarırsın. Bağlantı havuzu doyduğunda sorgunun kendisinin de pay sahibi olduğunu unutma; sıcak sorgunun index’ini composite index kolon sırası kaydında ele almıştım.
Neden
-
Transaction modu en yüksek yeniden kullanımı verir. Sunucu bağlantısını her transaction sonunda havuza iade eder; iki ardışık transaction farklı sunucu bağlantısına düşebilir. Yüzlerce kısa ömürlü mikroservis isteği için doğru mod budur.
-
Session modu avantajı çöpe atar. Her client’a tüm oturumu boyunca bir sunucu bağlantısı bağlar — yani 50 pod yine 50+ sunucu bağlantısı tutar; multiplexing kazancı kaybolur. Sadece session state’e gerçekten muhtaçsan mantıklı.
-
Statement modu uygulamayı kırar. Bağlantıyı her statement sonunda iade eder, bu da çok statement’lı transaction’ları bozar. Pratikte web uygulaması için kullanılmaz.
Ne yapmalı
-
Transaction modunu seç. Havuzlama kazancının tamamı bu moddan gelir.
-
Prepared statement tuzağını kapat. Protokol seviyesi prepared statement’lar,
SET, advisory lock veLISTENgibi bağlantıya bağlı durumlar farklı sunucu bağlantısına düşünce kaybolur. Client-side prepared statement’ları kapat (örn. PDOATTR_EMULATE_PREPARES) ya da PgBouncer 1.21’den beri gelen named prepared statement desteğini kullan —max_prepared_statementssıfırdan büyükken PgBouncer bu komutları transaction ve statement modunda izler ve gerektiğinde yeni sunucu bağlantısında yeniden hazırlar. -
Statement’lar arası session state’e asla güvenme. Transaction modunda bağlantı kimliği kalıcı değildir.
-
default_pool_size’ı ölçülmüş eşzamanlılığa göre dar tut. Sunucu bağlantısı havuzunu kocaman yapma — multiplexing’in tüm anlamı az sunucu bağlantısıyla çok client’a hizmet etmek.
Sonuç: Ben olsam Transaction modu seçerdim, uygulamada protokol seviyesi prepared statement’ları kapatırdım (ya da PgBouncer’ı 1.21+‘a yükseltirdim) ve default_pool_size’ı ölçülmüş eşzamanlılığa göre dar tutardım. Session modu sorununu çözmez, Statement modu uygulamanı kırar. Dikeyde max_connections ve RAM’i katlamak yerine bağlantı havuzlamayı çözmek çoğu zaman tam da PostgreSQL’i “yeterli” kılan hamledir — bu tartışmanın derinine sade.dev’deki yazıda girdim.
İlgili Yazılar
Yorumlar
Yorum yapmak için GitHub hesabınızla giriş yapmanız yeterli. Yorumlar GitHub Discussions üzerinde saklanır.