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

Penyatuan Koneksi PostgreSQL dengan PgBouncer

Penyatuan koneksi adalah cara sederhana namun efektif untuk meningkatkan kinerja aplikasi Anda dan mengurangi beban pada server PostgreSQL Anda. Baca terus untuk mempelajari lebih lanjut tentang menggunakan PgBouncer untuk menggabungkan koneksi PostgreSQL.

Mengapa Connection Pooling?

PostgreSQL memiliki arsitektur penanganan koneksi yang agak berat. Untuk setiap koneksi masuk, postmaster (daemon Postgres utama) mengeluarkan proses baru (biasanya disebut backend ) untuk menanganinya. Meskipun desain ini memberikan stabilitas dan isolasi yang lebih baik, desain ini tidak membuatnya sangat efisien dalam menangani koneksi yang berumur pendek. Koneksi klien Postgres baru melibatkan pengaturan TCP, pembuatan proses, dan inisialisasi backend – semuanya mahal dalam hal waktu dan sumber daya sistem.

Ini tentu saja hanya masalah jika koneksi dibuat terlalu sering dan dibuang tanpa digunakan kembali. Sayangnya, tidak jarang terdapat sekelompok node web yang menjalankan aplikasi yang ditulis dalam PHP atau bahasa sejenis lainnya yang perlu terhubung ke database satu kali per pemuatan halaman. Pekerjaan batch yang dengan cepat membuat banyak koneksi secara berurutan juga umum terjadi. Mempekerjakan connectionpooling dalam skenario seperti itu dapat secara drastis mengurangi beban pada server PostgreSQL Anda dan secara dramatis meningkatkan latensi kueri.

Dengan penyatuan koneksi, klien terhubung ke server proxy yang memelihara serangkaian koneksi langsung ke server PostgreSQL yang sebenarnya. Biasanya, klien tidak (dan tidak seharusnya) menyadari bahwa mereka terhubung ke server proxy daripada server sebenarnya. Proxy dapat berjalan pada node yang sama dengan klien (misalnya, pada setiap node web), dalam hal ini klien dapat terhubung ke proxy melalui soket domain Unix yang memiliki overhead koneksi yang sangat rendah. Bahkan jika proxy berada di node lain dan klien memerlukan koneksi TCP untuk mencapai proxy, overhead backend Postgres baru dapat dihindari.

Apa itu PgBouncer?

PgBouncer adalah sumber terbuka, ringan, pengumpul koneksi biner tunggal untuk PostgreSQL. Itu dapat menggabungkan koneksi ke satu atau lebih database (di server yang mungkin berbeda) dan melayani klien melalui soket domain TCP dan Unix.

PgBouncer memelihara kumpulan koneksi untuk setiap pengguna unik, pasangan basis data. Biasanya dikonfigurasi untuk membagikan salah satu koneksi ini ke koneksi klien masuk baru, dan mengembalikannya kembali ke kumpulan saat klien terputus. Anda dapat mengonfigurasi PgBouncer untuk menggabungkan lebih agresif, sehingga dapat mengambil dan mengembalikan koneksi ke kumpulan di batas transaksi atau pernyataan daripada batas koneksi. Namun, ada beberapa konsekuensi yang mungkin tidak diinginkan.

Anda seharusnya dapat menginstal PgBouncer dengan pengelola paket distro Anda:

# RedHat/CentOS/..
$ sudo yum install pgbouncer

# Debian/Ubuntu/..
$ sudo apt-get install pgbouncer

Ini juga tersedia dari repo Postgres APT dan YUM standar, yang dapat digunakan jika paket distro Anda sudah tua atau rusak.

PgBouncer bergantung pada file konfigurasi utama, biasanya disimpan sebagai/etc/pgbouncer/pgbouncer.ini . Anda dapat memanggil pgbouncer sebagai layanan systemd, atau menjalankannya bahkan tanpa hak pengguna super dengan jalur ke file konfigurasi ini.

Untuk mencobanya, mari buat database db1 dan user user1 di server kita:

$ sudo -u postgres psql
psql (10.6 (Debian 10.6-1.pgdg90+1))
Type "help" for help.

postgres=# create user user1 password 'user1pass';
CREATE ROLE
postgres=# create database db1 owner user1;
CREATE DATABASE
postgres=#

