Saya memiliki beberapa server PostgreSQL untuk aplikasi web. Biasanya satu master dan beberapa budak dalam mode siaga panas (replikasi streaming asinkron).
Saya menggunakan PGBouncer untuk koneksi pooling: satu instance diinstal pada setiap server PG (port 6432) yang terhubung ke database di localhost. Saya menggunakan mode kumpulan transaksi.
Untuk memuat-menyeimbangkan koneksi read-only saya pada slave, saya menggunakan HAProxy (v1.5) dengan conf kurang lebih seperti ini:
listen pgsql_pool 0.0.0.0:10001
mode tcp
option pgsql-check user ha
balance roundrobin
server master 10.0.0.1:6432 check backup
server slave1 10.0.0.2:6432 check
server slave2 10.0.0.3:6432 check
server slave3 10.0.0.4:6432 check
Jadi, aplikasi web saya terhubung ke haproxy (port 10001), koneksi load-balance pada beberapa pgbouncer yang dikonfigurasi pada setiap slave PG.
Berikut ini adalah grafik representasi arsitektur saya saat ini:
Ini berfungsi sangat baik seperti ini, tetapi saya menyadari bahwa beberapa mengimplementasikan ini sangat berbeda: aplikasi web terhubung ke instance PGBouncer tunggal yang terhubung ke HAproxy yang memuat-menyeimbangkan lebih dari beberapa server PG:
Apa pendekatan terbaik? Yang pertama (yang saya sekarang) atau yang kedua? Adakah keunggulan dari satu solusi di atas yang lain?
Terima kasih