Apache+Tomcat负载均衡两种session共享方式的设置

session共享有两种方式:

 

1、session共享,多个服务器session拷贝保存,一台宕机不会影响用户的登录状态;

 

2、请求精确集中定位,即当前用户的请求都集中定位到一台服务器中,这样单台服务器保存了用户的session登录信息,如果宕机,则等同于单点部署,会丢失;

 

apache中针对上述两个方法提供了不同的配置项:

 

 session replication:会话复制,即上述的方法一;

 

 session sticky:会话不复制,即上述的方法二;

 

-------------------------------


选取Apache HTTP Server作为前端的负载服务器,后端选取两个Tomcat作集群。

 

一、采用粘性Session

 

这种方式将同一用户的请求转发到特定的Tomcat服务器上,避免了集群中Session的复制,缺点是用户只跟一种的一台服务器通信,如果此服务器down掉,那就废了。

采用的model为mod_proxy_ajp.so,整个配置在tomcat的配置文件中都有相关的注释,只需作相应修改就OK。

我们选取的是Apache HTTP Server2.2.4,Tomcat5.5.16。

首先安装Apache HTTP Server,然后修改其配置文件http.conf,首先load三个model,代码如下:

LoadModule proxy_modulemodules/mod_proxy.so

LoadModule proxy_ajp_modulemodules/mod_proxy_ajp.so

LoadModule proxy_balancer_modulemodules/mod_proxy_balancer.so

然后在此配置文件末端加入以下代码:

ProxyPass / balancer://tomcatcluster/lbmethod=byrequests stickysession=JSESSIONID nofailover=Off timeout=5maxattempts=3 

ProxyPassReverse /balancer://tomcatcluster/  

 

<Proxy balancer://tomcatcluster> 

BalancerMember ajp://localhost:8009route=a 

BalancerMember ajp://localhost:9009 route=b

</Proxy>

 

以上代码配置了Proxy的相关参数,<Proxy>模块定义了均衡负载的配置,其中两个Tomcat Server都配置在同一台服务器上,端口分别为8009、9009,并配置各自的route,这样Apache Server就能根据route将请求转发给特定的Tomcat。

接下来修改Tomcat的server.xml文件,如下:

<!-- Define an AJP 1.3 Connector on port8009 -->

   <Connector port="8009"

                enableLookups="false"redirectPort="8443" protocol="AJP/1.3" />

其中的port为前面<Proxy>中设定的端口,还要配置其route,代码如下:

<!-- Define the top level container inour container hierarchy -->

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

jvmRoute也须同前面的设置一样。

 

下面用JMeter对配置后的负载均衡做一测试,首先先启动两个Tomcat Server,随后启动Apache Server,在JMeter中新建测试计划,在两个Tomcat Server中的jsp-examples下新建test.jsp(此jsp自己随便写两句就成),然后进行测试,以下是部分取样器结果:

HTTP response headers:

HTTP/1.1 200 OK

Date: Wed, 11 Jul 2007 02:17:55 GMT

Set-Cookie:JSESSIONID=AC7EF1CAA8C6B0FEB68E77D7D375E2AF.b; Path=/jsp-examples

Content-Type: text/html;charset=ISO-8859-1

Content-Length: 3

Keep-Alive: timeout=5, max=79

Connection: Keep-Alive

 

以上红色代码表示用户的http请求中的JSESSIONID中已经附带了route后缀,.b表示此请求将转发到route为b的Tomcat Server上,你将会发现其中的一部分请求的JSESSIONID后缀为.a,也就是转发给route为a的Tomcat Server上。

 

 

 

二、采用Session复制

 

修改apache http server配置文件http.conf,首先load三个model,代码如下:

LoadModule proxy_modulemodules/mod_proxy.so

LoadModule proxy_ajp_modulemodules/mod_proxy_ajp.so

LoadModule proxy_balancer_modulemodules/mod_proxy_balancer.so

 

然后在此配置文件末端加入以下代码:

 

ProxyPass / balancer://tomcatcluster/

 

ProxyPassReverse / balancer://tomcatcluster/  

 

<Proxy balancer://tomcatcluster> 

BalancerMember ajp://localhost:8009route=a 

