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

做者:JackTian
公衆號:傑哥的IT之旅(ID:Jake_Internet)html

這是我參與更文挑戰的第 3 天,活動詳情查看:更文挑戰nginx


1、負載均衡

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

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

圖片

2、Nginx負載均衡的做用

  • 轉發功能:Nginx 會按照必定的算法輪詢、權重將客戶端發來的請求轉發至不一樣的應用服務器上,同時減輕單臺服務器的壓力,提升服務器的併發量;
  • 故障遷移:當一臺服務器出現了故障時,客戶端發來的請求將自動發送到其餘服務器; * 添加恢復:當故障服務器恢復正常工做時,將自動添加處處理用戶請求中;

3、Nginx負載均衡的幾種策略方式

1)輪詢(默認)

客戶端發出的每一個請求將按照時間順序逐一分配到不一樣的後端服務器,如後端服務器down掉,能自動剔除。apache

upstream backserver {
    server 192.168.1.10;
    server 192.168.1.11;
    }
複製代碼
2)weight

weight 表明權重,默認爲1,權重越高被分配的客戶端也就越多。bootstrap

指定輪詢概率,weight訪問比率成正比,用於後端服務器性能不均的狀況,也就是說:哪一個 server 的鏈接數少,路由就到哪一個 server 中去。vim

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(第三方)

按訪問urlhash結果來分配請求,使每一個url定向到同一個後端服務器,後端服務器爲緩存時比較有效。緩存

upstream backserver {
    server squid1:3128;
    server squid2:3128;
    hash $request_uri;
    hash_method crc32;
    }
複製代碼

4、常見的負載均衡方案有哪些?

將下圖進行拆分,其常見互聯網分佈式架構,主要分爲:

  • 客戶端層
  • 反向代理層
  • 服務器站點層
  • 服務層
  • 數據層

圖片

所以,能夠看出,從一臺客戶端發出的請求到最終的數據層,上游均可以訪問到下游,實現最終的均勻平攤。

第一層:從客戶端層到反向代理層

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

圖片

第二層:從反向代理層到服務器站點層

反向代理層到服務器站點層的負載均衡,經過Nginx實現,修改nginx.conf配置文件,實現多種負載均衡策略;

PS:這裏咱們經過nginx.conf配置文件的方式進行實現,其主要實現的方式可參考上述:3、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 方法改變時候,可能須要進行數據遷移。

5、Nginx負載均衡配置實例

一、實現效果

在瀏覽器地址欄中輸入http://192.168.1.10/abc/20200320.html,負載均衡效果平均到端口號80808081中。

二、準備工做

1) 準備兩臺Tomcat服務器,一臺服務器爲8080,另外一臺服務器爲8081

2) 分別在兩臺Tomcat服務器中的webapps目錄中,建立名稱是abc文件夾,在abc文件夾中建立頁面20200320.html,進行測試。

在上一篇文章中,咱們對其兩臺Tomcat服務建立好了80808081,因此這裏咱們就無需在建立了,而且分別查看80808081服務下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/目錄下,啓動8081Tomcat服務。

# ./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.
複製代碼

測試驗證

在客戶端瀏覽器中分別測試Tomcat8080http://192.168.1.10/abc/20200320.htmlTomcat8081http://192.168.1.10:8081/abc/20200320.html進行驗證。

圖片

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 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負載均衡配置實例等;負載均衡是分佈式系統架構設計中必須考慮的因素之一,一般是指:將請求/數據均勻分攤到多個操做單元上執行,其的關鍵在於均勻:

  • 反向代理層的負載均衡,是經過DNS輪詢實現;
  • 服務器站點層的負載均衡,是經過Nginx實現;
  • 服務層的負載均衡,是經過服務鏈接池實現;
  • 數據層的負載均衡,要考慮數據的均衡請求的均衡兩點,其常見的方式有按照範圍水平切分hash水平切分

原創不易,若是你以爲這篇文章對你有點用的話,麻煩你爲本文點個贊、評論或轉發一下,由於這將是我輸出更多優質文章的動力,感謝!

咱們下期再見!

相關文章
相關標籤/搜索