Dalam dunia database, ada banyak konsep umum seperti Ketersediaan Tinggi, Failover, dan Penyatuan koneksi. Semuanya berguna untuk diterapkan pada sistem apa pun, dan bahkan suatu keharusan dalam beberapa kasus.
Pengumpulan koneksi adalah metode untuk membuat kumpulan koneksi dan menggunakannya kembali untuk menghindari membuka koneksi baru ke database setiap saat, yang akan meningkatkan kinerja aplikasi Anda secara signifikan. PgBouncer adalah kumpulan koneksi populer yang dirancang untuk PostgreSQL, tetapi itu tidak cukup untuk mencapai PostgreSQL High Availability dengan sendirinya karena tidak memiliki konfigurasi multi-host, failover, atau deteksi.
Menggunakan Load Balancer adalah cara untuk memiliki Ketersediaan Tinggi di topologi database Anda. Ini bisa berguna untuk mengarahkan lalu lintas ke node database yang sehat, mendistribusikan lalu lintas di beberapa server untuk meningkatkan kinerja, atau hanya untuk memiliki satu titik akhir yang dikonfigurasi dalam aplikasi Anda untuk konfigurasi yang lebih mudah dan proses failover. Untuk ini, HAProxy adalah pilihan yang baik untuk melengkapi pooler koneksi Anda, karena merupakan proxy open-source yang dapat digunakan untuk mengimplementasikan ketersediaan tinggi, load balancing, dan proxy untuk aplikasi berbasis TCP dan HTTP.
Di blog ini, kami akan menggunakan kedua konsep, Load Balancer dan Connection pooling (HAProxy + PgBouncer), untuk menerapkan lingkungan Ketersediaan Tinggi untuk database PostgreSQL Anda.
Cara Kerja PgBouncer
PgBouncer bertindak sebagai server PostgreSQL, jadi Anda hanya perlu mengakses database Anda menggunakan informasi PgBouncer (Alamat IP/Nama Host dan Port), dan PgBouncer akan membuat koneksi ke server PostgreSQL, atau akan gunakan kembali jika ada.
Saat PgBouncer menerima koneksi, ia melakukan otentikasi, yang bergantung pada metode yang ditentukan dalam file konfigurasi. PgBouncer mendukung semua mekanisme otentikasi yang didukung oleh server PostgreSQL. Setelah ini, PgBouncer memeriksa koneksi yang di-cache, dengan kombinasi nama pengguna+database yang sama. Jika koneksi cache ditemukan, itu mengembalikan koneksi ke klien, jika tidak, itu membuat koneksi baru. Bergantung pada konfigurasi PgBouncer dan jumlah koneksi yang aktif, koneksi baru mungkin saja diantrekan hingga dapat dibuat, atau bahkan dibatalkan.
Perilaku PgBouncer bergantung pada mode pengumpulan yang dikonfigurasi:
- pengumpulan sesi (default):Saat klien terhubung, koneksi server akan ditetapkan untuk itu selama klien tetap terhubung. Ketika klien terputus, koneksi server akan dimasukkan kembali ke dalam kumpulan.
- pengumpulan transaksi :Koneksi server ditetapkan ke klien hanya selama transaksi. Saat PgBouncer mengetahui bahwa transaksi telah selesai, koneksi server akan dikembalikan ke pool.
- pengumpulan pernyataan :Koneksi server akan dikembalikan ke pool segera setelah kueri selesai. Transaksi multi-pernyataan tidak diizinkan dalam mode ini karena akan rusak.
Untuk menyeimbangkan kueri antara beberapa server, di sisi PgBouncer, mungkin ada baiknya untuk membuat server_lifetime lebih kecil dan juga mengaktifkan server_round_robin. Secara default, koneksi idle digunakan kembali oleh algoritme LIFO, yang mungkin tidak berfungsi dengan baik saat penyeimbang beban digunakan.
Cara Memasang PgBouncer
Kami akan menganggap Anda telah menerapkan klaster PostgreSQL dan HAProxy Anda, dan cluster tersebut aktif dan berjalan, jika tidak, Anda dapat mengikuti entri blog ini untuk menerapkan PostgreSQL untuk Ketersediaan Tinggi dengan mudah.
Anda dapat menginstal PgBouncer pada setiap node database atau pada mesin eksternal, dalam hal apa pun, Anda akan memiliki sesuatu seperti ini:
Untuk mendapatkan software PgBouncer anda bisa menuju ke bagian download PgBouncer, atau gunakan repositori RPM atau DEB. Untuk contoh ini, kita akan menggunakan CentOS 8 dan akan menginstalnya dari repositori resmi PostgreSQL.
Pertama, unduh dan instal repositori yang sesuai dari situs PostgreSQL (jika Anda belum memilikinya):
$ wget https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
$ rpm -Uvh pgdg-redhat-repo-latest.noarch.rpm
Kemudian, instal paket PgBouncer:
$ yum install pgbouncer
Verifikasi instalasi:
$ pgbouncer --version
PgBouncer 1.14.0
libevent 2.1.8-stable
adns: c-ares 1.13.0
tls: OpenSSL 1.1.1c FIPS 28 May 2019
Setelah selesai, Anda akan memiliki file konfigurasi baru yang terletak di /etc/pgbouncer/pgbouncer.ini:
[databases]
[users]
[pgbouncer]
logfile = /var/log/pgbouncer/pgbouncer.log
pidfile = /var/run/pgbouncer/pgbouncer.pid
listen_addr = 127.0.0.1
listen_port = 6432
auth_type = trust
auth_file = /etc/pgbouncer/userlist.txt
admin_users = postgres
stats_users = stats, postgres
Mari kita lihat parameter ini satu per satu:
- Bagian database [database]: Ini berisi pasangan kunci=nilai di mana kunci akan diambil sebagai nama database dan nilai sebagai daftar gaya string koneksi libpq dari pasangan kunci=nilai.
- Bagian pengguna [pengguna]: Ini berisi pasangan kunci=nilai di mana kunci akan diambil sebagai nama pengguna dan nilai sebagai daftar gaya string koneksi libpq dari pasangan kunci=nilai pengaturan konfigurasi khusus untuk pengguna ini.
- file log :Menentukan file log. File log tetap terbuka, jadi setelah rotasi kill -HUP atau di konsol RELOAD; harus dilakukan.
- pidfile :Menentukan file PID. Tanpa set pidfile, daemon tidak diperbolehkan.
- listen_addr :Menentukan daftar alamat tempat mendengarkan koneksi TCP. Anda juga dapat menggunakan * yang berarti "dengarkan di semua alamat". Jika tidak disetel, hanya koneksi soket Unix yang diterima.
- listen_port: Port mana yang harus didengarkan. Berlaku untuk soket TCP dan Unix. Port default adalah 6432.
- auth_type: Cara mengautentikasi pengguna.
- auth_file :Nama file untuk memuat nama pengguna dan kata sandi.
- admin_users :Daftar pengguna database yang dipisahkan koma yang diizinkan untuk terhubung dan menjalankan semua perintah di konsol.
- stats_users :Daftar pengguna database yang dipisahkan koma yang diizinkan untuk terhubung dan menjalankan kueri hanya-baca di konsol.
Ini hanya contoh dari file konfigurasi default, karena aslinya memiliki 359 baris, tetapi baris lainnya dikomentari secara default. Untuk mendapatkan semua parameter yang tersedia, Anda dapat memeriksa dokumentasi resmi.
Cara Menggunakan PgBouncer
Sekarang, mari kita lihat konfigurasi dasar untuk membuatnya bekerja.
File konfigurasi pgbouncer.ini:
$ cat /etc/pgbouncer/pgbouncer.ini
[databases]
world = host=127.0.0.1 port=5432 dbname=world
[pgbouncer]
logfile = /var/log/pgbouncer/pgbouncer.log
pidfile = /var/run/pgbouncer/pgbouncer.pid
listen_addr = *
listen_port = 6432
auth_type = md5
auth_file = /etc/pgbouncer/userlist.txt
admin_users = admindb
Dan file otentikasi:
$ cat /etc/pgbouncer/userlist.txt
"admindb" "root123"
Jadi, dalam hal ini, saya telah menginstal PgBouncer di node database yang sama, mendengarkan di semua alamat IP, dan terhubung ke database PostgreSQL yang disebut "dunia". Saya juga mengelola pengguna yang diizinkan dalam file userlist.txt dengan kata sandi teks biasa yang dapat dienkripsi jika diperlukan.
Untuk memulai layanan PgBouncer, Anda hanya perlu menjalankan perintah berikut:
$ pgbouncer -d /etc/pgbouncer/pgbouncer.ini
Di mana -d berarti “daemon”, sehingga akan berjalan di latar belakang.
$ netstat -pltn
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:6432 0.0.0.0:* LISTEN 4274/pgbouncer
tcp6 0 0 :::6432 :::* LISTEN 4274/pgbouncer
Seperti yang Anda lihat, PgBouncer aktif dan menunggu koneksi di port 6432. Untuk mengakses database PostgreSQL, jalankan perintah berikut menggunakan informasi lokal Anda (port, host, nama pengguna, dan nama database) :
$ psql -p 6432 -h 127.0.0.1 -U admindb world
Password for user admindb:
psql (12.4)
Type "help" for help.
world=#
Perlu diingat bahwa nama database (dunia) adalah database yang dikonfigurasi dalam file konfigurasi PgBouncer Anda:
[databases]
world = host=127.0.0.1 port=5432 dbname=world
Memantau dan Mengelola PgBouncer
Daripada mengakses database PostgreSQL, Anda dapat terhubung langsung ke PgBouncer untuk mengelola atau memantaunya. Untuk ini, gunakan perintah yang sama yang Anda gunakan sebelumnya, tetapi ubah database menjadi “pgbouncer”:
$ psql -p 6432 -h 127.0.0.1 -U admindb pgbouncer
Password for user admindb:
psql (12.4, server 1.14.0/bouncer)
Type "help" for help.
pgbouncer=# SHOW HELP;
NOTICE: Console usage
DETAIL:
SHOW HELP|CONFIG|DATABASES|POOLS|CLIENTS|SERVERS|USERS|VERSION
SHOW FDS|SOCKETS|ACTIVE_SOCKETS|LISTS|MEM
SHOW DNS_HOSTS|DNS_ZONES
SHOW STATS|STATS_TOTALS|STATS_AVERAGES|TOTALS
SET key = arg
RELOAD
PAUSE [<db>]
RESUME [<db>]
DISABLE <db>
ENABLE <db>
RECONNECT [<db>]
KILL <db>
SUSPEND
SHUTDOWN
SHOW
Sekarang, Anda dapat menjalankan berbagai perintah PgBouncer untuk memantaunya:
TAMPILKAN STATS_TOTALS:
pgbouncer=# SHOW STATS_TOTALS;
database | xact_count | query_count | bytes_received | bytes_sent | xact_time | query_time | wait_time
-----------+------------+-------------+----------------+------------+-----------+------------+-----------
pgbouncer | 1 | 1 | 0 | 0 | 0 | 0 | 0
world | 2 | 2 | 59 | 234205 | 8351 | 8351 | 4828
(2 rows)
TAMPILKAN SERVER:
pgbouncer=# SHOW SERVERS;
type | user | database | state | addr | port | local_addr | local_port | connect_time | request_time
| wait | wait_us | close_needed | ptr | link | remote_pid | tls
------+---------+----------+--------+-----------+------+------------+------------+-------------------------+-------------------------
+------+---------+--------------+----------------+----------------+------------+-----
S | admindb | world | active | 127.0.0.1 | 5432 | 127.0.0.1 | 45052 | 2020-09-09 18:31:57 UTC | 2020-09-09 18:32:04 UTC
| 0 | 0 | 0 | 0x55b04a51b3d0 | 0x55b04a514810 | 5738 |
(1 row)
TAMPILKAN KLIEN:
pgbouncer=# SHOW CLIENTS;
type | user | database | state | addr | port | local_addr | local_port | connect_time | request_time
| wait | wait_us | close_needed | ptr | link | remote_pid | tls
------+---------+-----------+--------+-----------+-------+------------+------------+-------------------------+-----------------------
--+------+---------+--------------+----------------+----------------+------------+-----
C | admindb | pgbouncer | active | 127.0.0.1 | 46950 | 127.0.0.1 | 6432 | 2020-09-09 18:29:46 UTC | 2020-09-09 18:55:11 UT
C | 1441 | 855140 | 0 | 0x55b04a5145e0 | | 0 |
C | admindb | world | active | 127.0.0.1 | 47710 | 127.0.0.1 | 6432 | 2020-09-09 18:31:41 UTC | 2020-09-09 18:32:04 UT
C | 0 | 0 | 0 | 0x55b04a514810 | 0x55b04a51b3d0 | 0 |
(2 rows)
TAMPILKAN KOLAM RENANG:
pgbouncer=# SHOW POOLS;
database | user | cl_active | cl_waiting | sv_active | sv_idle | sv_used | sv_tested | sv_login | maxwait | maxwait_us | pool_
mode
-----------+-----------+-----------+------------+-----------+---------+---------+-----------+----------+---------+------------+------
-----
pgbouncer | pgbouncer | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | state
ment
world | admindb | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | sessi
on
(2 rows)
Dan untuk mengelolanya...
MUAT ULANG:
pgbouncer=# RELOAD;
RELOAD
JEDA:
pgbouncer=# PAUSE world;
PAUSE
LANJUTKAN:
pgbouncer=# RESUME world;
RESUME
Perintah tersebut hanyalah sebuah contoh. Untuk daftar lengkap perintah, silakan merujuk ke dokumentasi resmi.
Kesimpulan
Menggunakan kombinasi PgBouncer + HAProxy + PostgreSQL adalah cara yang baik untuk mencapai Ketersediaan Tinggi untuk klaster PostgreSQL yang meningkatkan kinerja database Anda pada saat yang bersamaan.
Seperti yang Anda lihat, jika Anda memiliki lingkungan PostgreSQL, yang dapat Anda terapkan menggunakan ClusterControl hanya dengan beberapa klik, Anda dapat dengan mudah menambahkan PgBouncer untuk memanfaatkan penyatuan koneksi untuk sistem Anda.