分享

tomcat集群

 碧海山城 2010-03-09

-)准备环境

(1)一台服务器,有一个apache,两个tomcat

(2)Apache2.2.14,tomcat6.0,18

(二)安装过程

(1)将一个tomcat的端口修改为7080

<Connector port="7080" protocol="HTTP/1.1" 

               connectionTimeout="20000" 

               redirectPort="8443" />

    这个连接时AJP连接,负责和其他HTTP服务器建立连接,与其他服务器集成时就需要这个连接。AJP协议时TomcatHTTP服务器之间通信定义的协议,能提供较高的通信速度和效率。

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

(三)负载均衡配置

1)安装apache,输入localhost,测试能否正常启动。

2)下载jk1.2.30,mod_jk-1.2.30-httpd-2.2.3.so,改名为mod_jk.so,复制到apachemodules下。 

3修改apache的安装目录中的conf目录的配置文件httpd.conf,在文件中加LoadModule模块配置信息

LoadModule jk_module modules/mod_jk.so 

JkWorkersFile conf/workers2.propertie

JkLogFile logs/mod_jk.log

JkLogLevel debug

请求分发配置,可以配置多项

JkMount /*.jsp loadbalancer

JkMount /helloapp/* loadbalancer

凡是/*.jsp , /helloapp/*请求都随loadbalancer来转发

4)修改两个tomcatserver.xml

<Engine name="Catalina" defaultHost="localhost">改为

<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">

<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">

(5)apacheconf文件夹下,增加workers2.propertie 文件

# Define 1 real worker using ajp13

worker.list=tomcat1,tomcat2,loadbalancer

# Set properties for tomcat1 (ajp13)

worker.tomcat1.type=ajp13 

worker.tomcat1.host=localhost 

worker.tomcat1.port=8009 

worker.tomcat1.lbfactor=1 #负载平衡的权重比,如果此权重比越大,则分配到此节点的请求越多,如两个节点的权重比为1:1,则为平均分配

# Set properties for tomcat2 (ajp13)

worker.tomcat2.type=ajp13 

worker.tomcat2.host=localhost 

worker.tomcat2.port=7009 

worker.tomcat2.lbfactor=1

#负载平衡器

worker.loadbalancer.type=lb

worker.loadbalancer.balanced_workers=tomcat1,tomcat2

worker.loadbalancer.sticky_session=false

worker.loadbalancer.sticky_session_force=false

前两个tomcat分别代表本机的两个tomcat服务器,它们由负载均衡器来调度。另一个loadbalancer,他是负载均衡器,

接下来开启两个tomcat后就,再开启apache,输入http://localhost/index.jsp,就可以看到tomcat的默认页面。

(四)tomcatapache集成时,通常tomcat不会接受http请求,所以可以关闭tomcatHTTP连接器。

(五)helloApp拷贝到两个tomctawebapp下,然后不断访问:可以判断每次请求访问谁来执行。

(六)集群管理器

同一个浏览器,访问同一个Web应用时,在同一个会话中,Session ID始终不变。但是,有了两个tomcat以后,就会出现问题。为了解决这个问题,需要配置Tomcat的集群管理器(SimpleTcpCluster)。

这需要修改t12server.xml文件,在engine元素内加入Cluster子元素,使得Tomcat能启用集群管理:

<Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster" 
                 managerClassName="org.apache.catalina.cluster.session.DeltaManager" 
                 expireSessionsOnShutdown="false" 
                 useDirtyFlag="true" 
                 notifyListenersOnReplication="true"> 
            <Membership 
                className="org.apache.catalina.cluster.mcast.McastService" 
                mcastAddr="228.0.0.4" 
                mcastPort="45564" 
                mcastFrequency="500" 
                mcastDropTime="3000"/> 
<!接收端口在各个Tomcat配置中不能重复--> 
            <Receiver 
                className="org.apache.catalina.cluster.tcp.ReplicationListener" 
                tcpListenAddress="auto" 
                tcpListenPort="4001" 
                tcpSelectorTimeout="100" 
                tcpThreadCount="6"/> 
            <Sender 
                className="org.apache.catalina.cluster.tcp.ReplicationTransmitter" 
                replicationMode="pooled" 
                ackTimeout="15000" 
                waitForAck="true"/> 
            <Valve className="org.apache.catalina.cluster.tcp.ReplicationValve" 
                   filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>                   
            <Deployer className="org.apache.catalina.cluster.deploy.FarmWarDeployer" 
                      tempDir="/tmp/war-temp/" 
                      deployDir="/tmp/war-deploy/" 
                      watchDir="/tmp/war-listen/" 
                      watchEnabled="false"/>                      
            <ClusterListener className="org.apache.catalina.cluster.session.ClusterSessionListener"/> 
        </Cluster>  

然后分别在t12helloapp应用的web.app文件,加入<distributable/> 元素,表示当Tomcat启动这个元素时,会为他创建由server.xml文件中的cluster元素的manager子元素指定的会话管理器。比如上面的DeltaManager,它能够把每一个服务节点中的会话信息复制到集群系统中的所有其他服务器节点中。

再次不停刷新页面,会看到是同一个session

注意:

我们分别将两个Tomcat配置文件中的jvmRoute设置为tomcat1tomcat2Server节点 端口分别配置为80059005,集群Receiver 节点tcpListenPort端口分别配置为40014002Connector节点端口分别配置为80809090AJPConnector端口分别配置为80099009。 
请注意两个Tomcat配置文件Host节点的域名配置必须一样,server.xml中的jvmRoute名称必须和worker.properties中的tomcat实例名称一致,不然无法实现session_stricky。 
如果不想实现粘性session, jvmRoute可以不配制。 
如果不想实现session复制,Cluster配制的注释就无需去掉
   
如果想实现session复制还需配制web.xml 
web.xml配置文件加上<distributable/>节点,此配置说明当前Web工程处于分布式部署环境。如果不进行这个配置,每次访问页面tomcat都会产生一个新的sessionid 

1.为了集群系统中,数据都能够在tomcat服务区上正确地复制,应该保证存放在会话范围内的所有属性都实现了Serializable借口。

2.集群中的tomcat服务器之间使用组播的形式来通信。如果tomcta所在的机器上有多个网卡,或者配置了虚拟网卡,有可能导致组播失败,从而复发复制会话。比如,tomcat1已经启动,tomcat2出现信息:

No members activein cluster group

一上信息表明,2没有识别到1,组播失败。这是,应该在clustemembership的配置中,确保设置了如下bind属性,它用于明确地设置组播绑定地址:

<Membership className="org.apache.catalina.tribes.membership.McastService"

                        bind="127.0.0.1"  

                        address="228.0.0.4"

                        port="45564"

                        frequency="500"

                        dropTime="3000"/>

3.如果集群规模下,可以用DeltaManager,如果打,应该采用BackupManager管理器。

4.address="228.0.0.4",组播地址,应该确保连接internet,否则无法访问该组播。

5.worker.loadbalancer.sticky_session=falsetrue表示会话具有粘性。意味着用户和1开始会话,以后用户从浏览器A发出的请求只要处于同一个会话中,负载均衡器就会始终让1来处理请求。这时候,集群不会进行会话复制。默认为false。前者为false,时候,后者的设置没什么影响。如果前者为true,后者也为true时候,表示始终连接。比如1异常终止,那么,服务端会返回500的错误。False的话,就发给2了,有可能不存在会话信息。

(七)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多