Tomcat集羣+Apache的實現

                                                                    Tomcat集羣+Apache的實現css

tomcat集羣各節點經過創建tcp連接來完成Session的拷貝,拷貝有同步和異步兩種模式。在同步模式下,對客戶端的響應必須在Session拷貝到其餘節點完成後進行;異步模式無需等待Session拷貝完成就可響應。異步模式更高效,可是同步模式可靠性更高。同步異步模式由channelSendOptions參數控制,默認值是8,爲異步模式,4是同步模式。在異步模式下,能夠經過加上拷貝確認(Acknowledge)來提升可靠性,此時channelSendOptions設爲10。
 Manager用來在節點間拷貝Session,默認使用DeltaManager,DeltaManager採用的一種all-to-all的工做方式,即集羣中的節點會把Session數據向全部其餘節點拷貝,而無論其餘節點是否部署了當前應用。當集羣中的節點數量不少而且部署着不一樣應用時,可使用BackupManager,BackManager僅向部署了當前應用的節點拷貝Session。可是到目前爲止BackupManager並未通過大規模測試,可靠性不及DeltaManager。
  Channel負責對tomcat集羣的IO層進行配置。Membership用於發現集羣中的其餘節點,這裏的address用的是組播地址, 使用同一個組播地址和端口的多個節點同屬一個子集羣,所以經過自定義組播地址和端口就可將一個大的tomcat集羣分紅多個子集羣。Receiver用於各個節點接收其餘節點發送的數據,在默認配置下tomcat會從4000-4100間依次選取一個可用的端口進行接收,自定義配置時,若是多個tomcat節點在一臺物理服務器上注意要使用不一樣的端口。Sender用於向其餘節點發送數據,具體實現經過Transport配置,PooledParallelSender是從tcp鏈接池中獲取鏈接,能夠實現並行發送,即集羣中的多個節點能夠同時向其餘全部節點發送數據而互不影響。Interceptor有點相似下面將要解釋的Valve,起到一個閥門的做用,在數據到達目的節點前進行檢測或其餘操做,如TcpFailureDetector用於檢測在數據的傳輸過程當中是否發生了tcp錯誤。關於Channel的編程模型,請參見 http://tomcat.apache.org/tomcat-6.0-doc/api/org/apache/catalina/tribes/Channel.html
Valve用於在節點向客戶端響應前進行檢測或進行某些操做,ReplicationValve就是用於用於檢測當前的響應是否涉及Session數據的更新,若是是則啓動Session拷貝操做,filter用於過濾請求,如客戶端對圖片,css,js的請求就不會涉及Session,所以不需檢測,默認狀態下不進行過濾,監測全部的響應。JvmRouteBinderValve會在前端的Apache mod_jk發生錯誤時保證同一客戶端的請求發送到集羣的同一個節點,tomcat官方文檔並未解釋如何實現這一點,並且筆者認爲這一設置彷佛並沒有多大實用性。
Deployer用於集羣的farm功能,監控應用中文件的更新,以保證集羣中全部節點應用的一致性,如某個用戶上傳文件到集羣中某個節點的應用程序目錄下,Deployer會監測到這一操做並把這一文件拷貝到集羣中其餘節點相同應用的對應目錄下以保持全部應用的一致。這是一個至關強大的功能,不過很遺憾,tomcat集羣目前並不能作到這一點,開發人員正在努力實現它,這裏的配置只是預留了一個接口。
   Listener用於跟蹤集羣中節點發出和收到的數據,也有點相似Valve的功能。
 
  第一部分  tomcat 配置 (ver 6.0.18)
在大致瞭解了tomcat集羣實現模型後,就能夠對集羣做出更優化的配置了,tomcat推薦了一套配置,使用了比DeltaManager更高效的BackupManager,而且對ReplicationValve設置了請求過濾,注意在一臺服務器部署多個節點時須要修改Receiver的偵聽端口,另外,爲了更高效的在節點間拷貝數據,全部tomcat節點最好採用相同的配置,server.xml cluster部分配置具體配置以下
DeltaManager 方式配置集羣和組播 , Receiver prot 範圍配置爲 4000-4100
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
                 channelSendOptions="8">
          <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"
                        address="228.0.0.4"
                        port="45564"
                        bind="192.168.1.184"      #綁定網絡接口
                        frequency="500"
                        dropTime="3000"/>
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                      address="auto"                   #tomcat 不在同一臺機器上,要將auto改成對外網絡接口IP
                      port="4000"
                      autoBind="100"
                      selectorTimeout="5000"
                      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"/>
          </Channel>
          <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
                 filter=""/>
          <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
          <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
                    tempDir="/tmp/war-temp/"
                    deployDir="/tmp/war-deploy/"
                    watchDir="/tmp/war-listen/"
                    watchEnabled="false"/>
          <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
          <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
        </Cluster>   
