进行集群配置的目的是为了提高Windchill系统Web端相关功能的执行效率和的用户访问速度。但是tom猫终归只是一只小猫,再强也不会变成一只老虎。在优化系统配置的同时我们更需要优化自己开发的程序,使其高效、健壮。ps:复杂程序或大数据量的交互操作建议将程序切换到MethodServer去执行,既在代码中使用
RemoteMethodServer.getDefault.invoke(xxx);
实现该功能需要同时配置Apache和Tomcat,本文在Windchill9.1M060环境下以同时运行3个Tomcat为例,下面逐一介绍。
一、复制并修改Tomcat的启动和停止路径
分别重命名为Tomcat2,Tomcat3,首先修改Tomcat的启动和关闭命令执行文件里的Tomcat路径。
修改{Tomcat_home}/bin目录里的以下四个文件里的CATALINA_HOME变量,改为
Tomcat2/Tomcat3
setenv CATALINA_HOME"d:\ptc\Windchill_9.1\Tomcat"wttomcat_start.bat
wttomcat_start,
wttomcat_stop.bat
wttomcat_stop
二、配置Apache
1、找到并打开${Apache_home}\conf\httpd.conf,启用以下module(去掉默认配置前的“#”)
LoadModule proxy_modulemodules/mod_proxy.soLoadModule proxy_connect_module
modules/mod_proxy_connect.soLoadModuleproxy_ftp_module
modules/mod_proxy_ftp.soLoadModuleproxy_http_module
modules/mod_proxy_http.soLoadModuleproxy_ajp_module
modules/mod_proxy_ajp.soLoadModuleproxy_balancer_module
modules/mod_proxy_balancer.so
2、找到并打开${Apache_home}\conf\extra\ajpWorkers.conf,修改默认的负载平衡的配置
修改前(示例):
<Proxy balancer://ajpWorker>BalancerMember ajp://pdmtest.com:8010 min=16 max=80 smax=40 ttl=900keepalive=Off timeout=90000 retry=1 flushpackets=on </Proxy>
修改后(示例):
<Proxy balancer://ajpWorker>BalancerMember ajp://pdmtest.com:8010 min=16 max=80
smax=40 ttl=900 keepalive=Off timeout=90000retry=1 flushpackets=on route=jvm1
BalancerMember ajp://pdmtest.com:8011min=16 max=80 smax=40 ttl=900 keepalive=Off
timeout=90000 retry=1 flushpackets=onroute=jvm2 BalancerMember ajp://pdmtest.com:8012
min=16 max=80 smax=40 ttl=900 keepalive=Offtimeout=90000 retry=1 flushpackets=on
route=jvm3</Proxy>
ajpWorker是AJP工作器的唯一标识,在之后Apache的配置中,也需要一一对应。
这里是对实现AJP协议的连接器(Tomcat)进行负载平衡的配置,如果连接器在不同主机上,那端口号可以相同,否则必须修改端口号使其唯一,此文讲述的是通常情况,也就是多个Tomcat安装在同一台物理主机上,后面所叙述的端口修改都是基于这类情况。
值得注意的是,8010、8011、8012是3个Tomcat的访问端口,route是指定每个连接器的标识符,必须唯一,后面Tomcat的配置会说明如何使用。
可以按照上述格式,定义多个参与负载平衡的连接器。
3、找到并打开conf\extra\httpd-vhosts.conf,清空默认文件内容,增加以下内容替换默认的虚拟主机配置
<VirtualHost *:80> ServerAdminwebmaster@${mail_host} ServerName ${host} ServerAlias
${host} ProxyPass / balancer://ajpWorker/stickysession=jsessionid nofailover=On
ProxyPassReverse /balancer://ajpWorker/</VirtualHost>
注意:这里的ajpWorker与第2步<Proxy>里指定的相同。
4\找到并打开conf\extra\app-Windchill-AJP.conf,这里定义了请求转发的核心代码
系统默认内容
<IfModule mod_proxy_ajp.c> ProxyPassMatch
^(/Windchill/((?i).*\.jsp(.*)|servlet/.*|.*\.jar))$balancer://ajpWorker$1 nocanon</IfModule>
balancer://后面的ajpWorker需修改为与第2、第3步配置的名称相同。
三、配置Tomcat
打开{Tomcat}/conf/server.xml,进行以下配置:
1、修改3个Tomcat的Server port值分别为8006,8007,8008
<Server port="8006"shutdown="SHUTDOWN">
2、修改3个Tomcat的Connectorport值分别为8010,8011,8012,需与前面Apache(2.2)里配置的端口相同。
<Connector port="8012"channelSocket.maxPort="-1" redirectPort="8443"protocol="AJP/1.3"
tomcatAuthentication="false"enableLookups="false" maxPostSize="-1"
useBodyEncodingForURI="true"URIEncoding="UTF-8" backlog="0" maxThreads="320"
minSpareThreads="16"maxSpareThreads="40"/>
3、找到<Engine/>节点,为其添加属性jvmRoute=jvm1(jvm2、jvm3),这3个值需与前面Apache(2.2)里配置的route相同。
修改后:
<Engine name="Catalina"defaultHost="localhost" jvmRoute="jvm1">
到此为止,负载均衡集群基本配置完成,但是还有最重要的一项未配,既实现各个Tomcat(Web容器)之间的session共享,以确保不同Tomcat间切换时不丢失数据。
session丢失所引起的最直观的问题表现:
1、使用OOTB搜索功能。系统提示:您的会话数据已过期。请重复您的操作。
2、无法正常登陆并访问info*Engine管理器里的条目。
3、无法进入队列管理器查看条目。提示:会话数据已经失效。
即所有与seesion相关的功能均会出现异常。
建议:进行如下配置前,先验证以上问题的存在。
解决办法如下:
9.1和9.0的Tomcat版本(6和5)不一样,所以配置也略有不同。
在server.xml里找到Cluster节点并注释掉,使用以下内容替换,同时增加<Receiver/>节点
9.0下的配置
<Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"
channelSendOptions="6"managerClassName="org.apache.catalina.ha.session.BackupManager"
expireSessionsOnShutdown="false"useDirtyFlag="true" notifyListenersOnReplication="true"
mapSendOptions="6"><ReceiverclassName="org.apache.catalina.cluster.tcp.ReplicationListener"tcpListenAddress="auto"
tcpListenPort="4001"tcpSelectorTimeout="100"tcpThreadCount="6"/></Cluster>
属性channelSendOptions和mapSendOptions,是设置Tomcat进行I/O操作时的选择,这里采用了官方推荐的实现类,org.apache.catalina.ha.session.BackupManager,比默认实现类DeltaManager更加高效。
<Receiver/>里的属性tcpListenPort每个Tomcat都需不同。可改为4001,4002,4003等。
至此,所有配置全部完毕,删除Tomcat和info*engine的缓存,启动服务,验证前面的3个问题是否存在。