Table of Contents
Saat PostgreSQL Anda mulai menerima lebih banyak transaksi dan perlu ditingkatkan, harap pertimbangkan untuk menggunakan Load Balancer untuk cluster PostgreSQL. Ini akan sangat bagus dan memberi Anda peningkatan performa pada saat pengambilan data pada PostgreSQL Anda.
Apa itu PGPOOL-II?
Pgpool-II adalah middleware yang bekerja antara server PostgreSQL dan Client database PostgreSQL. Ini didistribusikan di bawah lisensi yang mirip dengan BSD dan MIT. Pgpool-II menyediakan fitur-fitur berikut.
- Penyimpanan Koneksi
Pgpool-II menyimpan koneksi ke server PostgreSQL, dan menggunakannya kembali setiap kali koneksi baru dengan properti yang sama (yaitu nama pengguna, database, versi protokol). Ini dapat mengurangi koneksi berlebih, dan meningkatkan throughput sistem secara keseluruhan. - Pembagian Beban
Jika database direplikasi, mengeksekusi kueri SELECT di server mana pun akan mengembalikan hasil yang sama. Pgpool-II memanfaatkan fitur replikasi untuk mengurangi beban pada setiap server PostgreSQL dengan mendistribusikan kueri SELECT di antara beberapa server, meningkatkan throughput sistem secara keseluruhan. Dan baiknya, kinerja meningkat secara proporsional dengan jumlah server PostgreSQL. Keseimbangan beban berfungsi paling baik dalam situasi di mana ada banyak pengguna yang menjalankan banyak kueri secara bersamaan. - Membatasi Koneksi Berlebih
Ada batasan jumlah maksimum koneksi bersamaan yang ada di PostgreSQL, dan koneksi akan ditolak setelah mencapai jumlah yang dibatasi. Mengatur jumlah koneksi maksimum, bagaimanapun akan meningkatkan konsumsi sumber daya dan mempengaruhi kinerja sistem. pgpool-II juga memiliki batasan jumlah koneksi maksimum, tetapi koneksi tambahan akan diantrekan alih-alih segera mengembalikan pesan galat. - Memori Cache dalam Kueri
Dalam cache memori memungkinkan untuk menyimpan sepasang pernyataan SELECT dan hasilnya. Jika SELECT yang identik masuk, Pgpool-II mengembalikan nilai dari cache. Karena tidak ada penguraian SQL atau akses ke PostgreSQL yang terlibat, penggunaan cache memori sangat cepat. Di sisi lain, mungkin lebih lambat dari jalur normal dalam beberapa kasus, karena menambahkan beberapa nilai penyimpanan data cache.
Pgpool-II berkomunikasi dengan protokol backend dan frontend PostgreSQL, dan menyampaikan pesan antara backend dan frontend. Oleh karena itu, aplikasi database (frontend) berpikir bahwa Pgpool-II adalah server PostgreSQL yang sebenarnya, dan server (backend) melihat Pgpool-II sebagai salah satu kliennya. Pgpool-II transparan untuk server dan klien, aplikasi database yang ada dapat digunakan dengan Pgpool-II hampir tanpa mengubah sumbernya.
Bagaimana Pgpool-II Melakukan Pembagian Beban?
Pgpool-II 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 telah mengadopsi parser dari PostgreSQL, yang dapat melakukan cara parsing permintaan klien. Pgpool-II merutekan kueri sebagai berikut:
- Pgpool-II menerima permintaan klien.
- Pgpool-II mengurai permintaan query di latar belakang.
- Jika query menghasilkan transaksi Delete/Update/Insert, Pgpool-II mengirimkannya ke Database Utama.
- Jika kueri menghasilkan transaksi Select, Pgpool-II mengirimkannya ke server Load Balance yang dipilih dari semua server PostgreSQL yang tersedia terkait dengan parameter konfigurasi backend_weight.
Untuk mengaktifkan Load Balancing di Pgpool-II, 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 kueri 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, query didistribusikan secara merata (node 0 – node 2 akan menerima kueri pemilihan sebesar 33,33% setiap node).
backend_weight1 = 1
backend_weight2 = 1
Jika Node Utama didedikasikan untuk mengeksekusi kueri WRITE, Anda dapat menentukan bobot node 1 hingga node 2:
backend_weight1 = 1
backend_weight2 = 1
Jika primer digunakan untuk mengeksekusi kueri WRITE dan SELECT juga, Anda dapat menentukan bobot node 0 hingga node 2:
backend_weight1 = 0,4
backend_weight2 = 0,4
Mode Pembagian Beban di Pgpool-II
Saat load balancing diaktifkan, setiap sesi pengguna ke server PostgreSQL melalui Pgpool-II menggunakan dua atau lebih server database untuk melayani permintaan klien. Salah satunya adalah server utama (untuk pernyataan INSERT/UPDATE/DELETE) sementara yang lain adalah load_balance_node yang digunakan untuk mengirimkan kueri SELECT untuk mendistribusikan beban.
A. Mode Sessio-Level Load Balancing pada Pgpool-II
Secara default, mode distribusi beban pada Pgpool-II adalah “Session Level” yang berarti permintaan yang dikirim akan ditentukan saat klien terhubung ke Pgpool-II. Misalnya, jika kita memiliki node 0 dan node 1, salah satu node dipilih secara acak setiap kali sesi baru dibuat. Dalam jangka panjang, kemungkinan node mana yang dipilih akan semakin mendekati rasio yang ditentukan oleh backend_weight0 dan backend_weight1. Jika kedua nilai tersebut sama, peluang terpilihnya setiap simpul adalah sama.
B. Mode Statement-Level Load Balancing pada Pgpool-II
Jika statement_level_load_balance di hidupkan ke “on”, node Load Balance ditentukan pada saat setiap query dimulai. Ini berguna jika aplikasi memiliki pool koneksi sendiri yang terus terhubung ke Pgpool-II dan node penyeimbang beban tidak akan berubah setelah aplikasi dimulai. Kasus penggunaan lainnya adalah aplikasi batch. Ini mengeluarkan banyak sekali permintaan tetapi hanya ada 1 sesi. Dengan statement level load balancing, ia dapat menggunakan banyak server.
Manakah mode terbaik untuk aplikasi Anda?
Memilih mode penyeimbangan beban yang tepat adalah penting. Beberapa pertimbangan untuk memilih mode dapat berupa:
- Jika cluster hanya memiliki satu server primer dan satu server replika, tidak perlu mengaktifkan statement level load balance.
- Jika server memiliki lebih dari satu server replika dan aplikasi memiliki pool koneksi sendiri, maka statement level load balance adalah pilihan terbaik.
- Jika aplikasi dalam konfigurasi mengeluarkan beberapa kueri untuk setiap sesi dan membuat banyak sesi, maka mode session level load balance adalah cara yang tepat. Sementara untuk pemrosesan batch dan sesi pengguna yang lama, statement level load balance berperforma lebih baik.
Arsitektur yang baik untuk Pgpool-II
Umumnya, Anda tidak akan menginstal Pgpool-II di server backend. Pgpool-II adalah server mandiri yang pada dasarnya berada di depan database. Kedua server Postgres sering dikonfigurasi dengan replikasi streaming dengan satu menjadi server utama dan yang lainnya sebagai server Siaga.
Anda juga dapat memiliki beberapa server Pgpool-II untuk mencapai ketersediaan tinggi (HA) yang lebih baik. Secara teknis Anda dapat menginstal Pgpool-II pada server database dalam konfigurasi ini, tetapi ini akan menjadi praktik yang buruk. Untuk menerapkan ketersediaan tinggi dari seluruh sistem, pgpool-II sendiri juga perlu dibuat redudansi. Fitur untuk redundansi ini disebut Watchdog. Berikut adalah cara kerjanya:
- Watchdog menautkan beberapa instance Pgpool-II dalam pengaturan aktif/siaga. Kemudian, instans Pgpool-II yang tertaut melakukan pemantauan heartbeat dan berbagi informasi server (nama host, nomor port, status Pgpool-II, informasi IP virtual, waktu startup).
- Jika Pgpool-II (aktif) menyediakan layanan gagal, Pgpool-II (standby) secara otomatis mendeteksinya dan melakukan failover. Saat melakukan ini, Pgpool-II (aktif) baru memulai antarmuka IP virtual, dan Pgpool-II lama (aktif) menghentikan antarmuka IP virtualnya.
- Hal ini memungkinkan sisi aplikasi untuk menggunakan Pgpool-II dengan alamat IP yang sama bahkan setelah pergantian server. Dengan menggunakan Watchdog, semua instance Pgpool-II bekerja sama untuk melakukan pemantauan server database dan operasi failover – pgpool-II (aktif) berfungsi sebagai koordinator.
Beberapa Parameter Pgpool-II yang perlu diperhatikan
Terkadang kita bertanya bagaimana cara mengkonfigurasi jumlah parameter koneksi atau parameter siklus hidup Pgpool-II yang perlu kami konfigurasikan terkait spesifikasi PostgreSQL kami. Perhatikan bahwa Pgpool-II dapat membuat koneksi num_init_children * max_pool ke setiap server PostgreSQL. Dan PostgreSQL memungkinkan koneksi bersamaan untuk non-superuser hingga max_connections – superuser_reserved_connections.
Selain itu, membatalkan kueri akan membuat koneksi lain ke PostgreSQL. Oleh karena itu, max_pool, num_init_children, max_connections, superuser_reserved_connections harus memenuhi rumus berikut:
- (Jika Pgpool-II tidak memerlukan pembatalan query)
max_pool*num_init_children <= (max_connections – superuser_reserved_connections) - (Jika Pgpool-II memerlukan pembatalan kueri)
max_pool*num_init_children*2 <= (max_connections – superuser_reserved_connections) parameter lain yang dapat kita konfigurasikan berdasarkan kebutuhan dan koneksi kita adalah: - Child_life_time
Parameter ini menunjukkan pemutusan klien dari durasi maksimum, untuk menghindari kebocoran memori yang disebabkan oleh tidak keluarnya sesi dalam waktu yang lama. Setelah klien memutuskan database, subproses mengubah status permintaan, jika child_life_time dikonfigurasi dalam rentang waktu tertentu. Jika tidak, klien akan membuat koneksi dengan subproses baru, subproses akan dimatikan dan membuat ulang proses dan menunjukkan bahwa session tidak akan pernah keluar. - Client_idle_limit
Menentukan waktu dalam detik, untuk memutuskan sambungan klien jika tetap tidak beraktifitas sejak kueri terakhir dijalankan. Ini berguna untuk mencegah client Pgpool-II ditempati oleh klien yang idle atau koneksi TCP/IP yang terputus antara klien dan Pgpool-II. Jika klien idle setelah menjalankan kueri terakhir, koneksi klien ini akan mulai terputus. Parameter ini dapat mencegah koneksi idle mengambil jumlah koneksi untuk waktu yang lama. Makalah ini juga menggunakan parameter ini untuk mengoptimalkan database. Yang artinya tidak pernah putus. - Child_max_connection
Parameter ini mewakili jumlah maksimum koneksi Pgpool-II yang diizinkan, ketika koneksi yang dibuat Pgpool-II mencapai child_max_connections Setelah nomor yang dikonfigurasi, subproses tertua akan keluar terlebih dahulu. Parameter ini terutama digunakan dalam skenario dengan konkurensi besar dan tidak dapat dipicu dalam waktu singkat. - Connection_life_time
Parameter ini mewakili waktu maksimum untuk membuat koneksi dengan backend database. Hal ini terutama digunakan untuk caching dan meningkatkan kinerja database.
Semoga artikel ini membantu Anda mendapatkan pemahaman yang lebih baik tentang peningkatan kinerja cluster PostgreSQL Anda dengan menggunakan fitur Pgpool-II. Jika Anda memerlukan konsultasi PostgreSQL yang lebih ahli, langganan, layanan teknis atau terkelola, bicarakan dengan pakar kami.
Untuk tetap mendapatkan informasi terbaru tentang teknologi basis data sumber terbuka terbaru seperti MongoDB, Postgres, Redis, ELK, dan lainnya, lihat blog kami.