文章目錄
- 1. 負載均衡
- 2. 負載均衡策略
- 1. 輪詢策略
- 2. 最小連接策略
- 3. IP 哈希策略
- 4. 哈希策略
- 5. 加權輪詢策略
1. 負載均衡
跨多個應用程序實例的負載平衡是一種常用技術,用于優化資源利用率、最大化吞吐量、減少延遲和確保容錯配置。?使用 nginx 作為非常有效的HTTP負載平衡器,將流量分配到多個應用程序服務器,可以提升Web應用程序的性能,提高擴展性和可靠性。
使用 upstream
定義一組服務 。
# 啟動ruoyi-admin服務
[root@nginx-dev conf.d]# cd /home/apps
[root@nginx-dev apps]# java -jar ruoyi-admin.jar# 啟動tomcat服務
[root@nginx-dev ~]# /home/apache-tomcat-8.5.81/bin/startup.sh# 在 /etc/nginx/conf.d文件夾下添加nginx配置文件:8003.conf
[root@nginx-dev ~]# cd /etc/nginx/conf.d
[root@nginx-dev conf.d]# vi 8003.conf
[root@nginx-dev conf.d]# nginx -s reload
8003.conf 配置文件內容:
upstream ruoyi-apps {#不寫,采用輪循機制server localhost:8080;server localhost:8088;
}server {listen 8003;server_name ruoyi.loadbalance;location / {proxy_pass http://ruoyi-apps;}# 請求ie頁面location = /html/ie.html {root /some/path/static;}# 請求字體文件location ^~ /fonts/ {root /some/path/static;}# css|js|png|jpg|gif|ico 頁面location ~ \.(css|js|png|jpg|gif|ico) {root /some/path/static;}
}
2. 負載均衡策略
1. 輪詢策略
upstream ruoyi-apps {#不寫,采用輪循機制server localhost:8080;server localhost:8088;
}
輪詢策略(Round Robin):默認的負載均衡策略,將請求依次分配給每個后端服務器,循環往復。
例如,當請求 nginx 的 8003 端口時,會將請求輪詢轉發給 tomcat 和 ruoyi-admin 兩個后端服務器,即第1次請求會訪問8080端口,第2次請求會訪問8088端口,循環往復。
當訪問 nginx 的 8003 端口時 ,請求會進入 8088 端口的 ruoyi-admin 服務,當填寫完密碼以后點擊登錄,這次請求會進入 8080 端口的 tomcat 服務,因此總是登錄不成功。
2. 最小連接策略
最少連接策略(Least Connections):將請求分配給當前連接數最少的后端服務器,以達到負載均衡的目的。
upstream backend {least_conn;server backend1.example.com;server backend2.example.com;
}
請注意,使用輪循機制或最少連接的負載平衡,每個客戶端的請求都可能分發到不同的服務器。不能保證同一客戶端將始終定向到同一服務器。?
3. IP 哈希策略
IP 哈希策略(IP Hash):根據客戶端 IP 地址的哈希值來選擇后端服務器,同一個客戶端的請求總是被分配到同一個后端服務器上。
upstream backend {ip_hash;server backend1.example.com;server backend2.example.com;
}
此方法可確保來自同一客戶端的請求將始終定向到同一服務器,除非此服務器不可用。
4. 哈希策略
通用hash,允許用戶自定義hash的key,key可以是字符串、變量或組合。例如,key可以是配對的源 IP 地址和端口,也可以是 URI,如以下示例所示:?
upstream backend {hash $request_uri consistent;server backend1.example.com;server backend2.example.com;
}
請注意:基于 IP 的哈希算法存在一個問題,那就是當有一個上游服務器宕機或者擴容的時候,會引發大量的路由變更,進而引發連鎖反應,導致大量緩存失效等問題。
假設我們基于 key 來做 hash,現在有 4 臺上游服務器,如果 hash 算法對 key 取模,請求根據用戶定義的哈希鍵值均勻分布在所有上游服務器之間。當有一臺服務器宕機的時候,就需要重新對 key 進行 hash,最后會發現所有的對應關系全都失效了,從而會引發緩存大范圍失效。
consistent
參數啟用 ??ketama?? 一致哈希算法,如果在上游組中添加或刪除服務器,只會重新映射部分鍵,從而最大限度地減少緩存失效。?
5. 加權輪詢策略
加權輪詢策略(Weighted Round Robin):根據后端服務器的權重來分配請求,權重越高的服務器被分配到的請求越多。
upstream my-server {server performance.server weight=3;server app1.server;server app2.server;
}
如上所示,每 5 個新請求將按如下方式分布在應用程序實例中:3 個請求將定向到 performance.server,一個請求將轉到 app1.server,另一個請求將轉到 app2.server。?