做者:JackTian
微信公衆號:傑哥的IT之旅(ID:Jake_Internet)html
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
01. Nginx 系列教程(一)| 手把手教你在 Linux 環境下搭建 Nginx 服務
02. Nginx 系列教程(二)| 一文帶你讀懂 Nginx 的正向與反向代理nginx
當一臺服務器的訪問量越大時,服務器所承受的壓力也就越大,超出自身所指定的訪問壓力就會崩掉,避免發生此類事情的發生,所以也就有了負載均衡來分擔服務器的壓力。web
那麼究竟什麼是負載均衡
呢?通俗些講,就是咱們有幾十臺、幾百臺甚至更多服務器,將這些服務器組成一個服務器集羣,當客戶端訪問某臺設備的數據時,首先發送的請求先到一臺中間服務器,並經過中間服務器在服務器集羣中平均分攤到其餘服務器中
,所以,當用戶每次所發送的請求都將會保證服務器集羣中的設備均與平攤,以此來分擔服務器的壓力,從而保持服務器集羣的整理性能最優
,避免出現有崩潰的現象。
面試
轉發功能
:Nginx 會按照必定的算法輪詢、權重將客戶端發來的請求轉發至不一樣的應用服務器上,同時減輕單臺服務器的壓力,提升服務器的併發量;算法
故障遷移
:當一臺服務器出現了故障時,客戶端發來的請求將自動發送到其餘服務器;數據庫
添加恢復
:當故障服務器恢復正常工做時,將自動添加處處理用戶請求中;apache
客戶端發出的每一個請求將按照時間順序逐一分配到不一樣的後端服務器,如後端服務器down掉,能自動剔除。bootstrap
upstream backserver { server 192.168.1.10; server 192.168.1.11; }
weight 表明權重,默認爲1,權重越高被分配的客戶端也就越多。vim
指定輪詢概率,weight
和訪問
比率成正比,用於後端服務器性能不均的狀況,也就是說:哪一個 server 的鏈接數少,路由就到哪一個 server 中去。
upstream backserver { server 192.168.1.10 weight=3; server 192.168.1.11 weight=7; }
每一個請求按訪問 IP 的hash
結果分配,每一個訪客固定訪問一個後端服務器,可解決session
的問題。
upstream backserver { ip_hash; server 192.168.1.10:80; server 192.168.1.11:88; }
按後端服務器的響應時間來分配請求,響應時間短的優先分配。
upstream backserver { server server1; server server2; fair; }
按訪問url
的hash
結果來分配請求,使每一個url
定向到同一個後端服務器,後端服務器爲緩存時比較有效。
upstream backserver { server squid1:3128; server squid2:3128; hash $request_uri; hash_method crc32; }
將下圖進行拆分,其常見互聯網分佈式架構,主要分爲:
客戶端層到反向代理層的負載均衡,經過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 能路由到對應的存儲服務;數據均衡性較好
;請求均勻性較好
;這個方案的不足
是:
在瀏覽器地址欄中輸入http://192.168.1.10/abc/20200320.html
,負載均衡效果平均到端口號8080
和8081
中。
1) 準備兩臺Tomcat
服務器,一臺服務器爲8080
,另外一臺服務器爲8081
。
2) 分別在兩臺Tomcat
服務器中的webapps
目錄中,建立名稱是abc
文件夾,在abc
文件夾中建立頁面20200325.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/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技術乾貨文章,以及不按期的分享學習資料,實用工具,面試經驗
等,固然了還有內推機會
哦,期待你的關注!