首頁 > 運維 > Nginx > 主體

Nginx怎麼使用ngx_http_upstream_module實現負載平衡功能

WBOY
發布: 2023-05-18 19:01:24
轉載
754 人瀏覽過

    負載平衡介紹

    什麼是負載平衡

    負載平衡(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的前三組數字是一樣的(都是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取模,根據運算值,將請求分配給特定的後端伺服器。

    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實現負載平衡功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    相關標籤:
    來源:yisu.com
    本網站聲明
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
    熱門教學
    更多>
    最新下載
    更多>
    網站特效
    網站源碼
    網站素材
    前端模板
    關於我們 免責聲明 Sitemap
    PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!