負載均衡
輪詢
預設的負載均衡政策, 常用于多台伺服器,資源配置一樣的情況, 這樣可以把流量均勻的配置設定到每台伺服器
權重輪詢
一把來說, 可能第一次部署的伺服器配置都是一樣的, 但是到了後期, 業務快速拓展, 就需要增加伺服器, 并且購買的也是性能更高的伺服器, 這個時候輪詢,政策就不太好了, 這個時候就需要用到
權重輪詢
了
upstream tomcats {
# 預設weight=1 也就是輪詢, weight 值越高, 配置設定的流量就越多
# 老伺服器
server 192.168.247.136:8001 weight=1;
# 中間購買的伺服器 配置比老伺服器好一些
server 192.168.247.136:8002 weight=3;
# 最新購買的伺服器 配置最好
server 192.168.247.136:8003 weight=5;
}
server{
listen 80;
server_name www.tomcat.com;
location / {
proxy_pass http://tomcats;
}
}
ip_hash
圖解
hash算法
使用Hash算法可以保證使用者的每一次請求都是通路到同一台伺服器的, 如果是有狀态請求, 可以保持狀态的不丢失, 比如session, 當然現在基本沒有人用有狀态請求了, 現在都是講究無狀态請求的
設定方式
upstream tomcats {
# 使用ip_hash負載均衡政策
ip_hash;
server 192.168.247.136:8001;
server 192.168.247.136:8002;
server 192.168.247.136:8003;
}
server{
listen 80;
server_name www.tomcat.com;
location / {
proxy_pass http://tomcats;
}
}
ip_hash算法
hash算法帶來的問題
無論節點增加或者減少, 都會帶來所有的請求ip重新計算問題, 并且如果是有狀态請求, 那麼所有的會話都會丢失, 那麼如何解決呢? 一緻性hash算法
一緻性HASH算法
會從0-232-1形成一個環, 然後将伺服器節點通過HASH計算後放到環上的某個節點, 然後使用者在通路的時候,也通過HASH計算落在環上的某個節點, 然後順時針落在最近的伺服器上,來達到分流的效果
一旦減少了某台伺服器, 比如減少了節點3, 那麼節點3的使用者會順時針落到節點4上, 并且隻有這一部分使用者會重新計算并失去會話狀态
如果是新增加了伺服器5, 那麼隻會是更少的使用者重新計算, 然後落到伺服器5上,并不會所有使用者全部重新計算, 解決了hash算法帶來的問題
url_hash
圖解
設定方式
upstream tomcats {
# 使用url_hash負載均衡政策
hash $request_uri;
server 192.168.247.136:8001;
server 192.168.247.136:8002;
server 192.168.247.136:8003;
}
server{
listen 80;
server_name www.tomcat.com;
location / {
proxy_pass http://tomcats;
}
}
使用url_hash的時候需要注意, 因為是根據uri計算的, 是以固定的uri會落在固定的伺服器上, 如果是比較熱點的uri, 那麼就需要再挂載Nginx了, 不然扛不住
浏覽器通路Nginx, 應為是url_hash算法, 是以固定的路徑會比對到固定的伺服器, 因為search搜尋的壓力最大,也是最常用的, 是以不直接挂Tomcat, 而是繼續挂載Nginx, 采用輪序分發流量給下面的search叢集, 用于分發壓力, 避免當機問題
least_conn
圖解
根據最少的連接配接數配置設定請求
設定方式
upstream tomcats {
# 使用least_conn負載均衡政策
least_conn;
server 192.168.247.136:8001;
server 192.168.247.136:8002;
server 192.168.247.136:8003;
}
server{
listen 80;
server_name www.tomcat.com;
location / {
proxy_pass http://tomcats;
}
}