今年一直在公司開發一個app項目,做了半年就上線了,開始的使用者通路量不大, 後來通路量越來越大,客戶反映經常出現連接配接伺服器失敗。為了改善這個,我從程式上進行優化,修改tomcat配置,把資料庫換成阿裡雲資料庫,但感覺這些都不是最好的解決辦法,其根本原因是單台tomcat伺服器無法處理高并發的請求,有性能瓶頸,後來想到負載均衡、tomcat叢集,就在網上找了一些資料,采用1個apache+多個tomcat叢集方式,慢慢研究就搭建起來了,叢集模式架構如下:
首先想到要解決兩個問題:
1、如何實作多台應用伺服器之間的session共享(比如A使用者登入,處理這個請求的是tomcat1,session在tomcat1上,如果不做session共享,A使用者再次做操作,例如查詢清單資料,這個請求可能由tomcat2來處理,發現找不到session,會提示登入,是以必須解決此問題)
2、如何使用多台應用伺服器實作壓力分解。
其實叢集可以多台實體伺服器,每台實體機上部署一個tomcat,這種方式是橫向叢集。還有一種是在一台實體機上部署多台應用伺服器tomcat,這種方式是縱向叢集,本文講解的是縱向叢集。
1、先準備好要使用的軟體:apache2.4 ,tomcat8,mod_jk(apache和tomcat的連接配接器,我采用的是1.2版本,需要與apache版本對應)
apache2.4官網下載下傳:http://httpd.apache.org/download.cgi
tomcat8官網下載下傳:http://tomcat.apache.org/download-80.cgi
mod_jk下載下傳位址:http://archive.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/windows/ 我下載下傳的是
下載下傳好之後放到一個檔案夾,如下
2、将你下載下傳的tomcat複制一份,我們做兩個tomcat叢集,修改tomcat的配置檔案server.xml。在一台機器上部署多個tomcat需要修改端口,保持兩個tomcat端口不一緻才行。
以我的為例,
apache-tomcat-1 server.xml修改3個地方:
apache-tomcat-2 server.xml修改3個地方:
在tomcat/bin/startup.bat檔案開頭第一行加上
SET JAVA_HOME=C:\Program Files\Java\jdk1.8.0_91
SET CATALINA_HOME=E:\software\fzjh\apache-tomcat-2
這兩行代碼,以保證tomcat能正常啟動,不配置這個tomcat啟動會一閃而過。
兩個tomcat的server.xml檔案加上如下這段:
可以在檔案中搜尋"cluster"然後将它覆寫,為了友善複制,我講代碼貼出來:
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="6">
<Manager className="org.apache.catalina.ha.session.BackupManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"
mapSendOptions="6"/>
<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Membership className="org.apache.catalina.tribes.membership.McastService"
bind="127.0.0.1"
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="127.0.0.1"
port="4001"
selectorTimeout="100"
maxThreads="6"/>
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
至此,tomcat的配置就完成了,可以啟動一下兩個tomcat,看能不能正常啟動。
3、開始配置apache伺服器了,打開檔案:httpd-2.4.23-x64-vc14-r3\Apache24\conf\httpd.conf
1)修改根路徑SRVROOT,在檔案中搜尋這個單詞"SRVROOT",修改成你的apache所在實際路徑,比如我的
2)在檔案最後加上一句話: include conf/mod_jk.conf
3) http.conf 同目錄下建立mod_jk.conf檔案,内容如下:
#加載mod_jk Module
LoadModule jk_module modules/mod_jk.so
#指定 workers.properties檔案路徑
JkWorkersFile conf/workers.properties
#指定那些請求交給tomcat處理,"controller"為在workers.propertise裡指定的負載配置設定控制器
#JkMount /*.jsp controller
JkMount /* controller
4) 在http.conf同目錄下建立workers.properties,内容如下:
worker.list = controller,tomcat1,tomcat2 #server 清單
#========tomcat1========
worker.tomcat1.port=8010 #ajp13 端口号,在tomcat下server.xml配置,預設8009
worker.tomcat1.host=localhost #tomcat的主機位址,如不為本機,請填寫ip位址
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor = 1 #server的權重比重,值越高,分得的請求越多
#========tomcat2========
worker.tomcat2.port=8011 #ajp13 端口号,在tomcat下server.xml配置,預設8009
worker.tomcat2.host=localhost #tomcat的主機位址,如不為本機,請填寫ip位址
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor = 1 #server的權重比重,值越高,分得的請求越多
#========controller,負載均衡控制器========
worker.controller.type=lb
worker.controller.balanced_workers=tomcat1,tomcat2 #指定分擔請求的tomcat
worker.controller.sticky_session=1
要注意的是,worker.tomcat1.port 這個端口一定要寫正确,這就是apache連接配接的多個tomcat,就是這個
5) 将剛開始下載下傳好的mod_jk.so檔案拷貝到httpd-2.4.23-x64-vc14-r3\Apache24\modules目錄下,以便apache加載連接配接器。
至此所有的負載均衡配置就配置好了,下面進行測試, 先啟動apache伺服器,
在cmd視窗中進入apache24/bin目錄,輸入net start apache2.4指令進行啟動。
把應用放到apache-tomcat-1,apache-tomcat-2的webapps目錄下并啟動(你的應用的web.xml檔案需要加上一個标簽<distrbutable/>,加在</web-app>标簽上面一行,這說明你的應用要支援叢集模式),如果兩個tomcat都出現過如下日志,說明負載均衡配置成功:
apache的預設端口是80,我在浏覽器中輸入http://localhost/school回車,登入到我的項目中,點選各種功能,發現兩個tomcat已經在協同工作,并互動分擔請求,這說明已經成功了。
這樣,你的應用就是負載均衡模式了,對于通路量大、高并發情況是很有效的, 停掉一個tomat後,另一個tomcat依然對外提供服務,對于使用者來說完全沒有影響使用,這就可以實作不停服務的情況下更新應用程式。
好啦,趕快按照這個步驟搭建你的負載均衡、伺服器叢集應用吧,有不明白的可以留言。