Nginx系列教程(三)| 一文帶你讀懂Nginx的負載均衡

Nginx系列教程(三)| 一文帶你讀懂Nginx的負載均衡

作者:JackTian
微信公衆號:傑哥的IT之旅(ID:Jake_Internet)

LAMP 系列導讀

  1. LAMP 系列教程(一)| 詳解 Linux 環境下部署 HTTPD 服務
  2. LAMP 系列教程(二)| 如何在 Linux 環境下部署 AWStats 分析系統來監控 Web 站點?
  3. LAMP 系列教程(三)| 一文讀懂 HTTPD 服務的訪問控制
  4. LAMP 系列教程(四)| MySQL 數據庫系統(一)
  5. LAMP 系列教程(五)| MySQL 數據庫系統(二)- SQL語句的基本操作
  6. LAMP 系列教程(六)| MySQL 數據庫系統(三)- 數據庫的用戶授權
  7. LAMP 系列教程(七)| MySQL 數據庫系統(四)- 數據庫的備份與恢復
  8. LAMP 系列教程(八)| 帶你輕鬆玩轉 LAMP 網站架構平臺(一)
  9. LAMP 系列教程(九)| LAMP 架構應用案例 - 部署 PHPMyAdmin 系統(二)

LNMP 系列導讀

  1. Nginx 系列教程(一)| 手把手教你在 Linux 環境下搭建 Nginx 服務
  2. Nginx 系列教程(二)| 一文帶你讀懂 Nginx 的正向與反向代理

一、負載均衡
當一臺服務器的訪問量越大時,服務器所承受的壓力也就越大,超出自身所指定的訪問壓力就會崩掉,避免發生此類事情的發生,因此也就有了負載均衡來分擔服務器的壓力。

那麼究竟什麼是負載均衡呢?通俗些講,就是我們有幾十臺、幾百臺甚至更多服務器,將這些服務器組成一個服務器集羣,當客戶端訪問某臺設備的數據時,首先發送的請求先到一臺中間服務器,並通過中間服務器在服務器集羣中平均分攤到其他服務器中,因此,當用戶每次所發送的請求都將會保證服務器集羣中的設備均與平攤,以此來分擔服務器的壓力,從而保持服務器集羣的整理性能最優,避免出現有崩潰的現象。
Nginx系列教程(三)| 一文帶你讀懂Nginx的負載均衡

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

四、常見的負載均衡方案有哪些?
將下圖進行拆分,其常見互聯網分佈式架構,主要分爲:

客戶端層

反向代理層

服務器站點層

服務層

數據層

Nginx系列教程(三)| 一文帶你讀懂Nginx的負載均衡
因此,可以看出,從一臺客戶端發出的請求到最終的數據層,上游都可以訪問到下游,實現最終的均勻平攤。

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

Nginx系列教程(三)| 一文帶你讀懂Nginx的負載均衡
第二層:從反向代理層到服務器站點層
反向代理層到服務器站點層的負載均衡,通過Nginx實現,修改nginx.conf配置文件,實現多種負載均衡策略;

PS:這裏我們通過nginx.conf配置文件的方式進行實現,其主要實現的方式可參考上述:三、Nginx負載均衡的幾種方式(主要包括:輪詢、weight、ip_hash、fair(第三方)、url_hash(第三方)的相關描述)

Nginx系列教程(三)| 一文帶你讀懂Nginx的負載均衡
第三層:從服務器站點層到服務層
服務器站點層到服務層的負載均衡,是通過服務連接池實現的,上游連接池會建立與下游服務多個連接,每次請求將會隨機選取連接來訪問下游服務。

Nginx系列教程(三)| 一文帶你讀懂Nginx的負載均衡
第四層:從服務層到數據層
服務層到數據層時,數據量很大的情況下,數據層(db,cache)會涉及數據的水平切分,所以數據層的負載均衡會更加複雜一些,分爲數據的均衡與請求的均衡。

