Implementasi PgBouncer pada Odoo

Thoharuddin Hanif
Arunatech
Published in
5 min readJan 12, 2023

Dalam artikel ini, kita akan menggunakan PgBouncer sebagai sebuah Connection Pooler yang berperan sebagai perantara antara Odoo dengan PostgreSQL.

Posisi pgbouncer di antara Odoo dan PostgreSQL

Pertama-tama kita harus mengenali bahwa ada beberapa jenis pooling method yang ada di PgBouncer, diantaranya :

  1. Session Polling : Selama session Odoo masih terhubung dengan PostgreSQL, koneksi yang digunakan oleh Odoo akan tetap dipertahankan. Koneksi tersebut hanya akan dikembalikan ke Pool ketika Odoo sudah melepaskan koneksi dengan PostgreSQL.
  2. Transaction Pooling : Ketika PgBouncer mendeteksi bahwa transaksi di Odoo telah selesai dieksekusi, maka PostgreSQL akan melepaskan koneksi kembali ke Pool.

Bagaimana Odoo Connection Pooling bekerja

Jika kita coba mempelajari bagaimana Odoo Connection Pool bekerja, kita akan menemukan baris comment dibawah ini :

connectionPool odoo versi 13.0

Dari informasi diatas, bisa dibilang bahwa odoo akan tetap mempertahankan koneksi, dengan harapan dapat digunakan lagi di lain waktu. Namun permasalahannya koneksi tersebut tidak pernah ditutup kembali, kecuali menyentuh db_maxconn.

Pada implementasinya, setiap Odoo Workers akan membuka kurang-lebih 3 Connection Pool, sehingga dengan 10 Workers saja maka 30 Connection akan terus dibuka untuk satu Odoo.

Dari penjelasan diatas, dapat diambil kesimpulan bahwa Odoo secara default mengadopsi jenis Session Pooling, yang artinya koneksi-koneksi odoo akan terus dipertahankan dan hal seperti ini sangat mungkin terjadi pada server anda :

RAM Server Full

Dan jika anda mengakses pg_top pada PostgreSQL, anda akan menemukan bagaimana PostgreSQL menjaga koneksi anda dan bagaiman koneksi-koneksi tersebut menghabiskan Memory yang anda miliki.

Baris koneksi yang dipertahankan PostgreSQL dalam kondisi sleep

Bagaimana PgBouncer bekerja

Pada dasarnya, kita ingin mencoba menyelesaikan permasalahan yang disebabkan oleh Session Pooling, dimana koneksi database terlalu banyak “disimpan” sehingga menyebabkan penggunaan RAM jadi tidak efisien, bahkan di satu titik bisa menyebabkan Error seperti contohnya :

PostgreSQL Error : — FATAL: sorry, too many clients already

Mengingat sifat Session Pooling yang terus menyimpan koneksi sampai Odoo melepaskan diri dari PostgreSQL, yang artinya diatasi ketika Odoo dan PostgreSQL di restart, seketika setelah itu koneksi-koneksi baru akan terbuat ketika Odoo mulai digunakan lagi, permasalahan yang sama akan terus terulang jika kita tidak segera dapat menyelesaikan masalahnya.

PgBouncer bertugas membantu membatasi jumlah koneksi tersebut, dengan mengatur lalu lintas koneksi dari Odoo ke PostgreSQL. Odoo workers tetap akan terhubung ke PgBouncer secara terus-menerus, sedangkan di sisi lain PgBouncer juga akan menutup koneksi yang tidak diperlukan di PostgreSQL.

Tujuan dari penggunaan PgBouncer disini adalah bagaimana Connection Pooling ini dapat menekan efisiensi penggunaan koneksi sesuai dengan resource yang ada sambil tetap mempertahankan semua fitur di Odoo tetap dapat berjalan sebagaimana mestinya.

Baris koneksi setelah ditekan / dibatasi menggunakan PgBouncer

Installasi PgBouncer

Lakukan installasi PgBouncer dengan menjalankan perintah.

sudo apt-get update
sudo apt-get install pgbouncer

Jika proses installasi berjalan dengan lancar, berikutnya lakukan konfigurasi pada pgbouncer.ini.

sudo nano /etc/pgbouncer/pgbouncer.ini

Kita akan mengubah beberapa parameter, sebagai contoh, saya menggunakan konfigurasi seperti berikut ini (detail dari parameter-parameter dibawah dapat ditemukan disini) :

...
[databases]
yourdatabase = host=127.0.0.1 port=5432 dbname=yourdatabase

