Nginx實(shí)現(xiàn)負(fù)載均衡

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ī)策略等。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容