做者:JackTian
公衆號:傑哥的IT之旅(ID:Jake_Internet)html
這是我參與更文挑戰的第 3 天,活動詳情查看:更文挑戰nginx
當一臺服務器的訪問量越大時,服務器所承受的壓力也就越大,超出自身所指定的訪問壓力就會崩掉,避免發生此類事情的發生,所以也就有了負載均衡來分擔服務器的壓力。web
那麼究竟什麼是負載均衡
呢?通俗些講,就是咱們有幾十臺、幾百臺甚至更多服務器,將這些服務器組成一個服務器集羣,當客戶端訪問某臺設備的數據時,首先發送的請求先到一臺中間服務器,並經過中間服務器在服務器集羣中平均分攤到其餘服務器中
,所以,當用戶每次所發送的請求都將會保證服務器集羣中的設備均與平攤,以此來分擔服務器的壓力,從而保持服務器集羣的整理性能最優
,避免出現有崩潰的現象。算法
轉發功能
:Nginx 會按照必定的算法輪詢、權重將客戶端發來的請求轉發至不一樣的應用服務器上,同時減輕單臺服務器的壓力,提升服務器的併發量;故障遷移
:當一臺服務器出現了故障時,客戶端發來的請求將自動發送到其餘服務器; * 添加恢復
:當故障服務器恢復正常工做時,將自動添加處處理用戶請求中;客戶端發出的每一個請求將按照時間順序逐一分配到不一樣的後端服務器,如後端服務器down掉,能自動剔除。apache
upstream backserver {
server 192.168.1.10;
server 192.168.1.11;
}
複製代碼
weight 表明權重,默認爲1,權重越高被分配的客戶端也就越多。bootstrap
指定輪詢概率,weight
和訪問
比率成正比,用於後端服務器性能不均的狀況,也就是說:哪一個 server 的鏈接數少,路由就到哪一個 server 中去。vim
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
文件夾中建立頁面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
進行驗證。
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水平切分
原創不易,若是你以爲這篇文章對你有點用的話,麻煩你爲本文點個贊、評論或轉發一下,由於這將是我輸出更多優質文章的動力,感謝!
咱們下期再見!