天天看點

建構apache+tomcat叢集

         今年一直在公司開發一個app項目,做了半年就上線了,開始的使用者通路量不大, 後來通路量越來越大,客戶反映經常出現連接配接伺服器失敗。為了改善這個,我從程式上進行優化,修改tomcat配置,把資料庫換成阿裡雲資料庫,但感覺這些都不是最好的解決辦法,其根本原因是單台tomcat伺服器無法處理高并發的請求,有性能瓶頸,後來想到負載均衡、tomcat叢集,就在網上找了一些資料,采用1個apache+多個tomcat叢集方式,慢慢研究就搭建起來了,叢集模式架構如下:

建構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叢集
建構apache+tomcat叢集
建構apache+tomcat叢集

apache-tomcat-2 server.xml修改3個地方:

建構apache+tomcat叢集
建構apache+tomcat叢集
建構apache+tomcat叢集

在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檔案加上如下這段:

建構apache+tomcat叢集
建構apache+tomcat叢集

可以在檔案中搜尋"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所在實際路徑,比如我的

建構apache+tomcat叢集
建構apache+tomcat叢集

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,就是這個

建構apache+tomcat叢集
建構apache+tomcat叢集

5) 将剛開始下載下傳好的mod_jk.so檔案拷貝到httpd-2.4.23-x64-vc14-r3\Apache24\modules目錄下,以便apache加載連接配接器。

建構apache+tomcat叢集
建構apache+tomcat叢集

至此所有的負載均衡配置就配置好了,下面進行測試, 先啟動apache伺服器,

在cmd視窗中進入apache24/bin目錄,輸入net start apache2.4指令進行啟動。

把應用放到apache-tomcat-1,apache-tomcat-2的webapps目錄下并啟動(你的應用的web.xml檔案需要加上一個标簽<distrbutable/>,加在</web-app>标簽上面一行,這說明你的應用要支援叢集模式),如果兩個tomcat都出現過如下日志,說明負載均衡配置成功:

建構apache+tomcat叢集
建構apache+tomcat叢集

apache的預設端口是80,我在浏覽器中輸入http://localhost/school回車,登入到我的項目中,點選各種功能,發現兩個tomcat已經在協同工作,并互動分擔請求,這說明已經成功了。

      這樣,你的應用就是負載均衡模式了,對于通路量大、高并發情況是很有效的, 停掉一個tomat後,另一個tomcat依然對外提供服務,對于使用者來說完全沒有影響使用,這就可以實作不停服務的情況下更新應用程式。

        好啦,趕快按照這個步驟搭建你的負載均衡、伺服器叢集應用吧,有不明白的可以留言。

上一篇: CXF詳細介紹
下一篇: XDcrack 300

繼續閱讀