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指令來處理這次錯誤的請求。