Nginx進階之負載均衡服務
進階階段回顧:
模型:
① GSLB(全域性負載均衡), 特點: 節點龐大, 範圍廣
② SLB(伺服器負載均衡), 特點: 範圍小, 實時性/響應性好
SLB分為四層負載均衡和七層負載均衡, Nginx是典型的七層負載均衡.
Nginx的負載均衡:
測試Nginx的負載均衡
要測試Nginx的負載均衡功能需要兩臺伺服器, 192.168.19.134和192.168.19.136
136伺服器提供三個server服務:
134伺服器提供負載均衡服務:
客戶端(瀏覽器)訪問:
http://192.168.19.134
預設的結果是在這3個服務埠之間輪詢
可以使用命令關閉其中某個埠, 模擬其中一個服務掛掉的情況, 測試其他兩個服務還能否正常訪問.
命令如下:
iptables -I INPUT -p tcp --dport 8082 -j DROP #關閉8082埠
iptables -I INPUT -p tcp --dport 8082 -j ACCEPT #開啟8082埠
測試結果是8082埠的服務無法訪問, 而其他兩個服務正常訪問.
上面提到的upstream模組還有其他的配置項:
upstream [自定義的虛擬服務的名稱, 如上面我自定義的"testSLB"] {
server [域名的寫法www.example.com] weight=[權重值越大則訪問越多, 值為1/2/3/4/5/...];
server [域名+埠的寫法www.example.com:8080];
server [socket的寫法unix:/tmp/...];
}
配置引數:
down | 表示當前的server不參與負載均衡 |
backup | 備份伺服器, 當其他服務沒有完全掛掉的情況下不使用該備份伺服器, 一旦全部掛掉, 則啟用該備份伺服器 |
max_fails | 允許請求失敗的次數, 如: max_fails=1 |
fail_timeout | 經過max_fails失敗後服務暫停的時間, 如: fail_timeout=10s |
max_conns | 限制最大的接收連線數(用於每臺伺服器配置不統一的情況, 降低低配置伺服器的壓力) |
進入134伺服器的.conf配置, 在upstream的每一臺server後面加上對應的引數再測試
測試結果是隻能訪問到8083埠, 利用上面的命令關閉8083埠, 測試能夠訪問到的是8082埠.
Nginx的排程演算法
Nginx的排程演算法預設是輪詢策略, 依次訪問.
排程演算法:
輪詢 | 按照時間順序逐一分配到不同的後端伺服器 |
加權輪詢 | weight值越大, 分配到的訪問機率就越大 |
ip_hash | 每個請求按照訪問的ip的hash結果進行分配, 使得來自同一個ip的固定訪問同一個後端伺服器 |
least_conn | 最少連結數, 當前哪個伺服器的連線數少就分發給哪個伺服器 |
url_hash | 每個請求按照訪問的url的hash結果進行分配, 使得來自同一個url的請求定向到同一個後端伺服器 |
hash關鍵值 | hash自定義的key |
測試加權輪詢:
134伺服器的配置:
輪詢和加權輪詢都是基於請求來實現的, 這種輪詢有個缺點會導致使用者的cookie等資訊丟失, 可以採取ip_hash的排程演算法:
此時通過ip下的方問就只會固定一個server
ip_hash的缺陷在於, 如果使用者在前端再走代理的話, 此時nginx是無法獲取到使用者的真是ip的, 同時如果使用者訪問的後臺是多臺伺服器的話, 那麼會導致使用者的快取發生改變, 那麼資訊也將發生改變.
解決辦法: hash關鍵值/url_hash
url_hash跟hash關鍵值其實是同一個道理, 配置語法如下:
systax: hash [key, 如$request_uri]
default: 無配置
context: upstream域
進入.conf檔案進行配置:
134伺服器:
136伺服器分別在code1/code2/code3裡面新增url1.html/url2.html/url3.html檔案, 用於區別訪問的路徑而已.
重新載入配置檔案
訪問: http://192.168.19.134/url1.html, 此時只能定向訪問到server1下的url1.html,
訪問: http://192.168.19.134/url2.html, 此時只能定向訪問到server3下的url2.html,
訪問: http://192.168.19.134/url3.html, 此時只能定向訪問到server2下的url3.html,
具體訪問哪臺伺服器則根據url的hash計算結果進行分發的.