Penyeimbangan beban antara beberapa aplikasi, backend, dan server adalah bagian dari proses pengoptimalan sumber daya, peningkatan kinerja, dan toleransi kesalahan layanan.
Nginx sebagai penyeimbang beban
Server web ini dianggap sebagai salah satu solusi paling populer dan produktif karena memiliki fungsionalitas dan fleksibilitas terluas saat melakukan konfigurasi. Jadi Nginx sering digunakan untuk load balancing.
Ada beberapa pendekatan dan implementasi, tetapi periksa dulu ketersediaan modul ngx_http_upstream_module:
# nginx -v
Jika tidak ada, maka Anda harus membangun kembali Nginx dengan menambahkan modul ini. Setelah itu, Anda dapat mulai mengkonfigurasi server web. Untuk mengaktifkan penyeimbangan, tambahkan direktif upstream (bagian http) ke file konfigurasi Nginx:
upstream backend { server backend1.somesite.com; server backend2.somesite.com; server backend3.somesite.com; }
Sekarang Anda perlu menentukan pengalihan grup yang diperlukan:
server { location / { proxy_pass http://backend; } }
Selain itu, Nginx mendukung parameter tambahan dan metode penyeimbangan beban.
Memilih metode penyeimbangan
Nginx menawarkan beberapa metode penyeimbangan beban.
Permainan round-robin
Secara default, server web mendistribusikan permintaan secara merata di antara backend (tetapi dengan mempertimbangkan bobot akun). Ini adalah metode standar di Nginx, jadi tidak ada arahan penyertaan.
koneksi_paling kecil
Permintaan pertama-tama dikirim ke backend dengan jumlah koneksi aktif paling sedikit (tetapi mempertimbangkan bobot akun):
upstream backend { least_conn; server backend1.somesite.com; server backend2.somesite.com; }
Hash dan hash IP
Dengan menggunakan metode ini, Anda dapat membuat semacam koneksi persisten antara klien dan backend. Untuk setiap permintaan, Nginx menghitung hash yang terdiri dari teks, variabel server web, atau kombinasinya, lalu memetakannya ke backend:
upstream backend { hash $scheme$request_uri; server backend1.somesite.com; server backend2.somesite.com; server backend3.somesite.com; }
Hash IP hanya berfungsi dengan HTTP, ini adalah opsi yang telah ditentukan di mana hash dihitung berdasarkan alamat IP klien:
upstream backend { ip_hash; server backend1.somesite.com; server backend2.somesite.com; server backend3.somesite.com; }
Berat backend
Jika backend tertentu pada tumpukan lebih kuat daripada yang lain, bobot akan berguna:
upstream backend { server backend1.somesite.com weight=10; server backend2.somesite.com weight=5; server backend3.somesite.com; server 192.0.0.1 backup; }
Dalam contoh ini, dari setiap 16 permintaan, backend pertama akan memproses 10, kedua 5, dan ketiga 1. Dalam hal ini, server cadangan akan menerima permintaan hanya jika tiga backend utama tidak tersedia.
Pemantauan
Jika Nginx yakin bahwa server backend tidak tersedia, untuk sementara Nginx berhenti mengirim permintaan ke sana. Dua arahan bertanggung jawab untuk ini:
- max_fails — menyetel jumlah upaya koneksi yang gagal, setelah itu backend dianggap tidak tersedia untuk waktu tertentu;
- fail_timeout — waktu selama server dianggap tidak tersedia.
Parameternya terlihat seperti ini:
upstream backend { server backend1.somesite.com; server backend2.somesite.com max_fails=3 fail_timeout=30s; server backend3.somesite.com max_fails=2; }
Kesimpulan
Memilih metode penyeimbangan yang tepat akan memungkinkan untuk mendistribusikan beban secara lebih merata. Jangan lupakan bobot backend, pemantauan, dan toleransi kesalahan server.