一、什麼是負載均衡
負載均衡(Load Balance)其意思就是分攤到多個操作單元上進行執行,例如Web伺服器、FTP伺服器、企業關鍵應用伺服器和其它關鍵任務伺服器等,進而共同完成工作任務。
負載均衡建立在現有網絡結構之上,它提供了一種廉價有效透明的方法擴充網絡裝置和伺服器的帶寬、增加吞吐量、加強網絡資料處理能力、提高網絡的靈活性和可用性。
負載均衡有三種部署方式:路由模式、橋接模式、服務直接傳回模式。路由模式部署靈活,約60%的使用者采用這種方式部署;橋接模式不改變現有的網絡架構;服務直接傳回(DSR)比較适合吞吐量大特别是内容分發的網絡應用。約30%的使用者采用這種模式。
負載平衡也稱負載共享,是指對系統中的負載情況進行動态調整,以盡量消除或減少系統中各節點負載不均衡的現象。具體實作方法是将過載節點上的任務轉移到其他輕載節點上,盡可能實作系統各節點的負載平衡,進而提高系統的吞吐量。負載共享有利于統籌管理分布式系統中的各種資源,便于利用共享資訊及其服務機制擴大系統的處理能力。
動态負載共享政策是指把系統中各節點上已有的負載作為參考資訊,在運作過程中,根據系統中各節點的負載狀況,随時調整負載的配置設定,使各節點盡可能保持負載的平衡。
負載:負載共享算法中的關鍵問題是如何确定負載。根據任務負載可以判斷某一任務在特定節點的響應時間,确定在該節點上的執行性能。曾經被研究及使用的負載包括CPU隊列長度、某時間内的平均CPU隊列長度、CPU使用率等。Kunz發現負載的選取對系統性能有着重要的影響,而最有效的負載計算方式是CPU隊列長度。
動機:使用者将任務送出給系統處理,由于任務到達的随機性導緻了某些處理機處于過載而某些處理處于空閑或輕載狀态。負載共享能夠通過将過載處理機上的任務遷移到輕載處理機上執行來提高性能。
性能:從靜态角度看,高性能是指各處理機上的負載基本平衡。從動态角度看,性能的尺度是任務的平均響應時間,而任務的響應時間是指任務從送出到開始執行的持續時間。
負載平衡政策:
動态負載平衡政策包含四個部分:轉移政策、選擇政策、定位政策和資訊政策。
二、負載均衡的分類
1、軟體負載均衡解決方案是指在一台或多台伺服器相應的作業系統上安裝一個或多個附加軟體來實作負載均衡,如DNS Load Balance,CheckPoint Firewall-1 ConnectControl等,它的優點是基于特定環境,配置簡單,使用靈活,成本低廉,可以滿足一般的負載均衡需求。
2、硬體負載均衡解決方案是直接在伺服器和外部網絡間安裝負載均衡裝置,這種裝置通常稱之為負載均衡器,由于專門的裝置完成專門的任務,獨立于作業系統,整體性能得到大量提高,加上多樣化的負載均衡政策,智能化的流量管理,可達到最佳的負載均衡需求。
三、什麼是動靜分離
動靜分離是指在web伺服器架構中,将靜态頁面與動态頁面或者靜态内容接口和動态内容接口分開不同系統通路的架構設計方法,進而提升整個服務通路性能和可維護性。
四、為什麼動靜分離?
因為NGINX處理靜态頁面的效率遠遠高于Tomcat的處理能力(大概處理能力比值在6:1左右);同時動态資源和靜态資源分開,伺服器結構會更加清晰明了。
五、動靜分離的大概流程:
服務端接收來自用戶端的請求中,有一部分是靜态資源的請求,例如html,css,js和圖檔資源等等,有一部分是動态資料的請求。因為tomcat處理靜态資源的速度比較慢,是以我們可以考慮把所有靜态資源獨立開來,交給處理靜态資源更快的伺服器例如nginx處理,而把動态請求交給tomcat處理。
準備一台Centos 7 的伺服器
準備jdk環境、Tomcat源碼包、Nginx源碼包
[root@ localhost ~]# cd /usr/src/
[root@ localhost src]# ll
total 147860
-r-xr-xr-x 1 root root 8234674 2019-12-02 16:05 apache-tomcat-7.0.47.tar.gz
drwxr-xr-x. 2 root root 6 2016-11-05 23:38 debug
-r-xr-xr-x 1 root root 467 2019-12-02 16:05 http_conf.txt
-r-xr-xr-x 1 root root 142183549 2019-12-02 16:05 jdk-8u20-linux-x64.rpm
drwxr-xr-x. 3 root root 35 2019-09-17 22:13 kernels
-r-xr-xr-x 1 root root 980831 2019-12-02 16:05 nginx-1.12.0.tar.gz
[root@ localhost src]#
安裝部署
安裝NGINX
根據具體情況安裝一下依賴包
# 安裝Nginx的依賴環境包
yum -y install pcre* zlib-devel gcc gcc-c++
# 解壓Nginx包至指定路徑
tar zxf nginx-1.12.0.tar.gz -C /usr/src/
# 進入Nginx的目錄
cd nginx-1.12.0/
#配置編譯安裝
./configure --prefix=/usr/local/nginx && make && make install
# 傳回上一級目錄
cd ..
# 安裝jdk環境
rpm -ivh jdk-8u20-linux-x64.rpm
# 為jdk配置環境變量,并測試
vim /etc/profile
# 在檔案最底部添加如下三行,修改完儲存退出
export JAVA_HOME=/usr/java/jdk1.8.0_20
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
#使環境變量生效
source /etc/profile
#檢視java的版本
java -version
java version "1.8.0_20"
Java(TM) SE Runtime Environment (build 1.8.0_20-b26)
Java HotSpot(TM) 64-Bit Server VM (build 25.20-b23, mixed mode)
# 解壓Tomcat源碼包
tar zxf apache-tomcat-7.0.47.tar.gz
mv apache-tomcat-7.0.47 /opt/tomcat
# 檢視Tomcat根目錄下的檔案内容
[root@ localhost src]# ll /opt/tomcat/webapps/ROOT/
total 196
-rw-r--r-- 1 root root 17811 2013-10-18 18:19 asf-logo.png
-rw-r--r-- 1 root root 5866 2013-10-18 18:19 asf-logo-wide.gif
-rw-r--r-- 1 root root 713 2013-10-18 18:19 bg-button.png
-rw-r--r-- 1 root root 1918 2013-10-18 18:19 bg-middle.png
-rw-r--r-- 1 root root 1392 2013-10-18 18:19 bg-nav-item.png
-rw-r--r-- 1 root root 1401 2013-10-18 18:19 bg-nav.png
-rw-r--r-- 1 root root 3103 2013-10-18 18:19 bg-upper.png
-rw-r--r-- 1 root root 3376 2013-10-18 18:21 build.xml
-rw-r--r-- 1 root root 21630 2013-10-18 18:19 favicon.ico
-rw-r--r-- 1 root root 12308 2013-10-18 18:21 index.jsp
-rw-r--r-- 1 root root 8826 2013-10-18 18:21 RELEASE-NOTES.txt
-rw-r--r-- 1 root root 5576 2013-10-18 18:21 tomcat.css
-rw-r--r-- 1 root root 2066 2013-10-18 18:19 tomcat.gif
-rw-r--r-- 1 root root 5103 2013-10-18 18:19 tomcat.png
-rw-r--r-- 1 root root 2376 2013-10-18 18:19 tomcat-power.gif
-rw-r--r-- 1 root root 67198 2013-10-18 18:21 tomcat.svg
drwxr-xr-x 2 root root 21 2019-12-02 16:28 WEB-INF
# 啟動Nginx服務
[root@ localhost src]# /usr/local/nginx/sbin/nginx
# 啟動Tomcat服務
[root@ localhost src]# /opt/tomcat/bin/startup.sh
Using CATALINA_BASE: /opt/tomcat
Using CATALINA_HOME: /opt/tomcat
Using CATALINA_TMPDIR: /opt/tomcat/temp
Using JRE_HOME: /usr
Using CLASSPATH: /opt/tomcat/bin/bootstrap.jar:/opt/tomcat/bin/tomcat-juli.jar
[root@ localhost src]#
再安裝一個Tomcat
cd /usr/src/
tar zxf apache-tomcat-7.0.47.tar.gz
mv apache-tomcat-7.0.47 /opt/tomcat1
cd /opt/tomcat1/webapps/ROOT/
vim index.jsp
修改成為以下内容
cd /opt/tomcat1/conf/
vim server.xml
8005
關閉tomcat通信接口, port:指定一個端口,這個端口負責監聽關閉Tomcat的請求 shutdown:向以上端口發送的關閉伺服器的指令字元串
8009
接受其他伺服器轉發過來的請求
8080
建立http連接配接 用,如浏覽器通路
vim server.xml
# 修改以下三個端口
# 修改完儲存退出,啟動Tomcat服務
[root@ localhost conf]# /opt/tomcat1/bin/startup.sh
Using CATALINA_BASE: /opt/tomcat1
Using CATALINA_HOME: /opt/tomcat1
Using CATALINA_TMPDIR: /opt/tomcat1/temp
Using JRE_HOME: /usr
Using CLASSPATH: /opt/tomcat1/bin/bootstrap.jar:/opt/tomcat1/bin/tomcat-juli.jar
# 檢視tomcat程序
[root@ localhost conf]# ps -ef |grep java
root 20653 1 0 16:49 pts/2 00:00:20 /usr/bin/java -Djava.util.logging.config.file=/opt/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/opt/tomcat/endorsed -classpath /opt/tomcat/bin/bootstrap.jar:/opt/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/opt/tomcat -Dcatalina.home=/opt/tomcat -Djava.io.tmpdir=/opt/tomcat/temp org.apache.catalina.startup.Bootstrap start
root 21053 1 2 17:30 pts/2 00:00:12 /usr/bin/java -Djava.util.logging.config.file=/opt/tomcat1/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/opt/tomcat1/endorsed -classpath /opt/tomcat1/bin/bootstrap.jar:/opt/tomcat1/bin/tomcat-juli.jar -Dcatalina.base=/opt/tomcat1 -Dcatalina.home=/opt/tomcat1 -Djava.io.tmpdir=/opt/tomcat1/temp org.apache.catalina.startup.Bootstrap start
root 21101 2700 0 17:37 pts/2 00:00:00 grep --color=auto java
[root@ localhost conf]#
開始修改nginx的配置檔案 配置使用Nginx反向代理,轉發JSP的請求給Tomcat
實作負載均衡效果
vim /usr/local/nginx/conf/nginx.conf
通路測試負載均衡效果
實作負載均衡+動靜分離的效果
# 編輯修改Nginx配置檔案
vim /usr/local/nginx/conf/nginx.conf
通路到Nginx靜态頁面
通路到Tomcat頁面
通路到第二個Tomcat頁面
測試通路到Tomcat動态頁面
拷貝一張圖檔至Nginx的首頁根目錄下
重新整理頁面即可
至此,Nginx+Tomcat負載均衡和動靜分離部署完畢。