要session sticky,其原理是tomcat实例response的时候,在session id后面附上了一个自己实例的标示(route),那么客户端浏览器再后续请求的时候,会把sessionid送过来,同时也带上了这个标示(route),apache会从sessionid这个HTTP HEAD里面拿到这个标示,决定将请求转发给后面哪个tomcat实例。因此要点就是:
1、tomcat实例要在response的时候标示自己,通过server.xml里面的jvmRoute参数
2、apache要从request里面拿出来route信息,从哪个HEAD里面拿?通过stickysession参数来指定
3、apache怎么转发?通过route参数来指定。
例如:
ProxyPass / balancer://mycluster stickysession=JSESSIONID
BalancerMember http://1.2.3.4:8009 route=clone1
BalancerMember http://1.2.3.5:8009 route=clone2
在相应的tomcat实例clone1里面jvmRoute参数配置“clone1”,在clone2;里面配置clone2。
最后想提醒一点:apache2.2的load balance的session sticky性能并不好,因为他这是在七层协议级别进行请求的分发。我测试的结果表明,并不很稳定。
对于tomcat群集来说,最好就是SNA(Share Nothing Architecture),应用程序压根就不用session,这样才能无限扩展。
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 /admin balancer://tomcatcluster/admin lbmethod=byrequests stickysession=JSESSIONID nofailover=Off timeout=5 maxattempts=3
ProxyPassReverse /admin balancer://tomcatcluster/admin
<Proxy balancer://tomcatcluster>
BalancerMember ajp://localhost:8009 route=web1
BalancerMember ajp://localhost:10009 smax=10 route=web2
BalancerMember ajp://localhost:11009 route=web3
BalancerMember ajp://localhost:12009 smax=10 route=web4
</Proxy>