PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Cara Mencapai Ketersediaan Tinggi PostgreSQL dengan pgBouncer

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nilai yang Dihasilkan di Postgres

  2. Bagaimana Sind() Bekerja di PostgreSQL

  3. MySQL vs PostgreSQL untuk Aplikasi Web

  4. Tampilan Terwujud PostgreSQL

  5. Apa yang baru di Postgres-XL 9.6