配置前的准备工作
在配置集群应用前要对集群的配置信息有一个良好的设计,下面就是我们这次配置的集群信息: 在同一网段内的不同机器上配置集群,以下是以2台机器做群集, 机器类型 操作系统 硬件配置 角色 备注 普通PC Linux as 4 IP:10.3.15.85 PORT:9080 Managed Server Pc1 普通PC Linux as 4 IP: 10.3.15.84 PORT:9080 Managed Server Pc2 普通PC Linux as 4 IP: 10.3.15.85 PORT:80 Balancer Server Pc1 1 操作系统 RedHat Linux as4 2 所需软件 Apache 2.0.54 下载地址 http://apache.freelamp.com/httpd/httpd-2.0.54.tar.gz Tomcat5.5.9 下载地址 http://apache.justdn.org/jakarta/tomcat-5/v5.5.9/bin/jakarta-tomcat-5.5.9.tar.gz Mod_jk 1.2.14 下载地址 http://apache.justdn.org/jakarta/tomcat-connectors/jk/source/jk-1.2.14/jakarta-tomcat-connectors-1.2.14-src.tar.gz Jdk 1_5_0_04 下载地址 http://java.sun.com/j2se/1.5.0/download.jsp 备注:下载时将所需软件包文件保存在/usr/local目录下,也可以采用jdk1.4 3 安装步骤 3.1 安装JDK # cd /usr/local/ # chmod 777 jdk-1_5_0_04-linux-i586-rpm.bin # ./jdk-1.5.0_04-linux-i586-rpm.bin # cd /usr/java/ # ln -s /usr/java/jdk-1_5_0_04 /usr/local/java # vi /etc/profile #添加如下内容 JAVA_HOME=/usr/local/java/ CLASSPATH=/usr/local/java/lib/dt.jar:/usr/local/java/lib/tools.jar PATH=/usr/local/java/bin:$PATH export PATH JAVA_HOME CLASSPATH 3.2 安装Apache # cd /usr/local/ # tar xvfz httpd-2.0.54.tar.gz # cd httpd-2.0.54 #./configure—prefix=/usr/local/apache—enable-module=so # make # make install # cd /usr/local/apache/conf # vi ./httpd.conf 将Listen 80修改为Listen <Your IP>:80 将ServerName修改为ServerName <HOST-NAME>:80 在DirectoryIndex中添加index.jsp # cd /usr/local/apache/bin/ # ./apachectl configtest 若显示Syntax ok则表明安装成功 #./apachectl start 启动apache服务,访问本机80端口,查看端口是否正常 # ./apachectl stop 关闭服务 备注:prefix定义apache的安装路径 3.3 安装Tomcat # cd /usr/local/ # tar xvfz jakarta-tomcat-5.5.9.tar.gz # ln –s /usr/local/jakarta-tomcat-5.5.9 /usr/local/tomcat # vi /usr/local/tomcat/bin/catalina.sh JAVA_HOME=/usr/local/java 启动服务后,访问本机8080端口,查看端口是否正常 # /usr/local/tomcat/bin/startup.sh /startup.bat 关闭服务 # /usr/local/tomcat/bin/shutdown.sh /shutdown.bat 3.4 安装JK #cd /usr/local/ # tar xzvf jakarta-tomcat-connectors-1.2.14-src.tar.gz #cd jakarta-tomcat-connectors-1.2.14-src/jk/native #chmod 755 buildconf.sh #./buildconf.sh #./configure—with-apxs=/usr/local/apache/bin/apxs #make #make install #cd /usr/local/ jakarta-tomcat-connectors- jk1.2.14-src/jk/native/apache-2.0/ #cp mod_jk.so /usr/local/apache/modules/ 4 系统整合 4.1 在文件最末尾加上如下语句 #vi /usr/local/apache/conf/httpd.conf # Load mod_jk LoadModule jk_module modules/mod_jk.so # Configure mod_jk JkWorkersFile conf/workers.properties JkLogFile logs/mod_jk.log JkLogLevel info JkMount /*.jsp loadbalancer JkMount /servlet/* loadbalancer JkMount /application/* loadbalancer 4.2 添加workers.properties #vi /usr/local/apache/conf/workers.properties 内容如下: worker.list=loadbalancer #Define a ‘local_worker’ worker using ajp13 worker.worker1.port=8009 worker.worker1.host=10.3.15.84 worker.worker1.type=ajp13 worker.worker1.lbfactor=1 worker.worker1.local_worker=0 worker.worker1.cachesize=1000 worker.worker1.cache_timeout=600 worker.worker1.socket_keepalive=1 worker.worker1.socket_timeout=0 worker.worker1.reclycle_timeout=300 worker.worker1.retries=3 #Define another ‘local_worker’ worker using ajp13 worker.worker2.port=8009 worker.worker2.host=10.3.15.85 worker.worker2.type=ajp13 worker.worker2.lbfactor=1 worker.worker2.local_worker=1 worker.worker2.cachesize=1000 worker.worker2.cache_timeout=600 worker.worker2.socket_keepalive=1 worker.worker2.socket_timeout=0 worker.worker1.reclycle_timeout=300 worker.worker1.retries=3 #Define the LB worker worker.loadbalancer.type=lb worker.loadbalancer.balanced_workers=worker1,worker2 worker.loadbalancer.local_worker_only=1 worker.loadbalancer.sticky_session=true worker.loadbalancer.sticky_session_force=true 注:以上定义了两个worker,一个为worker1,另一个为worker2,定义了一个负载平衡服务器loadbalancer,其中标蓝 色的为重点配置项,相关的详细说明可以看官方的网站文档:http://tomcat.apache.org/connectors-doc/ worker.list=loadbalancer 设定工作的负载平衡器,各Tomcat节点不能加入此列表。 worker.worker1.lbfactor 负载平衡的权重比,如果此权重比越大,则分配到此节点的请求越多,如以上两个节点的权重比为1:1,则为平均分配。 worker.loadbalancer.balance_workers=worker1,worker2 指定此负载平衡器负责的Tomcat应用节点。 worker.loadbalancer.sticky_session=true 此处指定集群是否需要会话复制,如果设为true,则表明为会话粘性,不进行会话复制,当某用户的请求第一次分发到哪台Tomcat后,后继的请求会一直分发到此Tomcat服务器上处理;如果设为false,则表明需求会话复制。 worker.loadbalancer.sticky_session_force=true 如果上面的sticky_session设为true时,建议此处也设为true,此参数表明如果集群中某台Tomcat服务器在多次请求没有响 应后,是否将当前的请求,转发到其它Tomcat服务器上处理;此参数在sticky_session=true时,影响比较大,会导致转发到其它 Tomcat服务器上的请求,找不到原来的session,所以如果此时请求中有读取session中某些信息的话,就会导致应用的null异常。 4.3 修改server.xml #vi /usr/local/tomcat/conf/server.xml 在120行左右加入如下语句 <Engine name=”Standalone” defaultHost=”localhost” jvmRoute=”tomcat1”></Engine> 若第二台worker1,将jvmRoute的修改为worker2 并且把下面群集配置释放出来,也就是去掉注释。 <Cluster className=”org.apache.catalina.cluster.tcp.SimpleTcpCluster” managerClassName=”org.apache.catalina.cluster.session.DeltaManager” expireSessionsOnShutdown=”false” useDirtyFlag=”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=”10.3.15.85” tcpListenPort=”4001” tcpSelectorTimeout=”100” tcpThreadCount=”6”/> <Sender className=”org.apache.catalina.cluster.tcp.ReplicationTransmitter” replicationMode=”pooled”/> <Valve className=”org.apache.catalina.cluster.tcp.ReplicationValve” filter=”.*/.gif;.*/.js;.*/.jpg;.*/.htm;.*/.html;.*/.txt;”/> <Deployer className=”org.apache.catalina.cluster.deploy.FarmWarDeployer” tempDir=”/tmp/war-temp/” deployDir=”/tmp/war-deploy/” watchDir=”/tmp/war-listen/” watchEnabled=”false”/> </Cluster> 至此,系统已经整个完毕 启动apache和tomcat服务 # /usr/local/apache/bin/apachectl start #/usr/local/tomcat/bin/catalina.sh start 将如下内容添加至/etc/rc.d/rc.local文件末尾,以便系统启动后开启apache,tomcat服务 /usr/local/tomcat/bin/catalina.sh start /usr/local/apache/bin/apachectl start 5 测试群集 经过以上所有步骤,一个具有2个节点的tomcat群集已经配置完毕,但有时可能不能进行节点间的会话复制,是因为要把所有节点的 server.xml中的tcpListenAddress=”auto”改为tcpListenAddress=”10.3.15.85” ,也就是改为真实的ip地址。 如果在启动时,出现如下信息:skipping state transfer. No members active in cluster group. 也需要修改上面的信息。否则,session是不能在多个tomcat间复制session的。 5.1 编写一个简单web应用,包含如下内容: 写一个如下的2个jsp页面。 test.jsp内容如下: <%@ page contentType=”text/html; charset=GBK” %> <%@ page import =”com.WorkerBean”%> <%@ page import=”java.net.*” %> <html> <head> <title> test </title> </head> <body bgcolor=”#ffffff”> <%= request.getSession().getId() %> <% int i=0; WorkerBean test = new WorkerBean(); //HttpSession tsession=request.getSession(); test.setWorker_no(request.getSession().getId()+i); session.setAttribute(“worker_no”,test.getWorker_no()); System.out.println(“OK”); System.out.println(“session.getAttribute()==”+session.getAttribute(“worker_no”)); out.println(“session.getAttribute()==”+session.getAttribute(“worker_no”)); out.println(“OK”); %> <a href=”testResult.jsp”> testResult.jsp</a> <h1>Tomcat </h1> </body> </html> testResult.jsp内容如下 <%@ page contentType=”text/html; charset=GBK” %> <%@ page import =”com.WorkerBean”%> <%@ page import=”java.net.*” %> <html> <head> <title> test </title> </head> <body bgcolor=”#ffffff”> <% System.out.println(“OK”); System.out.println(“session.getAttribute()==”+session.getAttribute(“worker_no”)); out.println(“OK”); out.println(“session.getAttribute()==”+session.getAttribute(“worker_no”)); %> <h1>Tomcat </h1> </body> </html> 5.2 编写这个jsp调用的javaBean类。 WorkerBean.java public class WorkerBean implements java.io.Serializable { String worker_no; /** @return返回worker_no。 */ public String getWorker_no() { return worker_no; } /** @param worker_no要设置的worker_no。 */ public void setWorker_no(String worker_no) { this.worker_no = worker_no; } } 注意:这个类一定要实现序列化,是为了把session对象存在这个类中,session是要在群集中复制的,否则session对象不能在群集中复制。 5.3配置web.xml文件 注意:一定要加入<distributable/>,其他的就是和普通的应用一样的。 <?xml version=”1.0” encoding=”UTF-8”?> <!DOCTYPE web-app PUBLIC “-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN” “http://java.sun.com/dtd/web-app_2_3.dtd”> <web-app> <display-name>web</display-name> <distributable/> </web-app> 5.4确保server.xml如附录1和附录2所示:略 5.5 发布web应用,把上面的所有文件考到tomcat的webapps/ROOT目录下,覆盖掉原来的文件就可以了。 5.6 测试web应用 启动apache和tomcat1和tomcat2. 在浏览器地址栏中输入 http://10.3.15.85/ 会看到如下页面 在浏览器地址栏中输入http://10.3.15.85/test.jsp 会看到如下页面 点击上面页面中的2.jsp连接,进入如下页面 可以同看控制台的输出发现,2个tomcat轮流的响应请求的。 然后,任意的关掉其中的一台tomcat, 再点击2.jsp ,还是可以得到回应的。说明群集自动接管了出错机器的应用,发现其中的session的值也是相同的,说明session在群集中不同的tomcat之间进行了会话复制。 总结:通过以上测试和其他工具的测试,发现如果用2台机器作tomcat群集,比一台单独得tomcat支持更多的并发,同时可以做到一台出错时,另一台自动接管。但没有2台单独得tomcat支持的并发多。 |