隨筆-19  評論-128  文章-1  trackbacks-0

          一、分布式實現(xiàn)原理

                

                 如上圖所示,主要通過Apache-Server作為中轉(zhuǎn)服務器,實現(xiàn)多個tomcat服務器之間的分布式處理,用戶直接請求Apache-Server,然后Apache-Server會將請求分發(fā)到具體的tomcat-server,之后tomcat-server響應客戶請求并返回結(jié)果到Apache-Server,最后Apache-Server返回結(jié)果給用戶

           

          二、負載均衡

          文件說明:

          mod_jk.conf

          主要定義mod_jk模塊的位置以及mod_jk模塊的連接日志設置,還有定義worker.properties文件的位置。

          worker.properties
          定義worker的參數(shù),主要是連接tomcat主機的地址和端口信息。如果Tomcatapache不在同一臺機器上,或者需要做多臺機器上tomcat的負載均衡只需要更改workers.properties文件中的相應定義即可。

           

          APACHE_HOME%為你的安裝目錄 

           

          環(huán)境說明:

                 主要使用了一個Apache Server和兩個Tomcat5.5,在同一臺電腦上進行測試。

           

          1. 準備軟件

          Jdk1.6

          下載地址:http://java.sun.com

          tomcat -6.0.29

          下載地址:http://jakarta.apache.org

          apache_2.2.4-win32-x86-no_ssl.msi

          下載地址:http://httpd.apache.org/download.cgi

          mod_jk-1.2.31-httpd-2.0.52.so (主要作用是建立Apache ServerTomcat之間的連接)

          下載地址:http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/

           

                 說明:apache-server安裝完成后,可以在瀏覽器中輸入http://localhost/來測試,如果出現(xiàn)” It works!”則表示安裝成功。


          2.
          安裝mod_jk連接模塊

          安裝好Jdktomcatapache,加入mod_jk連接模塊,就是把mod_jk-1.2.31-httpd-2.2.3.so文件拷貝到%APACHE_HOME\modules下,把jk模塊的配置放到單獨的文件中來,在%APACHE_HOME\conf目錄新建mod_jk.confworkers.properties文件。

           

          httpd.conf最后加上

                 # JK module settings

          Include conf/mod_jk.conf  

          說明:以上表示將mod_jk.conf配置文件包含進來

           


          3.
          修改mod_jk.conf文件

          為了保持httpd.conf文件的簡潔,把jk模塊的配置放到單獨的文件中來。

                

          mod_jk.conf文件中添加以下內(nèi)容:

          # Load mod_jk2 module

          LoadModule jk_module modules/mod_jk-1.2.31-httpd-2.2.3.so

           

          # Where to find workers.properties(引用workers配置文件)

          JkWorkersFile conf/workers.properties

           

          # Where to put jk logs(log文件路徑)

          JkLogFile logs/mod_jk2.log

           

          # Set the jk log level [debug/error/info](log級別)

          JkLogLevel info

                

          # Select the log format(log格式)

          JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "

          # JkOptions indicate to send SSL KEY SIZE,

          JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories

           

          # JkRequestLogFormat set the request format

          JkRequestLogFormat "%w %V %T"

           

          # Send JSPs for context / to worker named loadBalancer(URL轉(zhuǎn)發(fā)配置,匹配的URL才轉(zhuǎn)發(fā)到tomcat進行處理)

          JkMount /*.jsp controller

          # JkMount /*.* loadBalancer

                

          4. 修改workers.properties文件

          workers.properties文件中添加以下內(nèi)容:

          #server 列表

          worker.list = controller,tomcat1,tomcat2

           

          # tomcat1(ajp13 端口號,在tomcatserver.xml配置,默認8009)

          worker.tomcat1.port=8009

          #tomcat的主機地址,如不為本機,請?zhí)顚?span lang="EN-US">ip地址

          worker.tomcat1.host=localhost

          worker.tomcat1.type=ajp13

          #server的加權(quán)比重,值越高,分得的請求越多

          worker.tomcat1.lbfactor = 1

           

          # tomcat2

          worker.tomcat2.port=9009

          worker.tomcat2.host=localhost

          worker.tomcat2.type=ajp13

          worker.tomcat2.lbfactor = 1

           

          # controller(負載均衡控制器)

          worker.controller.type=lb

          # 指定分擔請求的tomcat

          worker.controller.balanced_workers=tomcat1,tomcat2

          #worker.controller.sticky_session=true

          說明:此文件配置了2tomcat服務器進行負載均衡處理,sticky_session表述是否將對SESSION ID的請求路由回到相同的Tomcat worker。如果屬性值不為0,它將被設置為JK_TRUE,session將是粘性的,即SESSION ID的請求路由回到相同的Tomcat worker;當Tomcat正使用能夠跨越多個Tomcat實例持久化session數(shù)據(jù)的Session Manager時,它將被設置為JK_FALSE

             

          5. 修改tomcat配置文件server.xml

                 更改其中一個的設置打開tomcat2/conf/server.xml文件,修改里面所有的端口設置,將8改為9,如下:      
           



          6.
          編寫一個測試頁面teat1.jsp

                 建立一個testweb應用,里面新建一個test1.jsp,內(nèi)容為

          <%@ page language="java" contentType="text/html; charset=UTF-8"

              pageEncoding
          ="UTF-8"
          %>

          <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

          <html>

          <head>

          <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

          <title>test1</title>

          </head>

          <body>

          <% 

             System.out.println(
          "===========================");

          %>

          </body>

          </html>

           


          7.
          啟動服務器并進行測試

                 依次啟動apache-servertomcat1tomcat2,通過 http://localhost/test/test1.jsp 訪問,查看tomcat1的窗口,可以看到打印了一行"==========",再刷新一次,tomcat2也打印了一條,再刷新,可以看到請求會被tomcat1,tomcat2輪流處理,實現(xiàn)了負載均衡

           


          三、集群
          (session復制)

          只配置負載均衡還不行,還要session復制,也就是說其中任何一個tomcat的添加的session,是要同步復制到其它tomcat 集群內(nèi)的tomcat都有相同的session

           

          1. tomcat配置

          1.1 修改tomcat1, tomcat2server.xml文件添加集群內(nèi)容,tomcat5.5無需添加,只需要去掉注釋符,tomcat6.0需要添加,內(nèi)容如下:


          Tomcat5.5配置

          <Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"

                           managerClassName
          ="org.apache.catalina.cluster.session.DeltaManager"

                           expireSessionsOnShutdown
          ="false"

                           useDirtyFlag
          ="true"

                           notifyListenersOnReplication
          ="true">

           

                      
          <Membership 

                          
          className="org.apache.catalina.cluster.mcast.McastService"

                          mcastAddr
          ="228.0.0.4"

                          mcastPort
          ="45564"

                          mcastFrequency
          ="500"

                          mcastDropTime
          ="3000"/>

           

                      
          <Receiver 

                          
          className="org.apache.catalina.cluster.tcp.ReplicationListener"

                          tcpListenAddress
          ="auto"

                          tcpListenPort
          ="4001"

                          tcpSelectorTimeout
          ="100"

                          tcpThreadCount
          ="6"/>

           

                      
          <Sender

                          
          className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"

                          replicationMode
          ="pooled"

                          ackTimeout
          ="15000"

                          waitForAck
          ="true"/>

           

                      
          <Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"

                             filter
          =".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>

                             

                      
          <Deployer className="org.apache.catalina.cluster.deploy.FarmWarDeployer"

                                tempDir
          ="/tmp/war-temp/"

                                deployDir
          ="/tmp/war-deploy/"

                                watchDir
          ="/tmp/war-listen/"

                                watchEnabled
          ="false"/>

                                

                            
          <ClusterListener className="org.apache.catalina.cluster.session.ClusterSessionListener"/>

                  
          </Cluster>


          Tomcat6.0配置
            

          <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>

          分別添加以上內(nèi)容后,在tomcat2中,修改tcpListenPort="4001" 4002

           

          1.2. Engine增加jvmRoute屬性設置,jvmRoute的值來自于workers.properties文件所設置的服務器名稱。

          <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">

           

          #server 列表

          worker.list = controller,tomcat1,tomcat2

          2. 添加test.jsp頁面

          2.1. test.jsp添加以下內(nèi)容:

          <%@ page contentType="text/html; charset=UTF-8"%>

          <%@ page import="java.util.*"%>

          <html>

          <head>

          <title>Cluster App Test</title>

          </head>

          <body>

          Server Info:

          <%

            out.println(request.getLocalAddr() 
          + " : " + request.getLocalPort() + "<br>");

          %>

          <%

            out.println(
          "<br> ID " + session.getId() + "<br>");

            
          // 如果有新的 Session 屬性設置

            
          String dataName = request.getParameter("dataName");

            
          if (dataName != null && dataName.length() > 0) {

               
          String dataValue = request.getParameter("dataValue");

               session.setAttribute(dataName, dataValue);

            }

            out.print(
          "<b>Session 列表</b>");

            Enumeration e 
          = session.getAttributeNames();

            
          while (e.hasMoreElements()) {

               
          String name = (String) e.nextElement();

               
          String value = session.getAttribute(name).toString();

               out.println(name 
          + " = " + value + "<br>");

               System.out.println(name 
          + " = " + value);

            }

          %>

          <form action="test.jsp" method="POST">

          名稱:
          <input type=text size=20 name="dataName"> <br>

          值:
          <input type=text size=20 name="dataValue"> <br>

          <input type=submit></form>

          </body>

          </html>

           

          2.2. 修改web.xml文件,加入<distributable/>節(jié)點,如下所示:

          <?xml version="1.0" encoding="UTF-8"?>

          <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">

            
          <display-name>test</display-name>

            
          <distributable/>

            
          <welcome-file-list>

              
          <welcome-file>index.html</welcome-file>

              
          <welcome-file>index.htm</welcome-file>

              
          <welcome-file>index.jsp</welcome-file>

              
          <welcome-file>default.html</welcome-file>

              
          <welcome-file>default.htm</welcome-file>

              
          <welcome-file>default.jsp</welcome-file>

            
          </welcome-file-list>

          </web-app>

           

          3. Session復制測試

          測試步驟如下:

          1)        啟動apache-servertomcat1tomcat2

          2)        訪問http://localhost/test/test.jsp,輸入名稱:test0001、值:123并點擊“提交查詢內(nèi)容”按鈕,顯示效果如下:

          如上圖所示,tomcat1創(chuàng)建了一個新的sessionsession中有屬性test0001,值為123
           

          3)        關(guān)閉tomcat1服務器,tomcat1端口為8080,如下圖:

          4)        在頁面中再次點擊“提交查詢內(nèi)容”按鈕,效果如下:

              前端頁面并沒有發(fā)生改變,接下來查看后臺情況:
              

              
          如圖所示,可以發(fā)現(xiàn)session已成功復制到tomcat2中,以此證明tomcat集群已配置成功。

           

           

          5)        另外來看看不關(guān)閉tomcat1服務器再次提交的情況

                
          如圖所示,請求并沒有轉(zhuǎn)發(fā)到tomcat2服務器,而是再次轉(zhuǎn)回tomcat1服務器,這種情況是由于配置了jvmRoute所致,以個人理解,配置了此屬性后,apache-server會根據(jù)session情況來進行路由,同一個session會轉(zhuǎn)發(fā)給同一個服務器。

           

           

          6)        打開一個新的IE窗口,并訪問http://localhost/test/test.jsp

                       
                         
                       
          新窗口的請求轉(zhuǎn)發(fā)到了tomcat2服務器,sessionidDD9E6C8181653B9BCCF534FC8760B264.tomcat2,根據(jù)測試結(jié)果可以說明,在不發(fā)生服務器關(guān)閉的情況下,每個session會綁定到同一個服務器中,而不會在服務器間發(fā)生復制。

          配置文件下載:/Files/obpm/配置文件.rar


          原創(chuàng)作者:Nicholas

          posted on 2011-06-22 16:09 obpm 閱讀(8213) 評論(4)  編輯  收藏 所屬分類: 分布式&云計算

          評論:
          # re: Apache Http Server與Tomcat實現(xiàn)負載均衡和集群[未登錄] 2011-06-22 16:37 | test
          apache能檢測tomcat失效嗎?  回復  更多評論
            
          # re: Apache Http Server與Tomcat實現(xiàn)負載均衡和集群 2011-06-22 20:27 | 某A爛...
          好文,學習一下。  回復  更多評論
            
          # re: Apache Http Server與Tomcat實現(xiàn)負載均衡和集群 2011-06-24 21:24 | xavierzhao
          失望了,不是mod_proxy_ajp  回復  更多評論
            
          # re: Apache Http Server與Tomcat實現(xiàn)負載均衡和集群 2011-06-27 13:47 | 凌晨風
          不錯,好文章先收藏了  回復  更多評論
            

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 城口县| 禄丰县| 呼和浩特市| 梨树县| 和政县| 汪清县| 明溪县| 古交市| 江西省| 德安县| 林西县| 巩留县| 察雅县| 桐乡市| 博客| 台江县| 上高县| 黔西| 岳阳县| 大石桥市| 曲松县| 乌拉特前旗| 邹城市| 安多县| 阿鲁科尔沁旗| 孟连| 偃师市| 古蔺县| 广河县| 二手房| 元江| 海原县| 平谷区| 鄂伦春自治旗| 常德市| 铜陵市| 于都县| 延庆县| 威远县| 泌阳县| 邯郸县|