Pooling in PostgresImg

Semua yang perlu kamu ketahui tentang Connection Pooling pada PostgreSQL

Written by ,

| Sep 19, 2022

5 MIN READ

Connection pooling mengacu pada metode membuat wadah koneksi dan menyimpan koneksi tersebut sehingga dapat digunakan kembali.

PostgreSQL memiliki proses postmaster, yang memunculkan proses baru untuk setiap koneksi baru ke database. Proses ini memakan sekitar 2 hingga 3 MB memori yang terjadi setiap kali Anda membuat koneksi ke database. Tanpa penyatuan koneksi untuk setiap koneksi, proses postmaster harus membuat proses baru di backend database yang dapat menggunakan memori 2 hingga 3 MB dan ini menimbulkan masalah jika jumlah koneksi terlalu tinggi (biasanya terlihat pada aplikasi kritikal). Semakin tinggi jumlah koneksi, semakin banyak memori yang digunakan untuk membuat koneksi ini.

Dengan Connection pooling, setiap terdapat permintaan dari aplikasi front-end untuk membuat koneksi ke database, koneksi dibuat dari pool. Setelah sesi atau transaksi selesai, koneksi diberikan kembali ke pool.

Bagaimana Connection Pooling dapat membantu Performa?

Dalam kasus, ada beberapa permintaan untuk membuat koneksi ke database yang sama dan detail nama pengguna yang sama seperti koneksi sebelumnya – connection pooler tidak akan membuat koneksi baru setiap kali ke database, melainkan akan menggunakan kembali koneksi sebelumnya dari pool. Ini membantu dalam mencegah overhead menambah beban untuk membuat koneksi baru ke database setiap kali ada permintaan untuk koneksi database dengan nama pengguna dan detail database yang sama. Pengumpulan koneksi membantu dalam lingkungan di mana ada jumlah koneksi secara bersamaan yang lebih tinggi ke database.

Meskipun PostgreSQL tidak memiliki pooler koneksi bawaan, sebagian besar perangkat lunak  yang digunakan sebagai server aplikasi menyediakan connection pool nya sendiri. PostgreSQL memang menyediakan dua alat hebat untuk memecahkan masalah pemborosan sumber daya untuk setiap koneksi ke database yaitu:

  • PGPOOL
  • PGBOUNCER

Kedua alat ini telah dikembangkan oleh komunitas dengan mempelajari arsitektur PostgreSQL dan dirancang khusus untuk database PostgreSQL. Sementara pgbouncer hanya menyediakan penyatuan koneksi, pgpool menyediakan penyatuan koneksi, penyeimbangan beban, ketersediaan tinggi, dan replikasi. Salah satu dari alat ini dapat digunakan berdasarkan jumlah lalu lintas yang Anda harapkan dan arsitektur keseluruhan database Anda. Mari kita lihat bagaimana pgbouncer membantu meningkatkan kinerja database Anda dengan meminimalkan waktu yang diperlukan untuk membuat koneksi baru pada database.

Seperti yang dijelaskan sebelumnya, Pgbouncer adalah alat untuk pool koneksi yang memiliki daya ringan dalam pengoperasiannya untuk PostgreSQL yang secara dramatis mengurangi waktu pemrosesan dan sumber daya untuk memelihara banyak koneksi klien ke satu atau lebih database. Pgbouncer mendukung tiga jenis penyatuan saat memutar koneksi:

  • Session Pooling / Pengumpulan sesi: Koneksi server ditetapkan ke aplikasi klien selama masa pakai koneksi. PgBouncer melepaskan koneksi server kembali ke pool setelah aplikasi klien terputus. Ini adalah metode default.
  • Transaction Pooling / Pengumpulan transaksi: Koneksi server ditetapkan ke aplikasi klien selama durasi transaksi. Ketika PgBouncer mendeteksi penyelesaian transaksi, PgBouncer melepaskan koneksi server kembali ke pool.
  • Statement Pooling: Koneksi server ditetapkan ke aplikasi klien untuk setiap pernyataan. Ketika pernyataan selesai, koneksi server dikembalikan ke pool. Transaksi multi-statement tidak diizinkan untuk mode ini.

Cara menginstal dan mengkonfigurasi Pgbouncer:

Saya akan menggunakan Pgbouncer versi 1.9 pada mesin CentOS 7 untuk ini.

