`
阅读更多
(-)准备环境

(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协议时Tomcat与HTTP服务器之间通信定义的协议,能提供较高的通信速度和效率。

<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,复制到apache的modules下。

(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)修改两个tomcat的server.xml,

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

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

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

(5)在apache的conf文件夹下,增加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的默认页面。


(四)把tomcat和apache集成时,通常tomcat不会接受http请求,所以可以关闭tomcat的HTTP连接器。

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

(六)集群管理器


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


这需要修改t1,2的server.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> 


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


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


注意:

我们分别将两个Tomcat配置文件中的jvmRoute设置为tomcat1、tomcat2,Server节点 端口分别配置为8005和9005,集群Receiver 节点tcpListenPort端口分别配置为4001和4002,Connector节点端口分别配置为8080和9090,AJPConnector端口分别配置为8009和9009。
请注意两个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,组播失败。这是,应该在cluste的membership的配置中,确保设置了如下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=false,true表示会话具有粘性。意味着用户和1开始会话,以后用户从浏览器A发出的请求只要处于同一个会话中,负载均衡器就会始终让1来处理请求。这时候,集群不会进行会话复制。默认为false。前者为false,时候,后者的设置没什么影响。如果前者为true,后者也为true时候,表示始终连接。比如1异常终止,那么,服务端会返回500的错误。False的话,就发给2了,有可能不存在会话信息。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics