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

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

LAMP 系列導讀

01. LAMP 系列教程(一)| 詳解 Linux 環境下部署 HTTPD 服務
02. LAMP 系列教程(二)| 如何在 Linux 環境下部署 AWStats 分析系統來監控 Web 站點?
03. LAMP 系列教程(三)| 一文讀懂 HTTPD 服務的訪問控制
04. LAMP 系列教程(四)| MySQL 數據庫系統(一)
05. LAMP 系列教程(五)| MySQL 數據庫系統(二)- SQL語句的基本操做
06. LAMP 系列教程(六)| MySQL 數據庫系統(三)- 數據庫的用戶受權
07. LAMP 系列教程(七)| MySQL 數據庫系統(四)- 數據庫的備份與恢復
08. LAMP 系列教程(八)| 帶你輕鬆玩轉 LAMP 網站架構平臺(一)
09. LAMP 系列教程(九)| LAMP 架構應用案例 - 部署 PHPMyAdmin 系統(二)java

LNMP 系列導讀

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

1、負載均衡

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

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

2、Nginx負載均衡的做用

  • 轉發功能:Nginx 會按照必定的算法輪詢、權重將客戶端發來的請求轉發至不一樣的應用服務器上,同時減輕單臺服務器的壓力,提升服務器的併發量;算法

  • 故障遷移:當一臺服務器出現了故障時,客戶端發來的請求將自動發送到其餘服務器;數據庫

  • 添加恢復:當故障服務器恢復正常工做時,將自動添加處處理用戶請求中;apache

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

1)輪詢(默認)

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

upstream backserver {
    server 192.168.1.10;
    server 192.168.1.11;
    }
2)weight

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

指定輪詢概率,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(第三方)

按訪問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文件夾中建立頁面20200325.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/20200325.html進行驗證。
在這裏插入圖片描述
在這裏插入圖片描述
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水平切分

來和上萬名讀者一塊兒見證彼此成長!

掃描下方二維碼,添加傑哥微信,備註:地區/城市-職業方向/學校-暱稱,便可加入傑哥的IT之旅讀者羣,羣內僅供學習交流、平常互動、資源分享、經驗分享等,必定要記得備註,我會盡快經過好友驗證的。

👆長按識別,添加微信


推薦閱讀

一、 萬字長文帶你瞭解最經常使用的開源 Squid 代理服務器
二、 一款經常使用的 Squid 日誌分析工具
三、 爲何要學習 Markdown?究竟有什麼用?
四、 GitHub 標星 2.5K+!教你經過玩遊戲的方式學習 VIM!
五、 GitHub 標星 8K+!一款開源替代 ls 的工具你值得擁有!
六、 Linux 環境下實戰 Rsync 備份工具及配置 rsync+inotify 實時同步
七、 沒有一行代碼,「2020 新冠肺炎記憶」這個項目卻登上了 GitHub 中文趨勢榜第一!
八、 RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 實現無人值守安裝
九、 Nginx系列教程(一)| 手把手教你在Linux環境下搭建Nginx服務
十、 Nginx系列教程(二)| 一文帶你讀懂Nginx的正向與反向代理

今天的推薦不知道你們喜歡嗎?若是你喜歡,請在文章底部留言和點贊,以表示對個人支持,大家的留言點贊是我持續更新的動力哦,感謝你們!

一、點個贊,讓更多的人看到這篇文章,順便激勵下我,嘻嘻。

二、關注個人原創微信公衆號「傑哥的IT之旅」專一於IT技術乾貨文章,以及不按期的分享學習資料,實用工具,面試經驗等,固然了還有內推機會哦,期待你的關注!

歡迎關注個人微信公衆號

相關文章
相關標籤/搜索