apache+Tomcat 集羣搭建

     最近在做項目時遇到一個很頭大的問題:在業務高峯期併發量大的時候很容易卡,JVM查看的時候發現單個tomcat內存釋放不及時導致一直卡頓。手動處理了好幾次雖然緩解危機了但是總是治標不治本。越來越大的併發量總有一天會拖死程序最後宕機,而且在更新的時候必須得等到晚上沒有業務的時候才能停機更新   越來越渴望集羣來真正解決這個問題。

    由於服務是JAVA WEB程序,運用當下最流行的集羣服務:tomcat+Apache 來搭建服務器集羣。希望今天的心得能幫助各位

   流程如下:用戶發送請求到Web服務器(也就是apache) apache 根據定義規則進行http轉發到不同的tomcat服務器 。同時要保證各個tomcat服務器之間的消息共享(非常重要!如在tomcat改變某一個內存值的同時要更新到每一臺服務器上)實現實時消息同步 。

   具體步驟如下:

 1.下載JDK 並且配置好

 2.下載Apache應用 網址:http://archive.apache.org/dist/httpd/binaries/win32/apache_2.0.55-win32-x86-no_ssl.msi

3 .下載mod_jk(用於連接apache和tomcat) 網址:http://archive.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/win32/jk-1.2.15/mod_jk-apache-2.0.55.so

4.下載 tomcat 7


準備完以後我們開始搭建負載均衡了

 1.把Apache,兩個Tomcat解壓到D:\Apache Group文件夾下

 

2.在apache的httpd.cfg下配置加上include conf/mod_jk.conf

#<VirtualHost *:80>
#    ServerAdmin [email protected]
#    DocumentRoot /www/docs/dummy-host.example.com
#    ServerName dummy-host.example.com
#    ErrorLog logs/dummy-host.example.com-error_log
#    CustomLog logs/dummy-host.example.com-access_log common
#</VirtualHost>
include conf/mod_jk.conf
3.把下載的mod_jk 複製到D:\Apache Group\Apache2\modules 路徑下
4、在cof文件夾下新建mod_jk.conf,
#加載mod_jk Module   
LoadModule jk_module modules/mod_jk-apache-2.0.55.so   
  
#指定 workers.properties文件路徑   
JkWorkersFile conf/myworkers.properties   
  
#指定那些請求交給tomcat處理,(controller表示所有)
JkMount /* controller

5.在同路徑下新建myworkers.properties

worker.list = controller,tomcat1,tomcat2  #server 列表    
#========tomcat1========    
worker.tomcat1.port=9092       #ajp13 端口號,在tomcat下server.xml配置,默認8009    
worker.tomcat1.host=localhost  #tomcat的主機地址,如不爲本機,請填寫ip地址    
worker.tomcat1.type=ajp13    
worker.tomcat1.lbfactor = 1    #server的加權比重,值越高,分得的請求越多    
   
#========tomcat2========    
worker.tomcat2.port=9093       #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

解釋一下:

workers.properties中已經配置了端口和各個tomcat,從端口找到服務。

sticky_session   sticky_session_force          含義 
     true           false         SESSION會複製,有粘性 
     true           true          SESSION會複製,有粘性 
     false          false         SESSION不會複製,無粘性 
     false          true          SESSION不會複製,無粘性

worker.controller.sticky_session,設置爲1或true使用粘着session,設置爲0或false不使用粘着session。如果sticky_session設爲true時,建議sticky_session_force設爲false,此參數表明如果集羣中某臺服務器在多次請求沒有響應後,將轉發當前的請求到其它服務器上處理;sticky_session=false時,影響比較大,會導致轉發到其它服務器上的請求,找不到原來的session,所以如果此時請求中有讀取session中某些信息的話,就會導致應用的null異常。sticky_session、sticky_session_force的默認值分別爲true,false。

worker.controller.sticky_session_force=true,始終轉發到session創建的服務器上。

6.修改兩個tomcat的ajp13端口號(和上面myworker.properties)必須一一對應 並且修改兩個tomcat中的開啓端口號和服務端口號,以免重複


以上基本完成tomcat集羣的基本配置 現在要做最重要的session共享; 。

7,打開兩個tomcat的集羣控制

<!--For clustering, please take a look at documentation at:
          /docs/cluster-howto.html  (simple how to)
          /docs/config/cluster.html (reference documentation) -->
      <!---->
      <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

8在自己應用服務的web.xml中 <web-app> 模塊下加入<distributable />

<web-app>
	
	<!-- for cluster -->
	<!--  -->
		<distributable />

OK 大功告成 一起去試試吧





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章