溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Nginx怎么使用ngx_http_upstream_module實現(xiàn)負載均衡功能

發(fā)布時間:2022-08-05 09:17:22 來源:億速云 閱讀:146 作者:iii 欄目:開發(fā)技術

今天小編給大家分享一下Nginx怎么使用ngx_http_upstream_module實現(xiàn)負載均衡功能的相關知識點,內(nèi)容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

    負載均衡介紹

    什么是負載均衡

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

    為什么需要負載均衡

    當單臺web服務器直接面向用戶,可能要承載著大量的并發(fā)請求,單臺服務器可能難以負荷,我們需要使用多臺web服務器組成一個集群,利用Nginx負載均衡功能,將請求分發(fā)給不同的后端服務器,實現(xiàn)負載的流量分發(fā),提升整體性能、以及系統(tǒng)的容災能力。

    • 負載均衡與代理有什么區(qū)別

    代理是代理一臺服務器基于URI調(diào)度,調(diào)度到不同功能的應用節(jié)點

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

    • 實現(xiàn)負載均衡場景

    實現(xiàn)負載均衡功能需要使用兩個模塊:

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

    負載均衡調(diào)度算法

    輪詢調(diào)度

    按順序逐一分配到不同的后端節(jié)點,也是默認算法。(簡單來說就是1:1:1)

    加權輪詢
    考慮到不同服務器的性能不同,給予節(jié)點不同的權值,使其接收到相應的權值請求數(shù)

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

    以上這個例子是說每4個請求會分配給10.3三個,10.4一個,以此循環(huán)。

    ip_hash

    根據(jù)用戶請求的IP,對該IP進行hash運算,根據(jù)運算的值將請求分配給后端特定的一臺節(jié)點進行處理。

    取值范圍為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的請求會造成某個節(jié)點流量過大
    如果臨時下線一臺節(jié)點,會重新計算hash值,建議使用down狀態(tài)

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

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

    一致性hash

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

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

    url_hash

    根據(jù)用戶的url進行hash取模,根據(jù)運算值,將請求分配給一臺特定的后端服務器。

    1.用戶請求nginx負載均衡,通過url算法,請求調(diào)度至cache1
    2.cache1沒有數(shù)據(jù),會向后端獲取,返回數(shù)據(jù),并將數(shù)據(jù)緩存
    3.當其他用戶訪問相同url時,調(diào)度器依然會調(diào)度到cache1節(jié)點
    4.cache1會直接將數(shù)據(jù)返回

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

    least_conn

    哪臺服務器的連接數(shù)最少,就將請求調(diào)度到這臺服務器

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

    負載均衡后端節(jié)點狀態(tài)

    down

    將服務器節(jié)點標記為不可用狀態(tài),一般用于停機維護。

    server 192.168.10.3:80 down;
    server 192.168.10.4:80;

    backup

    備用節(jié)點,正常情況不會調(diào)度到此節(jié)點;當正常工作節(jié)點全部不可用時,會啟用此節(jié)點;當節(jié)點恢復時此節(jié)點會繼續(xù)恢復備用狀態(tài)。

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

    max_conns

    用來限制每個后端節(jié)點接收到的最大的TCP連接數(shù),如果超出限制就會拋出錯誤。

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

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

    keepalived

    與后端服務器激活緩存,也就是長鏈接,提升網(wǎng)站吞吐量。
    默認不啟用此功能,當有請求時,會建立連接,維護連接,關閉連接,所以會存在網(wǎng)絡消耗;但是如果所有連接都緩存了,當連接空閑了又會占用其他系統(tǒng)資源,所以可以使用keepalived參數(shù)。

    server 192.168.10.3:80;
    server 192.168.10.4:80;
    
    keepalived 32;   # 最大空閑連接數(shù)的個數(shù)
    keepalived_timeout 100s; # 空閑連接的超時時間
    
    # 需要配合以下兩個參數(shù)使用
    
    proxy_http_version 1.1;
    proxy_set_header connection "";

    max_fails與fail_timeout

    max_fails=2:服務器通信失敗兩次,認為服務器不可用
    fail_timeout=5s:服務器通信失敗后,每5秒探測一次服務器是否恢復正常。
    在fail_timeout設定時間內(nèi),與服務器連接失敗次數(shù)達到max_fails數(shù)量,則認為服務器不可用。
    如果不設置的話默認是探測一次,間隔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實現(xiàn)負載均衡功能”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業(yè)資訊頻道。

    向AI問一下細節(jié)

    免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

    AI