Nginx負(fù)載均衡設(shè)置
一、負(fù)載均衡算法
實(shí)現(xiàn)負(fù)載均衡可有以下算法:
源地址哈希法:根據(jù)獲取客戶端的IP地址,通過(guò)哈希函數(shù)計(jì)算得到一個(gè)數(shù)值,用該數(shù)值對(duì)服務(wù)器列表的大小進(jìn)行取模運(yùn)算,得到的結(jié)果便是客服端要訪問(wèn)服務(wù)器的序號(hào)。采用源地址哈希法進(jìn)行負(fù)載均衡,同一IP地址的客戶端,當(dāng)后端服務(wù)器列表不變時(shí),它每次都會(huì)映射到同一臺(tái)后端服務(wù)器進(jìn)行訪問(wèn)。
輪詢法:將請(qǐng)求按順序輪流地分配到后端服務(wù)器上,它均衡地對(duì)待后端的每一臺(tái)服務(wù)器,而不關(guān)心服務(wù)器實(shí)際的連接數(shù)和當(dāng)前的系統(tǒng)負(fù)載。
隨機(jī)法:通過(guò)系統(tǒng)的隨機(jī)算法,根據(jù)后端服務(wù)器的列表大小值來(lái)隨機(jī)選取其中的一臺(tái)服務(wù)器進(jìn)行訪問(wèn)。
加權(quán)輪詢法:不同的后端服務(wù)器可能機(jī)器的配置和當(dāng)前系統(tǒng)的負(fù)載并不相同,因此它們的抗壓能力也不相同。給配置高、負(fù)載低的機(jī)器配置更高的權(quán)重,讓其處理更多的請(qǐng);而配置低、負(fù)載高的機(jī)器,給其分配較低的權(quán)重,降低其系統(tǒng)負(fù)載,加權(quán)輪詢能很好地處理這一問(wèn)題,并將請(qǐng)求順序且按照權(quán)重分配到后端。
加權(quán)隨機(jī)法:與加權(quán)輪詢法一樣,加權(quán)隨機(jī)法也根據(jù)后端機(jī)器的配置,系統(tǒng)的負(fù)載分配不同的權(quán)重。不同的是,它是按照權(quán)重隨機(jī)請(qǐng)求后端服務(wù)器,而非順序。
最小連接數(shù)法:由于后端服務(wù)器的配置不盡相同,對(duì)于請(qǐng)求的處理有快有慢,最小連接數(shù)法根據(jù)后端服務(wù)器當(dāng)前的連接情況,動(dòng)態(tài)地選取其中當(dāng)前積壓連接數(shù)最少的一臺(tái)服務(wù)器來(lái)處理當(dāng)前的請(qǐng)求,盡可能地提高后端服務(wù)的利用效率,將負(fù)責(zé)合理地分流到每一臺(tái)服務(wù)器。
二、Nginx實(shí)現(xiàn)負(fù)載均衡
Nginx實(shí)現(xiàn)負(fù)載均衡的原理是利用Http重定向?qū)崿F(xiàn)負(fù)載均衡
1)配置文件在哪?
rpm 安裝方式nginx配置文件地址 /etc/nginx/conf.d 目錄下面,配置文件內(nèi)容結(jié)構(gòu)如下:
upstream upstream_name {
server 127.0.0.1:8081;
server 192.168.0.137:8081;
}
server {
listen 8000;
server_name localhost;
location / {
proxy_pass http://upstream_name;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
修改完配置文件以后,還需要輸入重新加載配置命令:
//重新加載配置
nginx -s reload
//或者重啟nginx
systemctl restart nginx
2)如何配置負(fù)載均衡?
我們從官網(wǎng)上面看一下負(fù)載均衡配置案例,然后根據(jù)案例配置去對(duì)每項(xiàng)參數(shù)進(jìn)行解釋,案例如下(注意:以下模塊內(nèi)容必須放在http模塊下):
resolver 10.0.0.1;
upstream dynamic {
zone upstream_dynamic 64k;
server backend1.example.com weight=5;
server backend2.example.com:8080 fail_timeout=5s slow_start=30s;
server 192.0.2.1 max_fails=3;
server backend3.example.com resolve;
server backend4.example.com service=http resolve;
server backup1.example.com:8080 backup;
server backup2.example.com:8080 backup;
}
server {
location / {
proxy_pass http://dynamic;
health_check;
}
}
從上面這個(gè)案例Nginx會(huì)作如下執(zhí)行,默認(rèn)情況下,請(qǐng)求使用 加權(quán)循環(huán)平衡法。 在上面的示例中,每 7 個(gè)請(qǐng)求將按如下方式分配: 5個(gè)請(qǐng)求去 backend1.example.com向第二臺(tái)和第三臺(tái)服務(wù)器分別發(fā)送一個(gè)請(qǐng)求。 如果在與服務(wù)器通信過(guò)程中發(fā)生錯(cuò)誤,請(qǐng)求將 被傳遞到下一個(gè)服務(wù)器,依此類推,直到所有的功能 服務(wù)器將被嘗試。 如果無(wú)法從任何服務(wù)器獲得成功的響應(yīng), 客戶端將收到與最后一個(gè)服務(wù)器通信的結(jié)果。
server命令解析
語(yǔ)法:
句法: server address [parameters];
默認(rèn): —
語(yǔ)境: upstream
parameters類別:
| 參數(shù)名 | 類型 | 說(shuō)明 |
|---|---|---|
| weight | number | 服務(wù)器權(quán)重,默認(rèn)為 1 |
| max_conns | number | 限制最大值 number同時(shí)活躍的 與代理服務(wù)器的連接 (1.11.5)。 默認(rèn)值為零,表示沒(méi)有限制。 |
| max_fails | number | 設(shè)置與服務(wù)器通信失敗的嘗試次數(shù)。默認(rèn)情況下,不成功的嘗試次數(shù)設(shè)置為 1。 |
| fail_timeout | time | 指定嘗試失敗的超時(shí)時(shí)間,默認(rèn)情況下,該參數(shù)設(shè)置為 10 秒。(10s) |
| backup | 無(wú) | 將服務(wù)器標(biāo)記為備份服務(wù)器。 當(dāng)主服務(wù)器不可用時(shí),它將被傳遞請(qǐng)求 |
| down | 無(wú) | 將服務(wù)器標(biāo)記為永久不可用 |
商業(yè)版本需要付費(fèi)的其他屬性這里就不闡述了
Nginx負(fù)載均衡策略
1)輪訓(xùn)策略:
upstream模塊默認(rèn)的負(fù)載均衡策略是輪訓(xùn)策略,它會(huì)依次在服務(wù)列表進(jìn)行分發(fā)
2)加權(quán)策略:
容器會(huì)根據(jù)server設(shè)置的權(quán)重進(jìn)行請(qǐng)求分配,例如server1 weight=5 ,server2 weight=2 將會(huì)使得每 7 個(gè)請(qǐng)求將按如下方式分配server1 5個(gè)請(qǐng)求,server2兩個(gè)請(qǐng)求。
3)Ip哈希策略:
其中請(qǐng)求 根據(jù)客戶端 IP 地址在服務(wù)器之間分布,確保來(lái)自同一客戶端的請(qǐng)求將始終 傳遞到同一服務(wù)器。使用方法是在upstream模塊下面添加ip_hash;
upstream backend {
ip_hash;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com down;
server backend4.example.com;
}
4)最少連接數(shù)策略(least_conn):
指定組應(yīng)使用負(fù)載平衡方法,其中請(qǐng)求 傳遞給活動(dòng)連接數(shù)最少的服務(wù)器, 考慮到服務(wù)器的權(quán)重。 如果有多個(gè)這樣的服務(wù)器,它們會(huì)依次嘗試使用 加權(quán)循環(huán)平衡法。
upstream backend {
least_conn;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com down;
server backend4.example.com;
}
5)擴(kuò)展策略(需要安裝插件):
- fair:響應(yīng)時(shí)間方式,按照服務(wù)器端的響應(yīng)時(shí)間來(lái)分配請(qǐng)求,響應(yīng)時(shí)間短的優(yōu)先分配。upstream模塊配置模板如下:
upstream backend {
fair;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com down;
server backend4.example.com;
}
- url_hash:url分配方式,按訪問(wèn)url的hash結(jié)果來(lái)分配請(qǐng)求,使每個(gè)url定向到同一個(gè)后端服務(wù)器,要配合緩存命中來(lái)使用。同一個(gè)資源多次請(qǐng)求可能會(huì)到達(dá)不同的服務(wù)器上,導(dǎo)致不必要的多次下載,緩存命中率不高,以及一些資源時(shí)間的浪費(fèi)。而使用url_hash,可以使得同一個(gè)url(也就是同一個(gè)資源請(qǐng)求)會(huì)到達(dá)同一臺(tái)服務(wù)器,一旦緩存住了資源,再次收到請(qǐng)求,就可以在緩存中讀取。upstream模塊配置模板如下:
upstream backend {
hash $request_uri;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com down;
server backend4.example.com;
}
還有一些其他需要付費(fèi)的策略這里就不進(jìn)行闡述了,比如:最少時(shí)間策略( least_time)、隨機(jī)策略等。