天天看點

16-Nginx負載均衡政策詳解

負載均衡

輪詢

預設的負載均衡政策, 常用于多台伺服器,資源配置一樣的情況, 這樣可以把流量均勻的配置設定到每台伺服器

權重輪詢

一把來說, 可能第一次部署的伺服器配置都是一樣的, 但是到了後期, 業務快速拓展, 就需要增加伺服器, 并且購買的也是性能更高的伺服器, 這個時候輪詢,政策就不太好了, 這個時候就需要用到​

​權重輪詢​

​了

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

圖解

16-Nginx負載均衡政策詳解

hash算法

16-Nginx負載均衡政策詳解

使用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算法

16-Nginx負載均衡政策詳解

hash算法帶來的問題

16-Nginx負載均衡政策詳解

無論節點增加或者減少, 都會帶來所有的請求ip重新計算問題, 并且如果是有狀态請求, 那麼所有的會話都會丢失, 那麼如何解決呢? 一緻性hash算法

一緻性HASH算法

16-Nginx負載均衡政策詳解

會從0-232-1形成一個環, 然後将伺服器節點通過HASH計算後放到環上的某個節點, 然後使用者在通路的時候,也通過HASH計算落在環上的某個節點, 然後順時針落在最近的伺服器上,來達到分流的效果

16-Nginx負載均衡政策詳解

一旦減少了某台伺服器, 比如減少了節點3, 那麼節點3的使用者會順時針落到節點4上, 并且隻有這一部分使用者會重新計算并失去會話狀态

16-Nginx負載均衡政策詳解

如果是新增加了伺服器5, 那麼隻會是更少的使用者重新計算, 然後落到伺服器5上,并不會所有使用者全部重新計算, 解決了hash算法帶來的問題

url_hash

圖解

16-Nginx負載均衡政策詳解

設定方式

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了, 不然扛不住

16-Nginx負載均衡政策詳解

浏覽器通路Nginx, 應為是url_hash算法, 是以固定的路徑會比對到固定的伺服器, 因為search搜尋的壓力最大,也是最常用的, 是以不直接挂Tomcat, 而是繼續挂載Nginx, 采用輪序分發流量給下面的search叢集, 用于分發壓力, 避免當機問題

least_conn

圖解

16-Nginx負載均衡政策詳解

根據最少的連接配接數配置設定請求

設定方式

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;
  }
}      

繼續閱讀