軟件藝術思考者  
          混沌,彷徨,立志,蓄勢...
          公告
          日歷
          <2015年7月>
          2829301234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          導航

          隨筆分類(86)

          隨筆檔案(85)

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

           
          apache2+tomcat5.5集群+session同步
          作者:劉宇 liuyu.blog.51cto.com
          msn:mgroup49073@hotmail.com linuxtone
          說明:借前人之鑒,寫一篇關于tomcat集群及session同步的問題,首先介紹tomcat集成及做集群的原因和必要性,session同步的作用。然后包括各軟件的安裝配置。
          原理:tomcat 做個WEB服務器有它的局限性,處理能力低,效率低。承受并發小(1000左右)。但目前有不少網站或者頁面是JSP的。并采用了tomcat做為WEB,因此只能在此基礎上調優。
          目前采取的辦法是Apache + Mod_JK + tomcat 來解決一部分請求,用戶訪問的是apache,但有jsp頁面的時候才會去請求tomcat。如果量一大,那么tomcat無法承受,那么只能做tomat集群,Apache + Mod_JK 就是負載均衡器了。
          Mod_JK2負載均衡 可以把不同的jsp請求轉發到不同的tomcat服務器,還可以偵測服務器存活。如果有條件可以給Mod_JK2做一個HA因為做完集群后壓力就在JK上了。
          簡單拓仆圖:
          鎷撲粏鍥?
          一、測試環境及軟件安裝:-----如果已經安裝過的可以省略這步
          linux 2.6 內核 centos 5.2
          本例二臺tomcat 不在同一機器。
          先安裝了所需的程序庫
          yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel
          下載源碼包:(本文不安裝PHP
          apache2 tomcat5都可以在 apache.org 下載
          tomcat5需要JDK1.5的版本。
          JK本文用的源碼包tomcat-connectors
          Apache 安裝:
          # tar zxvf httpd-2.2.8.tar.gz
          #cd httpd-2.2.8
          # ./configure --prefix=/usr/local/apache2 --enable-modules=so --enable-so
          # make && make install
          /usr/local/apache2/bin/apachectrl start
          看到apache就配置成功了。
          JDK的安裝
          #chmod 755 jdk-1_5_0_16-linux-i586.bin
          #./jdk-1_5_0_16-linux-i586.bin
          # mv jdk-1_5_0_16 /usr/local/
          到此JDK已經安裝完成
          /usr/bin目錄下,把原用的java,javac文件刪除:
          #rm -rf java
          #rm –rf javac
          /usr/bin 下建立 軟連接 java
          # ln -s /usr/local/jdk-1_5_0_16/bin/java /usr/bin/java
          # ln -s /usr/local/jdk-1_5_0_16/bin/javac /usr/bin/javac
          # java –version
          # javac -version
          java version "1.4.2_08"
          Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_08-b03)
          Java HotSpot(TM) Client VM (build 1.4.2_08-b03, mixed mode)
          為了方便下在的工作建立兩個軟鏈接:
          ln -s /usr/local/jdk-1_5_0_16 /usr/local/jdk
          ln -s /usr/local/jdk-1_5_0_16/jre /usr/local/jre
          Tomcat的安裝
          #tar -zxvf apache-tomcat-5.5.27.tar.gz
          # mv apache-tomcat-5.5.27 /usr/local/tomcat
          設置環境變量:
          #Set Environment by NetSeek
          JAVA_HOME=/usr/local/jdk
          export JAVA_HOME
          JRE_HOME=/usr/local/jre
          export JRE_HOME
          CLASSPATH=/usr=/usr/local/tomcat/common/lib/:/usr/local/jdk/lib:/usr/local/jre/lib
          export CLASSPATH
          PATH=$PATH:/usr/local/tomcat/bin/:/usr/local/apache/bin:/usr/local/jdk/bin:/usr/local/jre/bin
          export PATH
          TOMCAT_HOME=/usr/local/tomcat
          export TOMCAT_HOME
          啟動tomcat以檢查是否存在錯誤:
          #cd /usr/local/tomcat/bin
          #./startup.sh
          [url]http://IP[/url]地址:8080 可以看到貓頭:)成功了。
          在另一臺機器上也安裝tomcat 并配置好。
          JK 安裝 (整合apache tomcat
          # tar zxvf tomcat-connectors-1.2.27-src.tar.gz
          #cd tomcat-connectors-1.2.27-src/native
          # ./configure --with-apxs=/usr/local/apache2/bin/apxs --with-java-home=/usr/local/jdk
          # make && make install
          /usr/local/apache2/modules/ 下會產生mod_jk.so
          修改apache配置文件:
          LoadModule jk_module modules/mod_jk.so
          JkWorkersFile /usr/local/tomcat/conf/jk/workers.properties JK配置文件 負載的配置
          JkShmFile logs/mod_jk.shm
          JkLogFile /usr/local/tomcat/logs/mod_jk.log 相關日志的設置
          JkLogLevel info
          JkMount /*.jsp controller jsp的請求轉發給 controller(負載均衡控制器)
          修改DoucmentRoot tomcat的目錄一致。
          本文修改為:/usr/local/tomcat/webapps/
          二、調度器JK的配置
          建立JK配置文件:
          #vi /usr/local/tomcat/conf/jk/workers.properties
          workers.tomcat_home=/usr/local/tomcat #指定tomcat的目錄――如果2tomcat在同一臺機器該選項去掉
          workers.java_home=/usr/local/jdk #指定jdk的目錄
          ps=/
          worker.list=controller #指定負載名,這個可以隨便起,與下面的 worker.controller.type=lb要對應
          #========tomcat1======== 第一臺tomcat的配置
          worker.tomcat1.port=8009
          worker.tomcat1.host=localhost #這里也可以寫IP
          worker.tomcat1.type=ajp13
          worker.tomcat1.lbfactor=1 #權量 數值越大,分配的機率就最小
          #========tomcat2===========
          worker.tomcat2.port=8009
          worker.tomcat2.host=192.168.19.81 (tomcat2IP)
          worker.tomcat2.type=ajp13
          worker.tomcat2.lbfactor=1
          #========controller,負載均衡器=======
          worker.controller.type=lb
          worker.controller.balance_workers=tomcat1,tomcat2 # server.xml配置文件里的jvmRoute="tomcat1"指定的名字
          worker.controller.sticky_session=1
          三、tomcat集群配置,session 同步配置:
          1、tomca1 tomcat 2 在同一臺機器
          Tomcat 1 (IP: 192.168.19.199)
          A、修改Engine節點信息: <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
          B、去掉<Cluster> <\Cluster> 的注釋符
          C、修改Cluster 節點信息
          <Membership
          className="org.apache.catalina.cluster.mcast.McastService"

          mcastBindAddress="192.168.19.199"
          mcastAddr="224.0.0.1"
          mcastPort="45564"
          mcastFrequency="500"
          mcastDropTime="3000"/>
          <Receiver
          className="org.apache.catalina.cluster.tcp.ReplicationListener"

          tcpListenAddress="192.168.19.199"
          tcpListenPort="4001"
          tcpSelectorTimeout="100"
          tcpThreadCount="6"/>

          Tomcat 2 (IP: 192.168.19.81)
          A、修改Engine節點信息: <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">
          B、去掉<Cluster> <\Cluster> 的注釋符
          C、修改Cluster 節點信息
          <Membership
          className="org.apache.catalina.cluster.mcast.McastService"
          mcastBindAddress="192.168.19.199"
          mcastAddr="224.0.0.1"
          mcastPort="45564"
          mcastFrequency="500"
          mcastDropTime="3000"/>
          <Receiver
          className="org.apache.catalina.cluster.tcp.ReplicationListener"
          tcpListenAddress="192.168.19.199"
          tcpListenPort="4002" 一定要改
          tcpSelectorTimeout="100"
          tcpThreadCount="6"/>
          D、將8080 8009 8082三個節點的端口改為
          9080 9009 9082 避免 與tomcat1端口沖突
          注:這里的IP也可以不改


          2、tomca1 tomcat 2 在不同機器上
          Tomcat 1 (IP: 192.168.19.199)
          A、修改Engine節點信息: <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
          B、去掉<Cluster> <\Cluster> 的注釋符
          C、修改Cluster 節點信息
          <Membership
          className="org.apache.catalina.cluster.mcast.McastService"
          mcastBindAddress="192.168.19.199"
          mcastAddr="224.0.0.1"
          mcastPort="45564"
          mcastFrequency="500"
          mcastDropTime="3000"/>
          <Receiver
          className="org.apache.catalina.cluster.tcp.ReplicationListener"
          tcpListenAddress="192.168.19.199"
          tcpListenPort="4001"
          tcpSelectorTimeout="100"
          tcpThreadCount="6"/>

          Tomcat 2 (IP: 192.168.19.81)
          A、修改Engine節點信息: <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
          B、去掉<Cluster> <\Cluster> 的注釋符
          C、修改Cluster 節點信息
          <Membership
          className="org.apache.catalina.cluster.mcast.McastService"
          mcastBindAddress="192.168.19.81"
          mcastAddr="224.0.0.1"
          mcastPort="45564" mcastFrequency="500"
          mcastDropTime="3000"/>
          <Receiver
          className="org.apache.catalina.cluster.tcp.ReplicationListener"

          tcpListenAddress="192.168.19.81"
          tcpListenPort="4001"
          tcpSelectorTimeout="100"
          tcpThreadCount="6"/>

          修改web應用里面WEB-INF目錄下的web.xml文件,加入標簽
          <distributable/>
          直接加在</web-app>之前就可以了
          做tomcat集群必須需要這一步,否則用戶的session就無法正常使用。
          注意事項1mcastAddr="224.0.0.1" 這主廣播地址因此需要開啟網卡組播功能
          route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0
          分別在各機器上運行
          2、查看端口情況:
          Netstat –antl |grep 4001 同步監聽的端口
          tomcat1

          tomcat2
          <!--[if !vml]-->
          <!--[endif]-->
          3、測試廣播:
          java -cp tomcat-replication.jar MCaster 224.0.0.1 45564 Terminal1
          java -cp tomcat-replication.jar MCaster 224.0.0.1 45564 Terminal2
          如果不報錯則能正常廣播
          tomcat-replication.jar 下載:[url]http://cvs.apache.org/~fhanik/tomcat-replication.jar[/url]
          如果是二臺機器,可以用tcpdump 抓取包
          五、測試 集群及session同步
          webapps 下新建test 目錄
          目錄下建WEB-INF目錄下的web.xml文件
          <web-app xmlns="http://java.sun.com/xml/ns/j2ee"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee [url]http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd[/url]"
          version="2.4">
          <display-name>TomcatDemo</display-name>
          <distributable/>
          </web-app>
          再在webapps 建立print.jsp test.jsp
          Print.jsp :
          <%
          System.out.println("www.linuxtone.org liuyu.blog.51cto.com");
          %>
          test.jsp
          <%@ 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>");
          String dataName = request.getParameter("dataName");
          session.setAttribute("myname","session?");
          if (dataName != null && dataName.length() > 0) {
          String dataValue = request.getParameter("dataValue");
          session.setAttribute(dataName, dataValue);
          }
          out.print("<b>Session P±?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="index.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>
          重啟所有的服務。
          如圖可以看出tomcat 集群配置完成
          Session 復制的查看
          在同一窗口,輸入名稱和值,
          在日志可以看到如下結果. 這種結果表明成功了
          tomcat1

          tomcat 2

          <!--[if !vml]-->
          <!--[endif]-->
          錯誤總匯:
          skipping state transfer. No members active in cluster group."
          mcastBindAddress 沒有添加或添加得不對
          ?Unknown default host: ajp13
          JK 配置不當
          其它的不記得了。。。
          posted on 2015-07-08 18:26 智者無疆 閱讀(392) 評論(0)  編輯  收藏 所屬分類: software project
           
          Copyright © 智者無疆 Powered by: 博客園 模板提供:滬江博客


             觀音菩薩贊

          主站蜘蛛池模板: 绥中县| 云霄县| 元氏县| 合水县| 红河县| 海口市| 丹凤县| 南岸区| 枝江市| 三河市| 佛学| 平武县| 邹平县| 汾阳市| 九寨沟县| 桓台县| 日土县| 莲花县| 台山市| 新疆| 卢龙县| 阳山县| 永和县| 建宁县| 甘孜县| 香河县| 方正县| 绥芬河市| 唐河县| 民权县| 沂水县| 肥城市| 东莞市| 灵宝市| 山东省| 澳门| 宜昌市| 德钦县| 民权县| 永康市| 古浪县|