Imbangan Beban bermaksud membahagikan beban (tugas kerja, Permintaan akses) adalah seimbang dan diedarkan kepada berbilang unit operasi (pelayan, komponen) untuk pelaksanaan.
Apabila pelayan web tunggal menghadap pengguna secara langsung, ia mungkin membawa sejumlah besar permintaan serentak Satu pelayan mungkin sukar untuk dimuatkan pelayan web untuk membentuk Kluster menggunakan fungsi pengimbangan beban Nginx untuk mengedarkan permintaan kepada pelayan bahagian belakang yang berbeza untuk mencapai pengagihan trafik beban, meningkatkan prestasi keseluruhan dan keupayaan pemulihan bencana sistem.
Apakah perbezaan antara pengimbangan beban dan proksi
Proksi ialah proksi untuk pelayan menjadualkan berdasarkan URI dan jadual ke aplikasi nod dengan fungsi berbeza
Pengimbangan beban adalah untuk memproksi permintaan klien kepada set kumpulan sumber huluan melalui proxy_pass
Untuk mencapai senario pengimbangan beban
Untuk mencapai beban Fungsi pengimbangan memerlukan penggunaan dua modul:
proxy_pass: modul proksi
upstream: sumber maya pool
Contoh: Demonstrasi pengimbangan beban rasmi
upstream backend { server backend1.example.com weight=5; server backend2.example.com:8080; server unix:/tmp/backend3; server backup1.example.com:8080 backup; server backup2.example.com:8080 backup; } server { location / { proxy_pass http://backend; } }
Contoh: Lengkapkan contoh kecil sendiri
upstream node { server 192.168.10.3:80; server 192.168.10.4:80; } server { listen 80; server_name www.yyang.com; location / { proxy_pass http://node; include prxoy_params; } }
Penjadualan pengundian
diperuntukkan kepada nod hujung belakang yang berbeza satu demi satu mengikut tertib, yang juga merupakan algoritma lalai. (Ringkasnya, ia adalah 1:1:1)
Tinjauan berwajaran
Memandangkan prestasi berbeza pelayan yang berbeza, pemberat yang berbeza diberikan kepada nod supaya mereka boleh menerima sepadan Bilangan permintaan berat
server 192.168.10.3:80 weight=3; server 192.168.10.4:80 weight=1;
Contoh di atas bermakna setiap 4 permintaan akan diperuntukkan kepada tiga permintaan untuk 10.3 dan satu untuk 10.4, dan kitaran diteruskan.
ip_hash
Menurut IP yang diminta oleh pengguna, lakukan operasi cincang pada IP dan tetapkan permintaan itu kepada nod belakang khusus untuk pemprosesan berasaskan pada nilai yang dikira.
Julat nilai ialah tiga 8 bit pertama alamat ipv4 atau keseluruhan alamat ipv6 sebagai kunci cincang, memastikan bahawa IP daripada satu pelanggan sentiasa dihantar ke pelayan yang sama, melainkan pelayan kedua tidak tersedia. Ringkasnya, tiga set nombor pertama 172.16.20.1 dan 172.16.20.2 adalah sama (semua 172.16.20)
formula operasi ip_hash: hash (ip) %node_counts=index
Masalah yang disebabkan oleh ip_hash:
Sebilangan besar permintaan untuk IP yang sama akan menyebabkan trafik yang berlebihan pada nod
Jika nod di luar talian buat sementara waktu, nilai cincang akan dikira semula nyatakan
Contoh : Ambil perhatian bahawa ip_hash dan berat tidak boleh digunakan pada masa yang sama
ip_hash; server 192.168.10.3:80; server 192.168.10.4:80;
Hash yang konsisten
Untuk mengelakkan masalah di atas, pencincangan yang konsisten telah dilahirkan, menggunakan kaedah modulo, tetapi ia tidak betul Bilangan nod pelayan adalah modulo, tetapi modulo 2 dinaikkan kepada kuasa ke-32 Nilai fungsi cincang ialah 0~2^32-1. (Membentuk gelang maya, permintaan pengguna akan dihantar ke nod bersebelahan mengikut arah jam)
Terdapat masalah: jika terdapat kurang nod hujung belakang, ia boleh menyebabkan data condong, jadi pencincangan yang konsisten memperkenalkan mekanisme nod maya, iaitu , untuk Setiap pelayan mengira berbilang cincangan dan meletakkan nod maya pada setiap lokasi hasil yang dikira.
Apakah yang perlu kita lakukan jika kita ingin menggunakan ip_hash, tetapi formula pengiraan menggunakan cincang yang konsisten?
hash $remote_addr consistent; server 192.168.10.3:80; server 192.168.10.4:80;
url_hash
Berbilang cincang berdasarkan url pengguna dan tetapkan permintaan kepada pelayan bahagian belakang tertentu berdasarkan nilai operasi.
1. Pengguna meminta pengimbangan beban nginx Melalui algoritma url, permintaan dijadualkan untuk cache1
2. Jika cache1 tidak mempunyai data, ia akan memperoleh data dari bahagian belakang, mengembalikan data, dan cache data
3 Apabila Apabila pengguna lain mengakses URL yang sama, penjadual masih akan menjadualkan ke nod cache1
4.cache1 akan terus mengembalikan data kepada
hash $request_uri consistent; server 192.168.10.3:80; server 192.168.10.4:80;
least_conn
pelayan mana Jika bilangan sambungan paling sedikit, permintaan akan dihantar ke pelayan ini
least_conn; server 192.168.10.3:80; server 192.168.10.4:80;
turun
Tandai nod pelayan sebagai status tidak tersedia, biasanya digunakan untuk penyelenggaraan penutupan.
server 192.168.10.3:80 down; server 192.168.10.4:80;
sandaran
Nod sandaran, nod ini tidak akan dijadualkan dalam keadaan biasa apabila semua nod yang berfungsi normal tidak tersedia, nod ini akan didayakan; pulih, nod ini Nod akan terus kembali ke status siap sedia.
server 192.168.10.3:80; server 192.168.10.4:80; server 192.168.10.5:80 backup;
max_conns
digunakan untuk mengehadkan bilangan maksimum sambungan TCP yang diterima oleh setiap nod hujung belakang Jika melebihi had, ralat akan dilemparkan.
server 192.168.10.3:80 max_conns=10; server 192.168.10.4:80 max_conns=10;
Seorang boleh menyambung 10. Dua boleh menyambung 20. Jika melebihi 20, ralat akan berlaku.
keeplived
Aktifkan cache dengan pelayan bahagian belakang, yang merupakan pautan panjang, untuk meningkatkan daya pemprosesan tapak web.
Fungsi ini tidak didayakan secara lalai Apabila terdapat permintaan, sambungan akan diwujudkan, dikekalkan dan ditutup, jadi akan ada penggunaan rangkaian tetapi jika semua sambungan dicache, sumber sistem lain akan diduduki apabila sambungan melahu, jadi Parameter keepalived boleh digunakan.
server 192.168.10.3:80; server 192.168.10.4:80; keepalived 32; # 最大空闲连接数的个数 keepalived_timeout 100s; # 空闲连接的超时时间 # 需要配合以下两个参数使用 proxy_http_version 1.1; proxy_set_header connection "";
max_fails dan fail_timeout
max_fails=2:服务器通信失败两次,认为服务器不可用
fail_timeout=5s:服务器通信失败后,每5秒探测一次服务器是否恢复正常。
在fail_timeout设定时间内,与服务器连接失败次数达到max_fails数量,则认为服务器不可用。
如果不设置的话默认是探测一次,间隔10s。
server 192.168.10.3:80 max_fails=2 fail_timeout=5s; server 192.168.10.4:80 max_fails=2 fail_timeout=5s;
Atas ialah kandungan terperinci Bagaimana Nginx menggunakan ngx_http_upstream_module untuk melaksanakan fungsi pengimbangan beban. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!