| IT Group Indonesia

Meningkatkan Performa Cluster EDB Postgre Anda Menggunakan Pgpool

by Azman Agung Nugraha

November 18, 2025

Saat PostgreSQL Anda mulai kewalahan karena transaksi yang makin banyak, di titik itulah sistem Anda perlu di-upgrade. Salah satu cara paling efektif adalah dengan menambahkan Load Balancer di cluster PostgreSQL. Dengan begitu, beban kerja bisa terbagi rata, performa menjadi lebih cepat, dan sistem tetap aman walau traffic terus meningkat.

Apa itu PGPOOL-II?

Pgpool-II adalah middleware yang berada di antara server PostgreSQL dan client database PostgreSQL. Beberapa fitur Pgpool-II diantaranya:

  • Connection Pooling

Pgpool-II menyimpan koneksi ke server PostgreSQL, dan menggunakannya kembali setiap kali ada koneksi baru dengan properti yang sama (yaitu nama pengguna, database, versi protokol) masuk. Cara Ini dapat mengurangi koneksi berlebih, dan meningkatkan throughput sistem secara keseluruhan.

  • Load Balancing

Jika database menggunakan replication, maka SELECT query yang dijalankan di server mana pun akan menghasilkan data yang sama. Dengan memanfaatkan fitur ini, Pgpool-II mendistribusikan SELECT query ke beberapa PostgreSQL server, sehingga beban kerja lebih merata dan system throughput meningkat. Semakin banyak PostgreSQL server yang digunakan, semakin tinggi pula peningkatan performanya. Mekanisme load balancing ini paling optimal ketika banyak user menjalankan banyak query secara bersamaan.

  • Membatasi Koneksi Berlebih

PostgreSQL memiliki batas maksimal jumlah simultaneous connections. Jika batas ini tercapai, koneksi baru akan langsung ditolak. Menambah maximum connections memang memungkinkan lebih banyak koneksi, tetapi juga meningkatkan penggunaan resource yang dapat menurunkan performa sistem. Pgpool-II juga memiliki limitasi koneksi, namun berbeda dari PostgreSQL: koneksi tambahan tidak akan langsung ditolak, melainkan dimasukkan ke dalam antrean (queued) hingga slot koneksi tersedia.

  • Memori Cache dalam Kueri

Dalam cache memori memungkinkan untuk menyimpan sepasang pernyataan SELECT dan hasilnya. Jika SELECT yang identik masuk, Pgpool akan langsung mengembalikan nilai dari cache. Karena tidak ada penguraian SQL atau akses ke PostgreSQL yang terlibat, penggunaan memory cache bisa jadi sangat cepat. Namun, dalam beberapa kasus, performanya justru bisa lebih lambat dibanding jalur normal karena adanya overhead saat menyimpan data ke cache.

Pgpool berkomunikasi dengan protokol backend dan frontend PostgreSQL, dan menyampaikan pesan di antara keduanya. Oleh karena itu, aplikasi database (frontend) berpikir bahwa Pgpool adalah server PostgreSQL yang sebenarnya, sementara server (backend) melihat Pgpool sebagai salah satu kliennya. Dengan kata lain, Pgpool bersifat transparent bagi server maupun client. Hal ini memungkinkan aplikasi database yang sudah ada tetap dapat digunakan bersama Pgpool tanpa perlu mengubah source code.

Bagaimana Load Balancing Bekerja pada Pgpool?

Pgpool terletak di antara klien dan server PostgreSQL, ia mampu memahami protokol backend dan frontend PostgreSQL dan menyampaikan permintaan klien ke server PostgreSQL. Karena Pgpool-II menggunakan parser bawaan dari PostgreSQL, ia mampu melakukan SQL parsing terhadap request yang dikirim client. Setelah itu, Pgpool-II akan merutekan (route) query dengan mekanisme berikut:

  1. Pgpool menerima permintaan klien.
  2. Pgpool mengurai permintaan query di latar belakang.
  3. Jika query menghasilkan transaksi Delete/Update/Insert, Pgpool-II mengirimkannya ke Master DB.
  4. Jika query menghasilkan transaksi Select apapun, Pgpool-II mengirimkannya ke node Load Balance yang dipilih dari semua server PostgreSQL yang tersedia terkait dengan parameter konfigurasi backend_weight.

 

