軟件藝術思考者 |
|
|||
混沌,彷徨,立志,蓄勢... |
公告
日歷
導航隨筆分類(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的目錄――如果2個tomcat在同一臺機器該選項去掉 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 (tomcat2的IP) 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就無法正常使用。 注意事項:1、mcastAddr="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 配置不當 其它的不記得了。。。
|
![]() |
|
Copyright © 智者無疆 | Powered by: 博客園 模板提供:滬江博客 |
觀音菩薩贊