Klien akan terhubung ke database db1 dengan nama pengguna user1 dan kata sandi user1pass . Tujuan kami adalah membuat klien terhubung ke PgBouncer yang akan mem-proxy dan menggabungkan koneksi ke server yang sebenarnya.

Sekarang mari kita buat file (di mana saja) dengan konten berikut:

[databases]
db1 = host=localhost dbname=db1

[pgbouncer]
listen_addr = 127.0.0.1
listen_port = 16432
auth_file = userlist.txt

Kita juga perlu membuat file "userlist.txt" di direktori yang sama, dengan nama pengguna dan kata sandi (hash) pengguna yang diizinkan oleh PgBouncer untuk terhubung. Buat "userlist.txt" dengan konten berikut:

"user1" "md5638b81c77071ea624d1ad4adb1433540"

Nilai kedua adalah MD5 dari "user1passuser1", diawali dengan "md5". Ini adalah konvensi Postgres yang biasa.

Sekarang mari kita mulai PgBouncer di latar depan:

$ /usr/sbin/pgbouncer pgbouncer.ini
2019-02-05 11:46:18.011 10033 LOG file descriptor limit: 1024 (H:1048576), max_client_conn: 100, max fds possible: 130
2019-02-05 11:46:18.012 10033 LOG listening on 127.0.0.1:16432
2019-02-05 11:46:18.013 10033 LOG listening on unix:/tmp/.s.PGSQL.16432
2019-02-05 11:46:18.014 10033 LOG process up: pgbouncer 1.9.0, libevent 2.0.21-stable (epoll), adns: c-ares 1.12.0, tls: OpenSSL 1.1.0j  20 Nov 2018

Kami sekarang telah memulai PgBouncer yang mendengarkan pada 127.0.0.1 port TCP 16432, serta pada soket domain Unix /tmp/.s.PGSQL.16432 . Satu-satunya “database” yang tersedia di server proxy ini adalah db1 . Satu-satunya pengguna yang dapat terhubung ke server ini adalah user1 . Coba sambungkan dengan psql :

$ psql -U user1 -p 16432 -h localhost db1
Password for user user1:
psql (10.6 (Debian 10.6-1.pgdg90+1))
Type "help" for help.

db1=> select inet_server_addr(), inet_server_port();
 inet_server_addr | inet_server_port
------------------+------------------
 127.0.0.1        |             5432
(1 row)

db1=>

Klien (psql) berhasil terhubung ke localhost:16432, tetapi Anda dapat melihat bahwa koneksi sebenarnya sedang diproksi ke localhost:5432.

Anda dapat mencoba memutuskan dan menyambungkan lagi beberapa kali, lalu periksa berapa banyak sambungan yang masih ada di server yang sebenarnya:

postgres=# select count(*) from pg_stat_activity
postgres-#   where datname='db1' and usename='user1';
 count
-------
     1
(1 row)

PgBouncer tidak akan memutuskan koneksi yang sebenarnya ketika klien terputus. Anda dapat mengonfigurasi koneksi minimum, maksimum, dan cadangan yang akan dipertahankan oleh PgBouncer untuk setiap kumpulan dalam file konfigurasi.

Menerapkan PgBouncer

Di mana Anda menginstal dan menjalankan PgBouncer? Ada jawaban yang berbeda, dengan keuntungan yang berbeda:

  • Pada node server Postgres :Anda dapat menginstalnya bersama PostgreSQLserver itu sendiri, pada node yang sama. Klien terhubung ke port PgBouncer daripada port Postgres. Ini memiliki efek Postgres yang "ditingkatkan" yang melakukan penyatuan koneksi secara internal. Anda juga hanya perlu menyimpan satu salinan file konfigurasi untuk PgBouncer. Di sisi lain, ini melibatkan menjalankan sesuatu yang lain juga pada node server PostgreSQL, yang mungkin tidak mudah atau diizinkan (firewall, kebijakan) atau bahkan mungkin (AWSRDS).
  • Pada node klien :Anda dapat menginstal PgBouncer di setiap node klien, misalnya setiap node web menjalankan Apache dan PHP, dan skrip PHP terhubung ke PgBouncer lokal. Ini memiliki keuntungan karena tidak harus mengganggu pengaturan server, dan konfigurasi kumpulan dapat digunakan untuk menjaga agar beban server dapat diprediksi. Di sisi lain, jika jumlah node klien sangat besar, atau dapat sangat bervariasi tergantung pada beban/ lalu lintas, server dapat kelebihan beban dengan cepat.
  • Sebagai kluster mandiri :Opsi ketiga untuk memiliki sekelompok node PgBouncer yang independen dan tidak berkewarganegaraan, yang digawangi oleh penyeimbang beban TCP seperti HAProxy. Pengaturan ini, meskipun lebih rumit daripada dua opsi lainnya, memberikan kontrol dan konfigurasi maksimum.