Instalasi:

  1. Unduh file pgbouncer-1.9.0.tar.gz di mesin Linux Anda untuk instalasi. Anda dapat mengunduhnya dari Pgbouncer Download
  2. Ekstrak file, ini akan membuat folder bernama pgbouncer-1.9.0.
  3. Harap pastikan bahwa paket gcc, libevent-devel dan openssl-devel diinstal sebelum melanjutkan dengan konfigurasi. Pindah ke folder pgbouncer-1.9.0 dan jalankan:

# ./configure –prefix=/opt/pgbouncer

–prefix akan memungkinkan Anda untuk menentukan direktori kustom untuk instalasi. Secara default, itu akan di instal di /usr/local

  1. Setelah mengkonfigurasi, jalankan perintah di bawah ini untuk menginstal Pgbouncer

# make

# make install

  1. Setelah instalasi, file konfigurasi Anda dan file run Pgbouncer akan diinstal di lokasi di bawah ini
  • /opt/pgbouncer/share/doc/pgbouncer
  • /opt/pgbouncer/bin
  1. Untuk memulai Pgbouncer dalam mode daemon, jalankan perintah di bawah ini :

# pgbouncer -d /opt/pgbouncer/share/doc/pgbouncer/pgbouncer.ini

Konfigurasi:

  1. Ada dua file konfigurasi yang penting untuk Pgbouncer, pgbouncer.ini dan userlist.txt
  • pgbouncer.ini – File ini berisi semua parameter yang perlu dikonfigurasi untuk Pgbouncer Anda
  • userlist.txt – File ini berisi nama pengguna dan kata sandi basis data Anda untuk otentikasi.
  1. Saya telah mengonfigurasi pgbouncer.ini dan userlist.txt seperti di bawah ini:
  • Pgbouncer.ini
    pool img01

    Benchmarkdb dan enterprise adalah nama alias untuk dua string koneksi. Harap dicatat, pool_size telah ditetapkan untuk tujuan pengujian saja. Ini bukan nilai yang direkomendasikan.
  • Userslist.txt
    pool img02

    File ini mengambil input sebagai “nama pengguna” “kata sandi”. Di mana kata sandi dapat berupa format biasa atau format md5. Kami telah menggunakan kata sandi berformat md5 untuk kedua pengguna.
  • Sekarang restart saja layanan pgbouncer seperti di bawah ini
    pool img03

# pgbouncer -R -d /opt/pgbouncer/share/doc/pgbouncer/pgbouncer.ini

  • Anda dapat memeriksa status pool dan database dengan masuk ke database pgbouncer seperti yang ditunjukkan di bawah ini:

Sekarang, untuk memeriksa & memvalidasi dampak dari connection pooler, kita akan menggunakan pgbench untuk benchmarking dan pgbouncer dalam mode session pooling.

  • pgbench telah diinisialisasi dengan faktor skala 30. pgbouncer memiliki pool_size 100.
  • Kami akan menguji skenario dengan peningkatan koneksi bersamaan mulai dari 300, 400 dan 460. Untuk setiap koneksi, pgbench akan menjalankan 20 transaksi yang akan menghasilkan total 6000, 8000 dan 9200 transaksi masing-masing.

Di bawah ini adalah output dari analisis pengujian
image Conn

Analisis aktivitas umum untuk koneksi

  • Koneksi melalui Pgbouncer
    pool img04
  • Koneksi langsung ke database
    pool img05

Pengujian dapat dilakukan dengan pengaturan berbeda untuk pool_size dan pool_mode untuk hasil yang lebih baik sesuai kebutuhan aplikasi.

Terlepas dari detail pool_size, pool_mode dan koneksi, Anda juga dapat mengatur parameter lain di file konfigurasi pgbouncer. Beberapa parameter berguna lainnya adalah sebagai berikut:

  • min_pool_size – Parameter ini menentukan jumlah minimum koneksi server di pool. Setiap saat menggunakan pgbouncer, Anda akan melihat banyak koneksi di server Anda baik idle atau aktif.
  • reserve_pool_size – Koneksi tambahan untuk digunakan jika terjadi masalah.
  • server_idle_timeout (seconds) – Semua koneksi server akan dihapus setelah tidak digunakan selama beberapa detik ini.
  • idle_transaction_timeout (seconds) – Tutup koneksi yang berada dalam status ‘idle in transaction’ selama beberapa detik ini.
  • max_client_conn – Jumlah total klien yang dapat terhubung.

Akhirnya, untuk menyimpulkan, seperti yang terlihat pada grafik di atas, dengan peningkatan koneksi bersamaan pgbouncer meningkatkan throughput keseluruhan. Nantikan artikel saya yang akan datang, saya akan membahas lebih detail tentang pgpool. Ditunggu ya!


Go to Top