[pgbouncer]
listen_port = 6432
listen_addr = 127.0.0.1
auth_type = trust
pool_mode = transaction
default_pool_size = 50
max_client_conn = 100
min_pool_size = 5
reserve_pool_size = 20
reserve_pool_timeout = 3
...

Lakukan restart pada PgBouncer jika dirasa proses konfigurasi sudah selesai.

sudo /etc/init.d/pgbouncer restart

Menghubungkan PgBouncer dengan PostgreSQL

Ketika PgBouncer menerima koneksi, pertama-tama ia melakukan otentikasi atas nama server PostgreSQL. Jika kata sandi diberikan, otentikasi dapat dilakukan dengan dua cara:

  • PgBouncer pertama-tama memeriksa file userslist.txt - Jika nama pengguna ada di file ini, kata sandi dicocokkan dengan nilai yang diberikan. Tidak ada koneksi ke server PostgreSQL yang dibuat.
  • Jika autentikasi passthrough disiapkan, dan pengguna tidak ditemukan di file userslist.txt, PgBouncer mencari auth_query. Itu terhubung ke PostgreSQL sebagai predefined user (yang kata sandinya harus ada di file userslist.txt) dan mengeksekusi auth-query untuk menemukan password user dan mencocokkannya dengan nilai yang disediakan.

Dalam hal ini kita perlu mempersiapkan username/password yang cocok antara di PostgreSQL dengan yang terdaftar di PgBouncer, sebagai contoh pertama masuk ke dalam user PostgreSQL.

sudo su postgres

Buat user baru di dalam PostgreSQL.

psql -c "alter user odoo with password 'yourpassword'"

Daftarkan user yang telah kita buat sebelumnya ke dalam PgBouncer dengan membuka userlist.txt.

sudo nano /etc/pgbouncer/userlist.txt

Lalu masukkan credential user di dalam userlist.txt seperti ini.

"odoo" "yourpassword"

untuk mengujicoba apakah proses autentikasi sukses, kita dapat menjalankan perintah psql, dengan mengarahkan koneksi menuju port 6423 (PgBouncer).

psql -U odoo -p 6432 -h localhost dbname=yourdatabase

Anda akan melihat bahwa psql dapat mengakses database, melalui port 6423.

User dapat mengakses database melalui port 6423 (PgBouncer)

Module Bus Alt Connection

Saat melakukan konfigurasi PgBouncer, kita mengubah pool_mode yang sebelumnya adalah Session menjadi Transaction.

Jika kita memilih pool_mode = session, maka satu koneksi akan diikat ke proses odoo yang diberikan sampai mati, yang sebenarnya ingin kita ubah. Menjadi, untuk melepaskan koneksi setelah transaksi selesai, menggunakan pool_mode = transaction.

Ini berfungsi dengan baik, kecuali untuk fitur longpolling Odoo yang bergantung pada mekanisme Listen/Notify dari PostgreSQL, yang tidak kompatibel dengan mode tersebut.

Lebih tepatnya, pernyataan Notify ditransfer dengan benar oleh PgBouncer dalam mode itu, hanya pernyataan Listen yang tidak (karena untuk itu perlu menjaga koneksi tetap terhubung).

Jadi untuk koneksi Listen ini kita memerlukan odoo untuk terhubung langsung ke PostgreSQL, tanpa melalui PgBouncer.

Untuk memenuhi kebutuhan tersebut, maka diperlukan modul tambahan bernama Bus Alt Connection yang dapat ditemukan disini.

Setelah mengunduh module tersebut, pastikan untuk meletakkan module ini pada repository yang dapat diakses oleh odoo dan terdaftar dalam addons_path di odoo.conf.

Konfigurasi Odoo

Langkah terakhir yang perlu kita lakukan adalah melakukan konfigurasi pada odoo. Anda perlu membuka odoo.conf untuk itu :

sudo nano /etc/odoo-server.conf

Lalu sesuaikan parameter-parameter berikut :

db_user = odoo
db_port = 6432
server_wide_modules = bus_alt_connection
imdispatcher_db_host = localhost
imdispatcher_db_port = 5432

Kemudian restart odoo.

sudo netstat -tulpn

Pastikan odoo, PostgreSQL, serta PgBouncer telah aktif serta berjalan beriringan.

Odoo (8069,8072) PostgreSQL (5432) dan PgBouncer (6432) aktif

Jika semua service yang diperlukan berjalan sebagaimana mestinya, seharusnya odoo sudah dapat diakses.

Tampilan awal Odoo

Selamat Mencoba…

--

--