Administrasi

PgBouncer memungkinkan pengguna yang ditandai sebagai admin untuk terhubung ke database virtual yang disebut "pgbouncer" dan mengeluarkan perintah untuk mengontrol server dan melihat statistik. Untuk mencobanya, pertama-tama tandai “user1” sebagai admin dengan memodifikasi file pgbouncer.ini:

[databases]
db1 = host=localhost dbname=db1

[pgbouncer]
listen_addr = 127.0.0.1
listen_port = 16432
auth_file = userlist.txt
admin_users = user1

Sekarang user1 dapat terhubung ke database bernama “pgbouncer”:

$ psql -U user1 -p 16432 -h localhost pgbouncer
Password for user user1:
psql (10.6 (Debian 10.6-1.pgdg90+1), server 1.9.0/bouncer)
Type "help" for help.

pgbouncer=#

Dari sini, Anda dapat melakukan berbagai hal seperti mengaktifkan atau menonaktifkan database tertentu, memeriksa dan memuat ulang konfigurasi, dan banyak lagi:

pgbouncer=# RELOAD;
RELOAD
pgbouncer=# DISABLE db1;
DISABLE
pgbouncer=# ENABLE db1;
ENABLE
pgbouncer=# SHOW FDS;
 fd |  task  | user  | database |   addr    | port  |     cancel     | link | client_encoding | std_strings | datestyle | timezone  | pa
----+--------+-------+----------+-----------+-------+----------------+------+-----------------+-------------+-----------+-----------+---
  6 | pooler |       |          | 127.0.0.1 | 16432 |              0 |    0 |                 |             |           |           |
  7 | pooler |       |          | unix      | 16432 |              0 |    0 |                 |             |           |           |
  9 | server | user1 | db1      | 127.0.0.1 |  5432 | 45404395804679 |    0 | UTF8            | on          | ISO, MDY  | localtime |
(3 rows)

Pemantauan

Ada juga perintah untuk menampilkan berbagai statistik tentang PgBouncer, termasuk:

  • Statistik per database tentang durasi kueri, waktu tunggu klien, penggunaan jaringan, jumlah transaksi
  • Statistik per kumpulan tentang jumlah klien yang aktif dan menunggu, koneksi server yang menganggur dan digunakan

Statistik diambil dengan perintah gaya “SHOW xyz”, seperti ini untuk mengambil statistik yang terkait dengan fetchpool:

pgbouncer=# SHOW POOLS;
-[ RECORD 1 ]---------
database   | db1
user       | user1
cl_active  | 0
cl_waiting | 0
sv_active  | 0
sv_idle    | 0
sv_used    | 1
sv_tested  | 0
sv_login   | 0
maxwait    | 0
maxwait_us | 0
pool_mode  | session
-[ RECORD 2 ]---------
database   | pgbouncer
user       | pgbouncer
cl_active  | 1
cl_waiting | 0
sv_active  | 0
sv_idle    | 0
sv_used    | 0
sv_tested  | 0
sv_login   | 0
maxwait    | 0
maxwait_us | 0
pool_mode  | statement

Bacaan Lebih Lanjut

Halaman Beranda PgBouncer memiliki detail lebih lanjut tentang berbagai fitur dan opsi konfigurasi PgBouncer.

  • Halaman Beranda PgBouncer
  • Repositori GitHub PgBouncer
  • Postgres Wikimemiliki informasi tentang penyatuan koneksi
  • Pgpool adalah pilihan lain untuk penyatuan koneksi

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara mendapatkan kueri atribut kolom dari nama tabel menggunakan PostgreSQL?

  2. mysql_insert_id alternatif untuk postgresql

  3. Menggunakan Kubernetes untuk Menerapkan PostgreSQL

  4. PostgreSQL:masalah penyandian pada Windows saat menggunakan utilitas baris perintah psql

  5. Menghilangkan PostgreSQL Split-Brain di Database Multi-Cloud