1. 程式人生 > 其它 >nginx 負載均衡幾種方式說明

nginx 負載均衡幾種方式說明

技術標籤:軟體使用

本文件為個人部落格文件系統的備份版本、作者:小遊、作者部落格:點選訪問

首先,我們用Python來寫一個最簡單的提供4個埠的服務埠,程式碼如下

from flask import Flask
import threading

app = Flask(__name__)
app2 = Flask(__name__)
app3 = Flask(__name__)
app4 = Flask(__name__)

@app.route('/')
def server1():
    return '服務A'

@app2.route('/')
def server2():
return '服務B' @app3.route('/') def server3(): return '服務C' @app4.route('/') def server3(): return '服務D' def run_b(): print('服務2啟動') app2.run(port=82) def run_c(): print('服務3啟動') app3.run(port=83) def run_d(): print('服務4啟動') app4.run(port=84) if __name__ == "__main__"
: # 先啟動4個執行緒 threading.Thread(target=run_b).start() threading.Thread(target=run_c).start() threading.Thread(target=run_d).start() print('服務1啟動') app.run(port=81)

訪問效果很簡單,就是下面這個樣子

最簡單的輪詢

http {
     # 待選伺服器列表
    upstream loadBalancing{
        server 127.0.0.1:81;
        server 127.0.0.1:82;
        server 127.0.0.1:83;
        server 127.0.0.1:84;  
    }

    server {
        listen 8080;
        location / {
            # 使用負載均衡的代理
            proxy_pass http://loadBalancing;
        }
    }
}

效果就是按順序進行訪問。這裡就不展示了

權重

    upstream loadBalancing{
        server 127.0.0.1:81 weight=1;
        server 127.0.0.1:82 weight=2;
        server 127.0.0.1:83 weight=3;
        server 127.0.0.1:84 weight=4;  
    }

這種就是那個weight高,那個訪問的就越頻繁

IP Hash

上述方式存在一個問題就是說,在負載均衡系統中,假如使用者在某臺伺服器上登入了,那麼該使用者第二次請求的時候,因為我們是負載均衡系統,每次請求都會重新定位到伺服器叢集中的某一個,那麼***已經登入某一個伺服器的使用者再重新定位到另一個伺服器,其登入資訊將會丟失,這樣顯然是不妥的***。
我們可以採用***ip_hash***指令解決這個問題,如果客戶已經訪問了某個伺服器,當用戶再次訪問時,會將該請求通過***雜湊演算法,自動定位到該伺服器***。
每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端伺服器,可以解決***session的問題***。

     # 待選伺服器列表
    upstream loadBalancing{
        ip_hash;
        server 127.0.0.1:81;
        server 127.0.0.1:82;
        server 127.0.0.1:83;
        server 127.0.0.1:84;  
    }

使用這個方法後,我們每次訪問的都是同一個服務。因為我們的ip地址沒有變

fair(第三方模組,需要自己安裝)

fair採用的不是內建負載均衡使用的輪換的均衡演算法,而是可以根據頁面大小、載入時間長短智慧的進行負載均衡。程式碼如下

upstream loadBalancing{
    server 127.0.0.1:81;
    server 127.0.0.1:82;
    server 127.0.0.1:83;
    server 127.0.0.1:84; 
    fair; 
}

url_hash(也是第三方模組)

按訪問url的hash結果來分配請求,使每個url定向到同一個(對應的)後端伺服器,後端伺服器為快取時比較有效。

upstream backserver {
    server squid1:3128;
    server squid2:3128;
    hash $request_uri;
    hash_method crc32;
}

其他標籤

down和backup標籤的簡單展示

upstream loadBalancing{
    server 127.0.0.1:81;
    server 127.0.0.1:82;
    server 127.0.0.1:83 backup;
    server 127.0.0.1:84 down; 
}

down標識某一臺server不可用,backup是備份機,所有伺服器掛了之後才會生效

max_conns:限制分配給某臺Server處理的最大連線數量,超過這個數量,將不會分配新的連線給它。預設為0,表示不限制。注意:1.5.9之後的版本才有這個配置

resolve:將server指令配置的域名,指定域名解析伺服器。需要在http模組下配置resolver指令,指定域名解析服務

fail_timeout:預設為10秒。某臺Server達到max_fails次失敗請求後,在fail_timeout期間內,nginx會認為這臺Server暫時不可用,不會將請求分配給它

max_fails:預設為1。某臺Server允許請求失敗的次數,超過最大次數後,在fail_timeout時間內,新的請求將不會分配給這臺機器。如果設定為0,Nginx會將這臺Server置為永久無效狀態,然後將請求發給定義了proxy_next_upstream, fastcgi_next_upstream, uwsgi_next_upstream, scgi_next_upstream, and memcached_next_upstream指令來處理這次錯誤的請求。