數據的均衡:是指水平切分後的每個服務(db,cache),數據量是均勻的。

請求的均衡:是指水平切分後的每個服務(db,cache),請求量是均勻的。

常見的水平切分方式有兩種:

第一種:按照range水平切分

Nginx系列教程(三)| 一文帶你讀懂Nginx的負載均衡
每一個數據服務,存儲一定範圍的數據

user0 服務,存儲 uid 範圍:1-1kw;

user1 服務,存儲 uid 範圍:1kw-2kw;

這個方案的好處是:

規則簡單,service 只需判斷一下 uid 範圍就能路由到對應的存儲服務;

數據均衡性較好;

易擴展,可隨時加一個 uid [2kw,3kw] 的數據服務;

這個方案的不足是:

請求的負載不一定均衡,對新用戶會比老用戶更活躍,大 range 的服務請求壓力會更大。

第二種:按照 id 哈希水平切分
Nginx系列教程(三)| 一文帶你讀懂Nginx的負載均衡

每一個數據服務,存儲某個 key 值 hash 後的部分數據

user0 服務,存儲偶數 uid 數據;

user1 服務,存儲奇數 uid 數據;

這個方案的好處是:

規則簡單,service 需對 uid 進行 hash 能路由到對應的存儲服務;

數據均衡性較好;

請求均勻性較好;

這個方案的不足是:

不易擴展,擴展一個數據服務,hash 方法改變時候,可能需要進行數據遷移。

五、Nginx負載均衡配置實例
1、實現效果
在瀏覽器地址欄中輸入http://192.168.1.10/abc/20200320.html,負載均衡效果平均到端口號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.70
Using CATALINA_HOME:   /root/tomcat8081/apache-tomcat-7.0.70
Using CATALINA_TMPDIR: /root/tomcat8081/apache-tomcat-7.0.70/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /root/tomcat8081/apache-tomcat-7.0.70/bin/bootstrap.jar:/root/tomcat8081/apache-tomcat-7.0.70/bin/tomcat-juli.jar
Tomcat started.

測試驗證

在客戶端瀏覽器中分別測試Tomcat8080:http://192.168.1.10/abc/20200320.html和Tomcat8081:http://192.168.1.10:8081/abc/20200320.html進行驗證
Nginx系列教程(三)| 一文帶你讀懂Nginx的負載均衡
Tomcat8080
Nginx系列教程(三)| 一文帶你讀懂Nginx的負載均衡


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 stop
nginx: [warn] conflicting server name "192.168.1.10" on 0.0.0.0:80, ignored
# ./nginx

意思是重複綁定了server name,該警告不會影響到服務器運行。而且,這個重複綁定的意思是現在運行的Nginx服務和將要加載的新配置中的重複,所以,這個警告其實是不必的。

測試驗證

在客戶端瀏覽器中輸入:http://192.168.1.10/abc/20200320.html,不斷刷新,觀察變化,這就是在將客戶端發出的請求分擔到不同的Tomcat服務中去,也就是所謂負載均衡的一個效果

Nginx系列教程(三)| 一文帶你讀懂Nginx的負載均衡
負載均衡所實現的效果
總結
通過本篇文章介紹了什麼的負載均衡、Nginx負載均衡的作用、Nginx負載均衡的幾種策略方式、常見的負載均衡方案、Nginx負載均衡配置實例等;負載均衡是分佈式系統架構設計中必須考慮的因素之一,通常是指:將請求/數據均勻分攤到多個操作單元上執行,其的關鍵在於均勻:


反向代理層的負載均衡,是通過DNS輪詢實現;

服務器站點層的負載均衡,是通過Nginx實現;

服務層的負載均衡,是通過服務連接池實現;

數據層的負載均衡,要考慮數據的均衡與請求的均衡兩點,其常見的方式有按照範圍水平切分與hash水平切分

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章