一、負載均衡
當一台服務器的訪問量越大時,服務器所承受的壓力也就越大,超出自身所指定的訪問壓力就會崩掉,避免發生此類事情的發生,因此也就有了負載均衡來分擔服務器的壓力。 那麼究竟什麼是負載均衡呢?通俗些講,就是我們有幾十台、幾百台甚至更多服務器,將這些服務器組成一個服務器集群,當客戶端訪問某台設備的數據時,首先發送的請求先到一台中間服務器,並通過中間服務器在服務器集群中平均分攤到其他服務器中,因此,當用戶每次所發送的請求都將會保證服務器集群中的設備均與平攤,以此來分擔服務器的壓力,從而保持服務器集群的整理性能最優,避免出現有崩潰的現象。

二、Nginx負載均衡的作用
- 轉發功能:Nginx 會按照一定的算法輪詢、權重將客戶端發來的請求轉發至不同的應用服務器上,同時減輕單台服務器的壓力,提高服務器的並發量;
- 故障遷移:當一台服務器出現了故障時,客戶端發來的請求將自動發送到其他服務器; * 添加恢復:當故障服務器恢復正常工作時,將自動添加到處理用戶請求中;
三、Nginx負載均衡的幾種策略方式
1)輪詢(默認) 客戶端發出的每個請求將按照時間順序逐一分配到不同的後端服務器,如後端服務器down掉,能自動剔除。
upstream backserver { server 192.168.1.10; server 192.168.1.11; }
2)weight
weight 代表權重,默認為1,權重越高被分配的客戶端也就越多。 指定輪詢幾率,weight和訪問比率成正比,用於後端服務器性能不均的情況,也就是說:哪個 server 的連接數少,路由就到哪個 server 中去。
upstream backserver { server 192.168.1.10 weight=3; server 192.168.1.11 weight=7;}
3)ip_hash
每個請求按訪問 IP 的hash結果分配,每個訪客固定訪問一個後端服務器,可解決session的問題。
upstream backserver { ip_hash; server 192.168.1.10:80; server 192.168.1.11:88; }
4)fair(第三方) 按後端服務器的響應時間來分配請求,響應時間短的優先分配。
upstream backserver { server server1; server server2; fair; }
5)url_hash(第三方) 按訪問url的hash結果來分配請求,使每個url定向到同一個後端服務器,後端服務器為緩存時比較有效。
upstream backserver { server squid1:3128; server squid2:3128; hash $request_uri; hash_method crc32; }
這裡推薦大家可以看看Linux C/C++ 高級開發架構的【免費】課程:
課程內容的話和騰訊C++後台開發T8職級技術棧對標,圍繞數據結構與算法、數據庫、網絡、操作系統、網絡編程、分布式架構等方面全面提升,值得學習一波~

四、常見的負載均衡方案有哪些?
將下圖進行拆分,其常見互聯網分布式架構,主要分為:
- 客戶端層
- 反向代理層
- 服務器站點層
- 服務層
- 數據層

因此,可以看出,從一台客戶端發出的請求到最終的數據層,上游都可以訪問到下游,實現最終的均勻平攤。 第一層:從客戶端層到反向代理層 客戶端層到反向代理層的負載均衡,通過DNS輪詢實現,在DNS服務器上對應的域名配置多個IP,當客戶端發出的請求到DNS服務器時,會輪詢返回對應域名配置的 IP,保證解析的IP是必須與Nginx服務器的IP是相同的,以此Nginx服務器的請求分配也將是均衡的。

第二層:從反向代理層到服務器站點層 反向代理層到服務器站點層的負載均衡,通過Nginx實現,修改nginx.conf配置文件,實現多種負載均衡策略; PS:這裡我們通過nginx.conf配置文件的方式進行實現,其主要實現的方式可參考上述:三、Nginx負載均衡的幾種方式(主要包括:輪詢、weight、ip_hash、fair(第三方)、url_hash(第三方)的相關描述)

第三層:從服務器站點層到服務層 服務器站點層到服務層的負載均衡,是通過服務連接池實現的,上游連接池會建立與下游服務多個連接,每次請求將會隨機選取連接來訪問下游服務。

第四層:從服務層到數據層 服務層到數據層時,數據量很大的情況下,數據層(db,cache)會涉及數據的水平切分,所以數據層的負載均衡會更加複雜一些,分為數據的均衡與請求的均衡。
- 數據的均衡:是指水平切分後的每個服務(db,cache),數據量是均勻的。
- 請求的均衡:是指水平切分後的每個服務(db,cache),請求量是均勻的。
常見的水平切分方式有兩種: 第一種:按照range水平切分