Untuk mengaktifkan Load Balancing di Pgpool, Anda harus mengaktifkan parameter load_balance_mode dan juga parameter backend_weight. Seperti yang saya sebutkan di bagian sebelumnya, untuk melakukan load balancing, Pgpool-II memilih node load balancing dan mengarahkan query SELECT ke node tersebut. Node load balancing dipilih secara acak sesuai dengan bobot yang ditentukan di backend_weight.

Misalnya, ada tiga node PostgreSQL dalam replikasi PostgreSQL, dan node 0 adalah yang utama. Jika bobot semua node PostgreSQL sama, kueri didistribusikan secara merata (node0 – node 2 menerima kueri pemilihan sebesar 33,33% setiap node).

backend_weight0 = 1
backend_weight1 = 1
backend_weight2 = 1

Jika Node Utama didedikasikan untuk mengeksekusi query WRITE, Anda dapat menentukan bobot node 1 hingga node 2:

backend_weight0 = 0

backend_weight1 = 1

backend_weight2 = 1

Jika primer digunakan untuk mengeksekusi query WRITE dan SELECT juga, Anda dapat menentukan bobot node 0 hingga node 2:

backend_weight0 = 0,2

backend_weight1 = 0,4

backend_weight2 = 0,4

Mode Pembagian Beban di Pgpool-II

Saat load balancing diaktifkan, setiap sesi user ke PostgreSQL melalui Pgpool-II akan menggunakan dua atau lebih DB node untuk memproses request. Satu node akan bertindak sebagai main server (untuk perintah INSERT, UPDATE, dan DELETE), sementara node lainnya menjadi load_balance_node yang menangani SELECT query agar beban dapat didistribusikan.
 
  • Mode Session Level Load Balancing pada Pgpool

Secara default, mode distribusi beban di Pgpool-II adalah “Session Level.” Artinya, permintaan baca node yang dikirim ditentukan saat client pertama kali terkoneksi ke Pgpool-II. Misalnya, jika ada node 0 dan node 1, maka setiap session baru akan memilih salah satu node secara acak. Dalam jangka panjang, probabilitas pemilihan node akan mengikuti rasio yang ditentukan oleh backend_weight0 dan backend_weight1. Jika kedua nilai tersebut sama, maka peluang setiap node untuk terpilih juga akan sama besar.

  • Mode Statement Level Load Balancing pada Pgpool
Jika statement_level_load_balance disetel ke “on,” maka node Load Balance akan ditentukan setiap kali query dijalankan, bukan hanya saat session dimulai. Ini berguna untuk aplikasi yang memiliki connection pool sendiri dan terus terhubung ke Pgpool-II, sehingga node load balancing tidak berubah sejak aplikasi berjalan. Kasus lain yang cocok adalah batch application. Jenis aplikasi ini biasanya menghasilkan banyak request tetapi hanya menggunakan satu session. Dengan statement level load balancing, aplikasi tersebut tetap bisa memanfaatkan banyak server secara bersamaan.
 

Manakah mode terbaik untuk aplikasi Anda?

Memilih mode load balancing yang tepat sangatlah penting. Beberapa hal yang perlu dipertimbangkan antara lain:

  • Jika cluster hanya memiliki satu server primer dan satu server siaga, tidak perlu mengaktifkan statement level load balance.
  • Jika server memiliki lebih dari satu replika baca dan aplikasi memiliki pool koneksi sendiri, maka statement level load balance adalah pilihan terbaik.
  • Jika aplikasi dalam konfigurasi mengeluarkan beberapa query untuk setiap sesi dan membuat banyak sesi, maka mode session level load balance adalah cara yang tepat. Sementara itu, untuk batch processing dan sesi user yang berlangsung lama, statement-level load balancing memberikan performa yang lebih baik.

 

Semoga artikel ini membantu Anda memahami bagaimana meningkatkan performa PostgreSQL cluster menggunakan Pgpool dengan lebih baik. Jika Anda memerlukan konsultasi, subcriptions, layanan teknis atau managed service untuk PostgreSQL tim ahli ITG siap membantu segala kebutuhan Anda. 

Ikuti terus update seputar teknologi open source database lainnya seperti MongoDB, EDB Postgres, Redis, ELK, dan lainnya di sini.