PgBouncer
pgBouncer yüksek performans sunan, sunucuya yük getirmeyen bir connection pooling yazılımıdır. Skype tarafından geliştirilmeye başlanmıştır, şu anda daha geniş bir topluluk tarafından geliştirilmektedir:
PgBouncer, diğer pooling yazılımlarına göre daha az bellek harcaması ile dikkat çeker. Bağlantı başına sadece 2kB kadar bellek harcanır. Yeniden başlama ve güncelleme sırasında client bağlantılarını öldürmez bu da önemli bir avantajdır. Pgpool’a göre tek “dezavantajı” pgBouncer Fedora ve EPEL depolarında, ayrıca adresindeki depoda bulunmaktadır. Debian/Ubuntu için de adresindeki depoya bakabilirsiniz. Paket kurulumlarında ayar dosyası olan pgbouncer.ini
dosyası /etc/pgbouncer dizini altında yaratılır. Bu dosyayı düzenlemek gerekir.
[database]
bölümüne pgbouncer’ı hangi veritabanları için kullanmak istediğinizi belirtiniz. Örnek olarak sunucudaki mgm ve başka bir sunucudaki pagila veritabanlarını verelim:
mgm = host=/tmp port=5432 dbname=mgm
pagila2 = host=diger.sunucu.ipsi port=5432 dbname=pagila
Burada pagila2 adını pagila veritabanı için kullandık. Yani veritabanının adı aslında pagila, ama biz farklı bir ad vererek bağlanabiliyoruz:
$ psql pagila -p 6432
psql: ERROR: No such database
$ psql pagila2 -p 6432
pagila2=#
Ardından [pgbouncer]
bölümünde de aşağıdaki değişiklikleri yapınız:
listen_addr = * (ya da istediğiniz doğru bir harici IP)
auth_type = md5
auth_file= /etc/pgbouncer/userlist.txt
server_reset_query = DISCARD ALL;
Ayrıca max_client_conn
ve default_pool_size
değişkenlerini de ayarlayabilirsiniz.
Burada önemli olan parametrelerden birisi pool_mode
’dur. Öntanımlı değeri olan session, önerilen değerdir. session değerinde, o pool o session boyunca açık tutulur. transaction ve statement değerlerinde, o pool sırası ile transaction ya da SQL statement sonrasında bırakılır. Bu da performans sorununa neden olur. Ayrıca session, PostgreSQL’in tüm özelliklerini (SET/RESET, LISTEN/NOTIFY, PREPARE vs) kullanabileceğiz değerdir. Transaction pooling’de bunların önemli bir kısmı kullanılamaz.
pgBouncer’ı systemctl start pgbouncer
ile başlatabilir, systemctl stop pgbouncer
ile durdurulabilir, systemctl restart pgbouncer
ile yeniden başlatılabilir. Log’unu /var/log/pgbouncer/pgbouncer.log içine yazar.
Pgbouncer yönetimini PgBouncer’ın kendi içinden yapabilirsiniz:
$ psql pgbouncer -p 6432
pgbouncer=# show help;
NOTICE: Console usage
DETAIL:
SHOW HELP|CONFIG|DATABASES|POOLS|CLIENTS|SERVERS|
VERSION
SHOW FDS|SOCKETS|ACTIVE_SOCKETS|LISTS|MEM
SET key = arg
RELOAD
PAUSE [<db>]
SUSPEND
RESUME [<db>]
SHUTDOWN
pgbouncer=#
Örneğin PAUSE ile o veritabanına yapılacak yeni bağlantıları geçici olarak durdurabilirsiniz, RESUME ile devam ettirebilirsiniz.
pgbouncer=# PAUSE mgm;
SHOW DATABASES; ile de pool bilgilerini görebilirsiniz:
pgbouncer=# SHOW DATABASES;
name | host | port | database | force_user | pool_size
-----------+-----------+------+-----------+------------+-----------
mgm | 127.0.0.1 | 5432 | mgm | | 20
pagila | 127.0.0.1 | 5432 | pagila | | 20
pgbouncer | | 5450 | pgbouncer | pgbouncer | 2
(3 rows)
İstatistik de alabilirsiniz:
pgbouncer=# show stats;
-[ RECORD 1 ]----+----------
database | mgm
total_requests | 6
total_received | 3192
total_sent | 4798
total_query_time | 25437
avg_req | 0
avg_recv | 32
avg_sent | 48
avg_query | 4239
-[ RECORD 2 ]----+----------
database | pgbouncer
total_requests | 1
total_received | 0
total_sent | 0
total_query_time | 0
avg_req | 0
avg_recv | 0
avg_sent | 0
avg_query | 0
Üstte bahsettiğim gibi pgBouncer’ı kapatıp açarken bağlantılar kapatılmaz. Bunu aşağıdaki şekilde yapabilirsiniz:
pgbouncer -R -d config.ini
-R
, online restart yapan parametredir. -d
, daemon olarak çalıştırır.