PgBouncer kullanımı

Connection Pooling Nedir?

Connection Pooling kısaca DB bağlantılarını cacheleyip, gelen yeni bağlantılarda varolan DB bağlantısını kullananmaktır diyebiliriz. Bu sayede her seferinde yeni bir bağlantı açmaktan ötürü doğan zaman ve memory kaybınını azaltabiliriz.


Normal bir web uygulamasında kullanıcı sisteme bir istek gönderdiğinde bir DB connection açılır ve response kullanıcıya gönderilene kadar DB connection açık kalır. Eğer DBnin connection limitinin 100 olduğunu varsayarsak anlık aynı anda sadece 100 kullanıcı DB connection kurabilir. 101. kişi uygulamaya istek gönderdiğinde uygulama DB bağlantısı açmak isteyecek fakat DB connection limiti dolduğu için yeni bağlantıyı drop edecektir. Bundan kurtulmanın en basit yöntemi DB connection limitlerini artırmaktır. Diğer bir yöntem ise PgBouncer gibi bir connection pooling aracı kullanmaktır. DB connection limitlerini artırmak en kolay yöntemdir fakat gerçek bir Postgresql DB connection açmak PgBouncer’a göre daha maliyetli bir çözümdür. Postgresql bir connectioni handle edebilmek için bir kaç MB memory kullanırken PgBouncer sadece 2KB memory kullanır[1]. Ayrıca normal DB connection açmak süre bakımından da PgBouncer’a göre daha fazla zaman alır.

PgBouncer kullandığımız durumda uygulamamız direk DBye bağlanmak yerine PgBouncer’a bağlanır. DBye connectioni sadece PgBouncer kurar ve bir DB connectionı üzerinden birden fazla kullanıcı için sorgu çalıştırabilir. Yazının devamında bunu daha iyi anlayacaksınız.

PgBouncer kullanılmadığı durumda kullanıcı uygulamaya bir request gönderdiğinde uygulamamız ilk DB’ye connection kurar ve response dönene kadar db connection’ı bloke eder. Uygulama tarafında bir hesaplama yapılıyor olsa bile kullanıcıya response dönene kadar db connection açık kalacaktır. Buda uygulamız yoğun kullanıldığı durumda DB connection limitine ulaşacak ve uygulamamız artık kullanıcıları karşılayamayacak duruma gelecektir.

Bazı PgBouncer terimleri:

Limitler:

Bazı PgBouncer configleri:

PgBouncer’ın bütün configlerine buradan ulaşabilirsiniz.

Django Notları:

Django’da select statementlar da dahil olmaz üzere her bir query transaction bloğu içerisinde çalıştırılır.


[1] Postgresql ve PgBouncer connection benchmark yapmadım ama şuradan memory kullanım farkına bakabilirsiniz.

Load comments