首頁 > 軟體

Nginx使用ngx_http_upstream_module實現負載均衡功能範例

2022-08-04 22:04:54

負載均衡介紹

什麼是負載均衡

負載均衡(Load Balance),意思是將負載(工作任務,存取請求)進行平衡、分攤到多個操作單元(伺服器,元件)上進行執行。

為什麼需要負載均衡

當單臺web伺服器直接面向用戶,可能要承載著大量的並行請求,單臺伺服器可能難以負荷,我們需要使用多臺web伺服器組成一個叢集,利用Nginx負載均衡功能,將請求分發給不同的後端伺服器,實現負載的流量分發,提升整體效能、以及系統的容災能力。

  • 負載均衡與代理有什麼區別

代理是代理一臺伺服器基於URI排程,排程到不同功能的應用節點

負載均衡是將使用者端請求通過proxy_pass代理至一組upstream資源池

  • 實現負載均衡場景

實現負載均衡功能需要使用兩個模組:

  • proxy_pass:代理模組
  • upstream:虛擬資源池

範例:一個官方的的負載均衡展示

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;
    }
}

範例:自己完成一個小例子

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;
    }
}

負載均衡排程演演算法

輪詢排程

按順序逐一分配到不同的後端節點,也是預設演演算法。(簡單來說就是1:1:1)

加權輪詢
考慮到不同伺服器的效能不同,給予節點不同的權值,使其接收到相應的權值請求數

server 192.168.10.3:80 weight=3;
server 192.168.10.4:80 weight=1;

以上這個例子是說每4個請求會分配給10.3三個,10.4一個,以此迴圈。

ip_hash

根據使用者請求的IP,對該IP進行hash運算,根據運算的值將請求分配給後端特定的一臺節點進行處理。

取值範圍為ipv4地址的前三個8位元或ipv6的整個地址作為雜湊鍵,確保來自從一個使用者端的IP始終傳遞給同一臺伺服器,除非次伺服器不可用。(簡單來說就是172.16.20.1與172.16.20.2取前三個8位元都是172.16.20)

ip_hash運算公式:hash(ip)%node_counts=index

ip_hash帶來的問題:
大量同一IP的請求會造成某個節點流量過大
如果臨時下線一臺節點,會重新計算hash值,建議使用down狀態

範例:注意ip_hash與權重不可同時使用

ip_hash;
server 192.168.10.3:80;
server 192.168.10.4:80;

一致性hash

為了避免上述問題,所以誕生了一致性hash,使用取模的方式,但不對伺服器節點數量取模,而是對2的32次方取模,hash函數值為0~2^32-1。(形成一個虛擬圓環,使用者請求會發給順時針相鄰的節點)
有一個問題:如果後端節點較少可能會造成資料傾斜,所以一致性hash引入了虛擬節點機制,即對每個伺服器計算多個雜湊,每個計算結果位置都放置一個虛擬節點。
如果我們想使用ip_hash,但是計算公式使用一致性hash,該怎麼做?

hash $remote_addr consistent;
server 192.168.10.3:80;
server 192.168.10.4:80;

url_hash

根據使用者的url進行hash取模,根據運算值,將請求分配給一臺特定的後端伺服器。clent——nginx——url_hash——cache1——app

1.使用者請求nginx負載均衡,通過url演演算法,請求排程至cache1
2.cache1沒有資料,會向後端獲取,返回資料,並將資料快取
3.當其他使用者存取相同url時,排程器依然會排程到cache1節點
4.cache1會直接將資料返回

hash $request_uri consistent;
server 192.168.10.3:80;
server 192.168.10.4:80;

least_conn

哪臺伺服器的連線數最少,就將請求排程到這臺伺服器

least_conn;
server 192.168.10.3:80;
server 192.168.10.4:80;

負載均衡後端節點狀態

down

將伺服器節點標記為不可用狀態,一般用於停機維護。

server 192.168.10.3:80 down;
server 192.168.10.4:80;

backup

備用節點,正常情況不會排程到此節點;當正常工作節點全部不可用時,會啟用此節點;當節點恢復時此節點會繼續恢復備用狀態。

server 192.168.10.3:80;
server 192.168.10.4:80;
server 192.168.10.5:80 backup;

max_conns

用來限制每個後端節點接收到的最大的TCP連線數,如果超出限制就會丟擲錯誤。

server 192.168.10.3:80 max_conns=10;
server 192.168.10.4:80 max_conns=10;

一臺可以連線10.兩臺是20,超過20就會出錯。

keepalived

與後端伺服器啟用快取,也就是長連結,提升網站吞吐量。
預設不啟用此功能,當有請求時,會建立連線,維護連線,關閉連線,所以會存在網路消耗;但是如果所有連線都快取了,當連線空閒了又會佔用其他系統資源,所以可以使用keepalived引數。

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與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;

這部分就到這,其他內容放在之後。

到此這篇關於Nginx使用ngx_http_upstream_module實現負載均衡功能範例的文章就介紹到這了,更多相關Nginx 負載均衡內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com