upstream負載均衡
語法規則
upstream *name*
{ … }
Default:——
Context:http
定義一組服務器。服務器可以偵聽不同的端口(可以混合偵聽TCP和UNIX域套接字的服務器)
http{
# backend是虛擬服務的名字,可自行定義
upstream backend {
server backend1.example.com weight=5;
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
server unix:/tmp/backend3;
server backup1.example.com backup;
}
server {
listen 80;
server_name dh
location / {
# 這裏的proxy_pass的http://後面的部分要配置成 upstream的服務名稱
proxy_pass http://dh;
}
}
upstream dh {
server localhost:8088;
server localhost:8089;
}
}
服務器在負載均衡調度的狀態
調度狀態 | 狀態解析 |
---|---|
down | 當前的server暫時不參與負載均衡 |
backup | 預留的備份服務器 |
max_fails | 允許請求失敗的次數 |
fail_timeout | 經過max_fails的失敗次數後,服務暫停的時間 |
max_conns | 限制最大的接收的連接數 |
upstream dh {
# 負載均衡不會分配到 dh1.com 這臺機子
server dh1.com down;
# 預留備份即其他參與負載均衡的機子都提供不了服務的時候
# 預留的機子就會頂上,由預留機子提供服務直到其他機子其中一個恢復
# 當其他提供服務的機子恢復後,該機子會自動變回預留狀態,從而由其他機子提供服務
server dh2.com backup;
# 表示允許失敗的次數是10次,十次調用失敗後,需要等待30s再重新檢查該機子
server dh3.com max_fails=10 fail_timeout=30s;
server dh4.com max_conns=1000;
}
調度算法
算法名稱 | 算法原理 |
---|---|
輪詢 | 按時間順序逐一分配到不同的後端服務器 |
加權輪詢 | weight值越大,分配到的訪問機率越高 |
ip_hash | 每個請求按訪問IP的hash結果分配,這樣來自同一個IP的請求將會固定訪問一個後端服務器 |
url_hash | 按照訪問URL的hash結果來分配請求,這樣每個URL定向到同一個後端服務器 |
least_conn | 最少連接數,哪個機器的連接數少就分發給哪個機器 |
hash關鍵數值 | hash自定義的key來分發請求 |
# 加權方式(weight默認是1)
upstream dh {
server dh1.com down weight=8;
server dh2.com backup weight=6;
server dh3.com max_fails=10 fail_timeout=30s weight=1;
}
# ip_hash方式
upstream dh {
ip_hash;
server dh1.com down;
server dh2.com backup;
server dh3.com max_fails=10 fail_timeout=30s;
}
# url_hash方式 (其實也就是採用了hash 關鍵字的形式)
upstream dh {
hash $request_uri;
server dh1.com down;
server dh2.com backup;
server dh3.com max_fails=10 fail_timeout=30s;
}
# least_conn方式
# 指定組應使用負載平衡方法,其中請求以最少數量的活動連接傳遞給服務器
#同時考慮服務器的權重。如果有多個這樣的服務器,則使用加權循環平衡方法依次嘗試它們
upstream dh {
least_conn;
server dh1.com down;
server dh2.com backup;
server dh3.com max_fails=10 fail_timeout=30s;
}