BackupManager 方式配置集羣和組播 ,Receiver prot 範圍未規定
 <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"
                        address="228.0.0.4"
                        port="45564"
                        frequency="500"
                        dropTime="3000"/>
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                      address="auto"
                      port="5000"
                      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;"/-->
          <!--Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
                    tempDir="/tmp/war-temp/"
                    deployDir="/tmp/war-deploy/"
                    watchDir="/tmp/war-listen/"
                    watchEnabled="false"/-->
          <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
        </Cluster>
說明:1. jvmRoute=「xxx」 要啓用,與apache 集羣配置中用到的名稱一致。
      2. 要在web.xml的display-name後面 下加上<distributable/>標籤。
      3. 如在一臺主機上多個tomcat 節點要確認每一個Receiver prot的惟一性。
         4. linux 環境下要開啓組播,命令route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0。
5. 以上兩中配置方法都實用。
 
第二部分  apache 配置 (ver 2.2.3)
 
在Apache 2.2版本以前,通常有mod_jk2和mod_jk兩個模塊可供選擇,mod_jk2模塊是比較早的一種鏈接器,在動、靜頁面過濾上可使用正則表達式,所以使用配置靈活。可是mod_jk2模塊如今已經沒有開發人員支持了,版本更新也就此中止。繼承jk2模塊的是mod_jk模塊,mod_jk模塊支持Apache 1.x和2.X系列版本,如今通常都使用mod_jk作Apache和Tomcat的鏈接器。
在Apache 2.2版本之後,又出現了兩種鏈接器可供選擇,就是http-proxy和proxy-ajp模塊。Apache的proxy(代理)模塊能夠實現雙向代理,功能很是強大,從鏈接器的實現原理看,用http-proxy模塊實現也是很天然的事情,只需打開Tomcat的http功能,而後用Apache的proxy代理功能將動態請求交給Tomcat處理,而靜態數據交給Apache自身就能夠了。proxy-ajp模塊是專門爲Tomcat整合所開發的,經過ajp協議專門代理對Tomcat的請求。根據官方的測試,proxy-ajp的執行效率要比http-proxy高,所以在Apache 2.2之後的版本,用proxy-ajp模塊做爲Apache和Tomcat的鏈接器是個不錯的選擇。
A: Apache 採用 ajp 方式鏈接 tomcat
1.     apache 採用系統默認安裝和編譯安裝均可以,apache 2.2後版本默認安裝都支持mod_proxy  mod_proxy_ajp mod_proxy_http mod_proxy_balancer mod_proxy_connect等模塊,只要確認httpd.conf 配置中未註釋便可(默認安裝後所有模塊支持都已打開,以下:
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_connect_module modules/mod_proxy_connect.
2.在/etc/http/conf.d 下新增虛擬主機文件proxy_ajp.conf(有些版本系統自帶,內容以下)
<VirtualHost *:80>
   ServerAdmin admin@coob.cn
   DocumentRoot /home/gov/www/fg_gov/root
   DirectoryIndex index.shtml
ServerName  node2.12398.gov.cn
   ErrorLog logs/gov.error_log
   CustomLog logs/dummy-host.example.com-access_log common
#################目錄權限配置###############
<Directory "/home/gov/www/fg_gov/root">
Options Indexes FollowSymLinks Includes
AllowOverride None
      Order allow,deny
Allow from all
</Directory>
#################代理配置,靜態對象由apache處理###############
ProxyRequests Off
ProxyPass /p_w_picpaths !
ProxyPass /pic !
ProxyPass /js !
ProxyPass /css !
ProxyPass /html !
ProxyPass /index.shtml !
#################集羣配置###############
ProxyPass / balancer://fg_gov/ stickysession=JSESSIONID|jsessionid nofailover=Off
ProxyPa***everse / balancer://fg_gov/
#ProxyPass / balancer://fg_gov/ stickysession=jsessionid nofailover=On
<Proxy balancer://fg_gov>
          BalancerMember ajp://127.0.0.1:5109 loadfactor=1 route=s1
           BalancerMember ajp://127.0.0.1:6109 loadfactor=1 route=s2
</Proxy>
</VirtualHost>
說明:stickysession=jsessionid nofailover=On(點開每一個頁面都輪循)
      stickysession=JSESSIONID|jsessionid nofailover=Off(關閉瀏覽器後才輪循)
 
B:   採用 mod_jk 方式鏈接 tomcat  
 
1.    在/etc/httpd/conf.d/目錄下新增mod_jk.conf workers.properties文件,
[root@node conf]# cat mod_jk.conf
LoadModule jk_module modules/mod_jk.so
JkWorkersFile "conf.d/workers.properties"
JkLogLevel info
JKLogFile "logs/mod_jk.log"
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
JkRequestLogFormat "%w %V %T"
NameVirtualHost *:80
<VirtualHost *:80>
      ServerAdmin admin@coob.cn
      DocumentRoot /home/gov/www/fg_gov/root
      Alias /login "/home/gov/www/bg_gov/root"
      Alias /admin "/home/gov/www/admin_gov/root"
      DirectoryIndex index.shtml index.jsp
      ServerName node2.12398.gov.cn
      ErrorLog logs/gov.error_log
      CustomLog logs/dummy-host.example.com-access_log common
#################目錄權限配置###############
   <Directory "/home/gov/www/fg_gov/root">
      Options FollowSymLinks Includes
      AllowOverride None
      Order allow,deny
      Allow from all
   </Directory>
      JkMount /jkstatus status
      JkMount /* loadbalancer
      JkUnmount /*.jpg loadbalancer
      JkUnmount /*.css loadbalancer
      JkUnMount /*.gif loadbalancer  
      JkUnMount /*.png loadbalancer  
      JkUnmount /*.js loadbalancer
      JkUnmount /*.html loadbalancer
      JkUnmount /*.htm loadbalancer
      JkUnmount /*.shtml loadbalancer
      JkUnmount /*.swf loadbalancer
      JkUnmount /*.flv loadbalancer
      JkUnmount /*.xml loadbalancer
      JkUnmount /*.ico loadbalancer
</VirtualHost>
說明:JkMount和JkUnmount的寫法
JkMount把匹配的轉發到指定服務器. 
JkUnMount把匹配的不轉發到指定服務器. 
JkUnMount 選項的級別高於JkMount
單獨有JkMount規則有效,但 單獨有 JkUnMount 無效,JkUnMount與JkMount要成對出現.
[root@node conf.d]# cat workers.properties
########worker list#################
worker.list=loadbalancer,status
############server名爲s1############
worker.s1.port=5109
worker.s1.host=localhost
worker.s1.type=ajp13
worker.s1.lbfactor=50
worker.s1.socket_timeout=300
worker.s1.cache_timeout=750
worker.s1.socket_keepalive=1
worker.s1.redirect=s2
#worker.s1.fail_on_status=-500,-503,404
############server名爲s2#############
worker.s2.port=6109
worker.s2.host=localhost
worker.s2.type=ajp13
worker.s2.lbfactor=50
worker.s2.socket_timeout=300
worker.s2.cache_timeout=750
worker.s2.socket_keepalive=1
worker.s2.redirect=s1
#worker.s1.fail_on_status=500,503,-404
############oadbalancer負載均衡########
worker.loadbalancer.type=lb
worker.loadbalancer.balanced_workers=s1,s2
worker.loadbalancer.sticky_session=1
#worker.loadbalancer.sticky_session_force=1
worker.status.type=status
說明:
若是要想改變apache 和tomcat處理的靜態元素,不重啓apache就生效的話,能夠在mod_jk.conf中使用JkWorkFile 「conf.d/uriworkermap.properties」參數,這時需在/conf.d下新增uriworkermap.properties文件,就能夠把上述文件中的JkMount 和JkUnmout 單獨寫入這個文件中,寫法要用apache 官方文檔中的另一種寫法(這是可取消上文中的JkMount JkUnMout部分,文件內容以下
[root@node httpd]# cat /etc/httpd/conf.d/uriworkermap.properties
/*=loadbalancer
ps=/
/jkstatus=status
!/*.gif=loadbalancer
!/*.jpg=loadbalancer
!/*.png=loadbalancer
!/*.css=loadbalancer
!/*.js=loadbalancer
!/*.htm=loadbalancer
!/*.html=loadbalancer
!/*.shtml=loadbalancer
!/*.swf=loadbalancer   
!/*.flv=loadbalancer   
!/*.xml=loadbalancer   
!/*.ico=loadbalancer
相關文章
相關標籤/搜索