session共享有两种方式:
 
 1、session共享,多个服务器session拷贝保存,一台宕机不会影响用户的登录状态;
 
 2、请求精确集中定位,即当前用户的请求都集中定位到一台服务器中,这样单台服务器保存了用户的session登录信息,如果宕机,则等同于单点部署,会丢失;
   apache中针对上述两个方法提供了不同的配置项:
     (a) session replication:会话复制,即上述的方法一;
     (b)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_module modules/mod_proxy.so
 LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
 LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
 然后在此配置文件末端加入以下代码:
 ProxyPass / balancer://tomcatcluster/ lbmethod=byrequests stickysession=JSESSIONID nofailover=Off timeout=5 maxattempts=3  
 ProxyPassReverse / balancer://tomcatcluster/   
   
 <Proxy balancer://tomcatcluster>  
   BalancerMember ajp://localhost:8009 route=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 port 8009 -->
     <Connector port="8009"  enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />
 其中的port为前面<Proxy>中设定的端口,还要配置其route,代码如下:
 <!-- Define the top level container in our 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_module modules/mod_proxy.so
 LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
 LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
 
 然后在此配置文件末端加入以下代码:
 
 ProxyPass / balancer://tomcatcluster/
 ProxyPassReverse / balancer://tomcatcluster/   
   
 <Proxy balancer://tomcatcluster>  
   BalancerMember ajp://localhost:8009 route=a  
   BalancerMember ajp://localhost:9009 route=b
 </Proxy>
 接下来修改Tomcat的server.xml文件,如下:
 <!-- Define an AJP 1.3 Connector on port 8009 -->
     <Connector port="8009" enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />
 其中的port为前面<Proxy>中设定的端口,还要配置其route,代码如下:
 <!-- Define the top level container in our container hierarchy -->
     <Engine name="Catalina" defaultHost="localhost" jvmRoute="a">
 jvmRoute也须同前面的设置一样。
 另外,还需要在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"/>
 
             <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>
 最后,要在我们的应用程序里的web-inf下的web.xml文件<web-app>元素的最后加上: <distributable/> 。
服务器down掉错误信息:
org.apache.catalina.tribes.group.interceptoers.TcpFailureDetector memberDisappeared
Verification complete. Member still alivce[org.apache.catalina.tribes.membership.MemberImpl[tcp://<172.16.3.107]