滿店香的家

          學(xué)習(xí)+實踐=進步

          主題:Apache+Tomcat集群配置(轉(zhuǎn))

          本文Apache+Tomcat集群配置 基于最新的Apache和Tomcat,具體是2011年4月20日最新的Tomcat和Apache集群和負載均衡配置。

          準備環(huán)境

          Apache

          Apachehttp服務(wù)器,我們利用其對Tomcat進行負載均衡。目前最新版本為2.2.17,下載地址為http://httpd.apache.org/download.cgi#apache22。如下圖:

           

          目前已經(jīng)出現(xiàn)Apache2.3.11,但是為beta版本,所以沒有使用。

          下載后直接安裝msi即可,如果沒有其他的http服務(wù)器(iis)則應(yīng)該可以成功安裝,端口即為80,能夠訪問http://localhost/說明安裝成功。

          Tomcat

          Tocmat7目前已經(jīng)出現(xiàn)穩(wěn)定版本的7.0.12Tomcat6則為6.0.32。經(jīng)我測試,這2個版本的Apache負載均衡配置過程都是一樣的,因此下面的配置在Tomcat67集群是通用的。但是按照下面的配置,集群中Tomcat不能既有Tomcat6又有Tomcat7,否則雖能夠負載均衡,但不能進行session復(fù)制,不知其他方式配置的集群是否可以。

          Tomcat就不用怎么介紹了。既然在本地需要多個節(jié)點,那么需要下載ZIP版本的Tomcat

          JK

          JKTomcat提供給http服務(wù)器的插件(個人理解的),下載地址為http://mirror.bjtu.edu.cn/apache/tomcat/tomcat-connectors/jk/binaries/win32/jk-1.2.31/。如下圖:

           

            

          這里選擇的是mod_jk-1.2.31-httpd-2.2.3.so,如果http服務(wù)器是Apache2.0.X版本,則必須選擇mod_jk-1.2.31-httpd-2.0.52.so,頁面下方有英文的說明,大家可以看下。

          其實我也在網(wǎng)上看到Apache2.2已經(jīng)集成Tomcat插件模塊了,可以不用JK插件就可以實現(xiàn)Tomcat負載均衡,但也需要一些配置,而JK這個配置相比也不復(fù)雜,就先記錄下來。

          配置過程

          下面就直接寫過程了,我也是網(wǎng)絡(luò)上學(xué)習(xí)的,只是總結(jié)下過程并且利用最新的ApacheTomcat測試了下,還是與網(wǎng)絡(luò)上有些不同的。

          修改Apache配置

          1、修改httpd.conf

          我的Apache安裝在D:\Program Files\Apache Software Foundation\Apache2.2,找到conf目錄下的httpd.conf,在文件的最后一行添加

          include "D:\Program Files\Apache Software Foundation\Apache2.2\conf\mod_jk.conf"

          2、新建mod_jk.conf文件,內(nèi)容如下:

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

          JkWorkersFile conf/workers.properties

          #指定那些請求交給tomcat處理,"controller"為在workers.propertise里指定的負載分配控制器名

          JkMount /*.jsp controller

          3、將下載的JK插件mod_jk-1.2.31-httpd-2.2.3.so復(fù)制到Apache安裝目錄的modules目錄下。

          4、新建并編輯workers.properties文件,內(nèi)容如下:

          #server

          worker.list = controller

          #========tomcat1========

          worker.tomcat1.port=11009

          worker.tomcat1.host=localhost

          worker.tomcat1.type=ajp13

          worker.tomcat1.lbfactor = 1

          #========tomcat2========

          worker.tomcat2.port=12009

          worker.tomcat2.host=localhost

          worker.tomcat2.type=ajp13

          worker.tomcat2.lbfactor = 1

          #========tomcat3========

          worker.tomcat3.port=13009

          worker.tomcat3.host=192.168.0.80 //在我的虛擬機中的,可以算遠程的吧

          worker.tomcat3.type=ajp13

          worker.tomcat3.lbfactor = 1

           

          #========controller,負載均衡控制器========

          worker.controller.type=lb

          worker.controller.balanced_workers=tomcat1,tomcat2,tomcat3

          worker.controller.sticky_session=false

          worker.controller.sticky_session_force=1

          #worker.controller.sticky_session=1

          這里可以配置任意多個Tomcat,此處配置了3Tomat服務(wù)器,2個本地,1個遠程,所以為了它們都能夠順利啟動起來,本地的服務(wù)器端口都是不同的,如果Tomcat不再同一機器上,沒必要改端口的。

          配置Tomcat

          配置3Tomcat服務(wù)器,將Tomcat解壓后復(fù)制3份,我將每個文件夾分別命名為Tomcat1Tomcat2Tomcat3,修改每一份的server.xml配置,將Tomcat1中修改部分如下圖:

          Tomcat2中以上部分的server.xml為:

          Tomcat3中以上部分的server.xml為: 

          因為Tomat3在遠程服務(wù)器,所以沒必要改端口的,而我先進行的本地集群測試后將Tomcat3復(fù)制到遠程服務(wù)器,所以這3Tomcat端口都不同。

          AJP13connectorpoatjvmRoute名稱和workers.properties中配置對應(yīng)。

          由于截圖面積有限,還需要保證本地2個本地Tomcat配置serverportconnectorhttp1.1port都不相同。

          測試

          建立測試項目

          建立test項目,需要在項目的web.xml中添加<distributable/>

          建立test2.jsp,內(nèi)容如下(網(wǎng)上都用這個測試,我就省的麻煩了)

          <%@ page contentType="text/html; charset=GBK" %>

          <%@ 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 屬性設(shè)置

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

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

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

               session.setAttribute(dataName, dataValue);

           }

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

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

           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="test2.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>

          上面的測試頁面就不解釋了,很好理解。

          Session測試

          將項目部署到3個服務(wù)器,然后分別啟動Apache3Tocmat服務(wù)器,這些Tomcat啟動順序隨意,然后打開http://localhost/test/test2.jsp,結(jié)果如下圖:
           

          F5刷新頁面,分別出現(xiàn):

           

          多次刷新頁面的sessionID看是同一個ID,說明session是復(fù)制成功了。那么session中的存儲的東西呢,在輸入框中分別輸入112233后,顯示結(jié)果如下圖: 

           

           

           

           

          以上的測試說明,集群中的session已經(jīng)共享,每個集群對于同一訪問均有相同的session,而且session中存儲的變量也復(fù)制了。

           

          節(jié)點插拔測試

          插拔意思是應(yīng)該保證當運行的集群中某節(jié)點中關(guān)閉或者啟動時,集群正常工作并且節(jié)點能夠正常工作。

          下面描述測試過程了,貼圖太占地方了。

          關(guān)閉Tomcat2,刷新頁面,則不斷訪問Tocmat1Tomcat3,再關(guān)閉Tomcat1后,則只訪問一個Tomcat3,說明節(jié)點關(guān)閉時運行正常。

          如果重啟Tomcat2,無論怎么刷新,始終訪問Tomcat3,難道Apache不能將請求轉(zhuǎn)發(fā)給中途啟動的Tomcat2?。。。這時利用另外臺機器訪問頁面,發(fā)現(xiàn)Tomcat2正常,然后在刷本地頁面,又可以訪問Tomcat2了。

          從上面可以看出Apache的負載均衡時的算法了,對于每個新來的sessionApache按照節(jié)點配置中的lbfactor比重選擇訪問節(jié)點,如果某節(jié)點node1不能訪問,則尋找下一可訪問節(jié)點,并且將此node1就在該訪問session的訪問黑名單中,以后該session的訪問直接不考慮node1,即使node1又可以訪問了。而新來的session是無黑名單的,如果新的session能夠訪問到node1了,則會將node1在其他所有session訪問的黑名單刪除,這樣其他session就又能訪問node1節(jié)點了。以上只是個人經(jīng)過測試后的猜想。

          經(jīng)過以上測試,說明Tomcat集群和負載均衡已經(jīng)實現(xiàn)了。

           

          關(guān)于集群我還有些疑問,所以又測試了下,直接把結(jié)論寫出來:

          1.集群下的相同的應(yīng)用可以名稱不同(好像沒必要啊),只要配置server.xmlhost下的context具有相同的path即可。

          2. 如果應(yīng)用名稱可以不同,那么應(yīng)用下內(nèi)容是否可以不同呢(這里考慮將不同應(yīng)用通過集群看起來是一個應(yīng)用,并且共享session),然后集群下不同應(yīng)用映射為相同的訪問path,具有相同的路徑則負載,如果某路徑只某個應(yīng)用具有,則一直訪問該應(yīng)用。可現(xiàn)實很骨干啊,答案是否定的,至少我以上的配置不能實現(xiàn)。如果訪問只有某應(yīng)用具有的特別路徑,那么只有負載到該應(yīng)用才可以訪問,否則直接路徑未找到的錯誤頁面了。

           

           

           如果您看過網(wǎng)上其他Apache+Tomcat的集群配置,您可能有的疑問?

          1.網(wǎng)上大部分的文章配置2個tocmat的集群,有的將workers.properties下的worker.controller.sticky_session=1,
          然后tomcat1中的server.xml中的jvmRoute設(shè)置為tomcat2,將tomcat2中的jvmRoute設(shè)置為tocmat1,當然我這樣設(shè)置
          也成功了,但是如果3個或者更多tocmat呢,怎么設(shè)置每個tomcat的jvmRoute,我不會所以才考慮現(xiàn)在的配置

          2.server.xml中的Cluster配置問題,網(wǎng)上大部分都是使用BackupManager方式,即Cluster下又粘貼了一堆配置。其實
          只要將其中注釋掉的<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>去掉注釋就完成session的集群
          復(fù)制了。只是這倆種復(fù)制采用的方式不同而已。http://tomcat.apache.org/tomcat-6.0-doc/cluster-howto.html
          這頁面已經(jīng)說的挺清楚了,集群的session復(fù)制默認是DeltaManager,是all to all的復(fù)制,意思是將集群下1個tomcat應(yīng)用下的session
          對所有的集群中的節(jié)點進行復(fù)制,即使那個節(jié)點沒有發(fā)布應(yīng)用。顯然是不好的方式,但這在小規(guī)模的集群下并沒神馬問題。
          而采用BackupManager,就是眾多網(wǎng)上配置那樣,對于需要復(fù)制的節(jié)點設(shè)置BackupManager自然也沒問題,
          但是它的性能并沒有DeltaManager 好使“ Downside of the BackupManager: not quite as battle tested as the delta manager”。
          因此,具體怎么設(shè)置就看大家了,通常說如果不是大規(guī)模集群,就默認就好了。反正我自己翻譯的就是這個意思了,希望沒有誤導(dǎo)大家。

          posted on 2012-04-25 10:09 滿店香 閱讀(117) 評論(0)  編輯  收藏


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 古田县| 南安市| 怀仁县| 海伦市| 若尔盖县| 繁昌县| 房产| 三明市| 廉江市| 安徽省| 汕头市| 康保县| 汾西县| 乐陵市| 奉贤区| 公安县| 湖口县| 宁波市| 娄烦县| 宜川县| 米脂县| 乐昌市| 泰顺县| 太白县| 佛山市| 东丽区| 奎屯市| 柘城县| 莱西市| 西吉县| 天全县| 齐齐哈尔市| 吴堡县| 涿州市| 海口市| 沙河市| 北流市| 金湖县| 泽普县| 唐海县| 梨树县|