BalancerMember ajp://localhost:9009 route=b

</Proxy>

接下来修改Tomcat的server.xml文件,如下:

<!-- Define an AJP 1.3 Connector on port8009 -->

   <Connector port="8009"

                enableLookups="false"redirectPort="8443" protocol="AJP/1.3" />

其中的port为前面<Proxy>中设定的端口,还要配置其route,代码如下:

<!-- Define the top level container inour container hierarchy -->

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

 

jvmRoute也须同前面的设置一样。

另外,还需要在tomcat中将以下配置打开:

 

 <ClusterclassName="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"/>

 

           <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"/>

 

           <ValveclassName="org.apache.catalina.cluster.tcp.ReplicationValve"

                  filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>

                 

           <DeployerclassName="org.apache.catalina.cluster.deploy.FarmWarDeployer"

                     tempDir="/tmp/war-temp/"

                     deployDir="/tmp/war-deploy/"

                     watchDir="/tmp/war-listen/"

                      watchEnabled="false"/>

                    

           <ClusterListenerclassName="org.apache.catalina.cluster.session.ClusterSessionListener"/>

        </Cluster>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用 Apache+Tomcat 实现负载均衡时,我们可以使用 mod_jk 模块实现。mod_jk 是 Apache 的一个模块,它与 Tomcat 之间通过 AJP 协议进行通信,可以将请求分发给多个 Tomcat 服务器,从而实现负载均衡。 以下是使用 mod_jk 实现负载均衡的步骤: 1. 安装 mod_jk 模块 在 Apache 的模块目录下,添加 mod_jk 模块。在 Linux 系统中,通常是在 /etc/httpd/modules 目录下。 2. 配置 mod_jk 模块 在 Apache 的配置文件 httpd.conf 中,添加以下内容: ``` LoadModule jk_module modules/mod_jk.so JkWorkersFile /path/to/workers.properties JkLogFile /path/to/mod_jk.log JkLogLevel info ``` 上述配置中,LoadModule 指令用于加载 mod_jk 模块,JkWorkersFile 指令用于指定 workers.properties 文件的路径,该文件定义了 Tomcat 服务器的列表和其它相关参数,JkLogFile 指令用于指定 mod_jk 的日志文件路径,JkLogLevel 指令用于指定日志级别。 3. 配置 workers.properties 文件 在 workers.properties 文件中,我们需要定义多个 Tomcat 服务器的信息,例如: ``` worker.list=worker1,worker2 worker.worker1.type=ajp13 worker.worker1.host=192.168.1.1 worker.worker1.port=8009 worker.worker2.type=ajp13 worker.worker2.host=192.168.1.2 worker.worker2.port=8009 ``` 上述配置中,worker.list 指定了所有的 Tomcat 服务器名称,worker1 和 worker2 是两个 Tomcat 服务器的名称,type 指定了通信协议,host 和 port 分别指定了 Tomcat 服务器的 IP 地址和端口号。 4. 配置虚拟主机 在 Apache 的虚拟主机配置中,添加以下内容: ``` JkMount /* worker1 JkMount /app1/* worker2 ``` 上述配置中,JkMount 指令用于指定 URL 与 Tomcat 服务器之间的映射关系,* 表示所有的 URL,/app1/* 表示以 /app1/ 开头的 URL。 5. 配置重试和超时 在 workers.properties 文件中,我们可以配置重试和超时的参数,例如: ``` worker.worker1.retries=3 worker.worker1.connect_timeout=10000 worker.worker1.prepost_timeout=10000 ``` 上述配置中,retries 表示在重试之前的最大尝试次数,connect_timeout 表示连接超时时间,prepost_timeout 表示请求和响应的超时时间。 6. 测试负载均衡 完成上述配置后,我们可以启动多个 Tomcat 服务器,并访问 Apache 的虚拟主机。Apache 会将请求分发给多个 Tomcat 服务器,从而实现负载均衡。 以上就是使用 mod_jk 实现负载均衡的步骤。需要注意的是,使用 mod_jk 进行负载均衡时,需要确保 Tomcat 服务器之间的 session 同步。可以使用 Tomcat 提供的 session 共享机制或使用其它第三方的 session 共享方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值