<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

    一、分布式實現原理

          

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

     

    二、負載均衡

    文件說明:

    mod_jk.conf

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

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

     

    APACHE_HOME%為你的安裝目錄 

     

    環境說明:

           主要使用了一個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/來測試,如果出現” It works!”則表示安裝成功。


    2.
    安裝mod_jk連接模塊

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

     

    httpd.conf最后加上

           # JK module settings

    Include conf/mod_jk.conf  

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

     


    3.
    修改mod_jk.conf文件

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

          

    mod_jk.conf文件中添加以下內容:

    # 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轉發配置,匹配的URL才轉發到tomcat進行處理)

    JkMount /*.jsp controller

    # JkMount /*.* loadBalancer

          

    4. 修改workers.properties文件

    workers.properties文件中添加以下內容:

    #server 列表

    worker.list = controller,tomcat1,tomcat2

     

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

    worker.tomcat1.port=8009

    #tomcat的主機地址,如不為本機,請填寫ip地址

    worker.tomcat1.host=localhost

    worker.tomcat1.type=ajp13

    #server的加權比重,值越高,分得的請求越多

    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數據的Session Manager時,它將被設置為JK_FALSE

       

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

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



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

           建立一個testweb應用,里面新建一個test1.jsp,內容為

    <%@ 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-server、tomcat1、tomcat2,通過 http://localhost/test/test1.jsp 訪問,查看tomcat1的窗口,可以看到打印了一行"==========",再刷新一次,tomcat2也打印了一條,再刷新,可以看到請求會被tomcat1,tomcat2輪流處理,實現了負載均衡

     


    三、集群
    (session復制)

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

     

    1. tomcat配置

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


    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>

    分別添加以上內容后,在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添加以下內容:

    <%@ 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/>節點,如下所示:

    <?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-server、tomcat1、tomcat2

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

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

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

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

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

        
    如圖所示,可以發現session已成功復制到tomcat2中,以此證明tomcat集群已配置成功。

     

     

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

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

     

     

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

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

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


    原創作者:Nicholas

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

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

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


    網站導航:
     
    主站蜘蛛池模板: 国产免费av一区二区三区| 精品无码国产污污污免费网站| 日本三级2019在线观看免费| 久久久综合亚洲色一区二区三区 | 亚洲国产精品成人久久久| 99re在线免费视频| 亚洲天堂中文资源| 最近免费中文字幕大全免费| 久久精品亚洲精品国产色婷| 日韩插啊免费视频在线观看| 亚洲网站在线观看| **一级一级毛片免费观看| 337p日本欧洲亚洲大胆艺术| 中文字幕人成无码免费视频| 亚洲区视频在线观看| 24小时免费直播在线观看| 精品亚洲视频在线| 亚洲欧洲无码AV电影在线观看| 久久久久国产免费| 77777午夜亚洲| 4338×亚洲全国最大色成网站| 黄网站色视频免费在线观看的a站最新 | 免费精品国产自产拍在线观看| 国产亚洲精久久久久久无码AV| 97在线视频免费播放| 亚洲AV无码一区二区三区牲色| 国产精品亚洲不卡一区二区三区| 很黄很污的网站免费| 亚洲熟妇无码八V在线播放| 久久久久久亚洲精品不卡| 亚洲毛片免费观看| h视频在线观看免费| 亚洲国产日韩女人aaaaaa毛片在线 | 亚洲AV无码一区二区三区在线观看 | 真实乱视频国产免费观看| 污污污视频在线免费观看| 亚洲国产综合91精品麻豆| 亚洲免费日韩无码系列| 亚洲国产欧洲综合997久久| 久久久久亚洲精品成人网小说| 亚洲精品动漫免费二区|