每一個數據服務,存儲一定範圍的數據
- user0 服務,存儲 uid 範圍:1-1kw;
- user1 服務,存儲 uid 範圍:1kw-2kw;
這個方案的好處是:
- 規則簡單,service 只需判斷一下 uid 範圍就能路由到對應的存儲服務;
- 數據均衡性較好;
- 易擴展,可隨時加一個 uid [2kw,3kw] 的數據服務;
這個方案的不足是: 請求的負載不一定均衡,對新用戶會比老用戶更活躍,大 range 的服務請求壓力會更大。 第二種:按照 id 哈希水平切分

每一個數據服務,存儲某個 key 值 hash 後的部分數據
- user0 服務,存儲偶數 uid 數據;
- user1 服務,存儲奇數 uid 數據;
這個方案的好處是:
- 規則簡單,service 需對 uid 進行 hash 能路由到對應的存儲服務;
- 數據均衡性較好;
- 請求均勻性較好;
這個方案的不足是:
- 不易擴展,擴展一個數據服務,hash 方法改變時候,可能需要進行數據遷移。
五、Nginx負載均衡配置實例
1、實現效果 在瀏覽器地址欄中輸入,負載均衡效果平均到端口號8080和8081中。 2、準備工作 1) 準備兩台Tomcat服務器,一台服務器為8080,另一台服務器為8081。 2) 分別在兩台Tomcat服務器中的webapps目錄中,創建名稱是abc文件夾,在abc文件夾中創建頁面20200320.html,進行測試。 在上一篇文章中,我們對其兩台Tomcat服務創建好了8080和8081,所以這裡我們就無需在創建了,並且分別查看8080和8081服務下webapps目錄中是否都存在測試頁面文件,如沒有可自行創建即可。
Tomcat8080
# cat /root/tomcat8080/apache-tomcat-7.0.70/webapps/abc/20200320.html<h1>welcome to tomcat 8080!</h1>
Tomcat8081
# cd /root/tomcat8081/apache-tomcat-7.0.70/webapps/# mkdir abc# cd abc/# vim 20200320.html<h1>welcome to tomcat 8081!</h1>
切換到
/root/tomcat8081/apache-tomcat-7.0.70/bin/目錄下,啟動8081的Tomcat服務。
# ./startup.sh Using CATALINA_BASE: /root/tomcat8081/apache-tomcat-7.0.70Using CATALINA_HOME: /root/tomcat8081/apache-tomcat-7.0.70Using CATALINA_TMPDIR: /root/tomcat8081/apache-tomcat-7.0.70/tempUsing JRE_HOME: /usrUsing CLASSPATH: /root/tomcat8081/apache-tomcat-7.0.70/bin/bootstrap.jar:/root/tomcat8081/apache-tomcat-7.0.70/bin/tomcat-juli.jarTomcat started.
測試驗證 在客戶端瀏覽器中分別測試Tomcat8080:
和Tomcat8081進行驗證。

Tomcat8080

Tomcat8081 3) 在 Nginx 的配置文件中進行負載均衡的配置; 在http模塊下添加upstream myserver配置、server_name 由原來的localhost改為Nginx服務器地址,在location下添加proxy_pass http://myserver;即可;
# vim /usr/local/nginx/conf/nginx.conf 17 http { 18 ...... 34 upstream myserver { 35 server 192.168.1.10:8080; 36 server 192.168.1.10:8081; 37 } 38 39 server { 40 listen 80; 41 server_name 192.168.1.10; 42 43 #charset koi8-r; 44 45 #access_log logs/host.access.log main; 46 47 location / { 48 proxy_pass http://myserver; 49 root html; 50 index index.html index.htm; 51 } 52 ......
操作完 Nginx 文件的負載均衡的配置後,重啟Nginx服務,出現如下問題:
# ./nginx -s stopnginx: [warn] conflicting server name "192.168.1.10" on 0.0.0.0:80, ignored# ./nginx
意思是重複綁定了server name,該警告不會影響到服務器運行。而且,這個重複綁定的意思是現在運行的Nginx服務和將要加載的新配置中的重複,所以,這個警告其實是不必的。 測試驗證 在客戶端瀏覽器中輸入:
,不斷刷新,觀察變化,這就是在將客戶端發出的請求分擔到不同的Tomcat服務中去,也就是所謂負載均衡的一個效果。

負載均衡所實現的效果 總結 通過本篇文章介紹了什麼的負載均衡、Nginx負載均衡的作用、Nginx負載均衡的幾種策略方式、常見的負載均衡方案、Nginx負載均衡配置實例等;負載均衡是分布式系統架構設計中必須考慮的因素之一,通常是指:將請求/數據均勻分攤到多個操作單元上執行,其的關鍵在於均勻:
- 反向代理層的負載均衡,是通過DNS輪詢實現;
- 服務器站點層的負載均衡,是通過Nginx實現;
- 服務層的負載均衡,是通過服務連接池實現;
- 數據層的負載均衡,要考慮數據的均衡與請求的均衡兩點,其常見的方式有按照範圍水平切分與hash水平切分
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/284321.html