Redis 对tomcat集群--session的管理


由于公司项目需要 故要针对tomcat集群--session的管理的问题,思考了下有两种方案

1.tomcat服务器之间的session的复制

2.利用缓存服务器对session的纺一管理


针对方案一的缺点:

 详细点是这样:如果你在Session中保存一个与该客户端有关的状态,比如状态数值为1,下次该客户端再发一个请求时,需要到自己的Session中寻找这个数值为1的状态。

在分布式环境中有两种办法:
1.如果下次该客户端发出的请求不是访问的是上次请求的服务器,那么他在新服务器中就找不到数值为1的状态,因为被负载平衡器随机分配到新服务器上了。

2.为了让他找到数值1的状态,那么就在这两台服务器之间拷贝Session中的状态,数值1的状态从原来服务器拷贝到新服务器,第二次请求就能在新服务器上找到这个数值为1的状态。但来这样做的问题是:服务器就会耗费负载来处理服务器之间的拷贝,根本没有全心全意处理客户端发出的请求,严重发生风暴堵塞。


所以也就放弃了方案一

现在我们就对方案二解说一下 假设我们有两台服务器A B 具体怎么配置我就不细讲

这里是需要在两台服务器 tomcat7/conf/context.xml 做一个修改 我在网上看些资料说也可以在server.xml做修改 具体没有试过不过也有人说不可以  最好在context.xml做修改了

在context.xml的尾端加入如下内容

<Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" />
<Manager className="com.radiadesign.catalina.session.RedisSessionManager"
         host="localhost" port="6379" database="0" maxInactiveInterval="60" />
</Context>

<Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" />
<Manager className="com.radiadesign.catalina.session.RedisSessionManager"
         host="localhost" port="6379" database="0" maxInactiveInterval="60" />
</Context>

其次在 tomcat/lib 下加3个jar 包  

commons-pool-1.6.jar    jedis-2.2.1.jar   tomcat-redis-session-manager-1.2-tomcat-7-java-7.jar


当初我在选用JAR包的时候 会报以下错


八月 12, 2014 12:43:16 下午 org.apache.tomcat.util.digester.Digester startElement
严重: Begin event threw error
java.lang.NoClassDefFoundError: org/apache/commons/pool/impl/GenericObjectPool$Config
     at java.lang.Class.getDeclaredConstructors0(Native Method)
     at java.lang.Class.privateGetDeclaredConstructors(Class.java:2532)
     at java.lang.Class.getConstructor0(Class.java:2842)
     at java.lang.Class.newInstance(Class.java:345)
     at org.apache.tomcat.util.digester.ObjectCreateRule.begin(ObjectCreateRule.java:145)
     at org.apache.tomcat.util.digester.Digester.startElement(Digester.java:1288)
     at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:509)
     at com.sun.org.apache.xerces.internal.parsers.AbstractXMLDocumentParser.emptyElement(AbstractXMLDocumentParser.java:182)
     at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(XMLDocumentFragmentScannerImpl.java:1343)
     at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2786)
     at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606)
     at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
     at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848)
     at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)
     at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
     at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)
     at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:648)
     at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1561)
     at org.apache.catalina.startup.ContextConfig.processContextConfig(ContextConfig.java:637)
     at org.apache.catalina.startup.ContextConfig.contextConfig(ContextConfig.java:580)
     at org.apache.catalina.startup.ContextConfig.init(ContextConfig.java:837)
     at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:385)
     at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
     at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
     at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:402)
     at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:110)
     at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:139)
     at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
     at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
     at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:649)
     at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1247)
     at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1898)
     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
     at java.util.concurrent.FutureTask.run(FutureTask.java:262)
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
     at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.pool.impl.GenericObjectPool$Config
     at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
     at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
     at java.security.AccessController.doPrivileged(Native Method)
     at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
     at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
     at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
     ... 37 more
 
八月 12, 2014 12:43:16 下午 org.apache.catalina.startup.HostConfig deployDirectory
严重: Error deploying web application directory C:\Apache Software Foundation\tomcat7\tomcat3\apache-tomcat-7.0.55\webapps\docs
java.lang.NoClassDefFoundError: org/apache/commons/pool/impl/GenericObjectPool$Config
     at java.lang.Class.getDeclaredConstructors0(Native Method)
     at java.lang.Class.privateGetDeclaredConstructors(Class.java:2532)
     at java.lang.Class.getConstructor0(Class.java:2842)
     at java.lang.Class.newInstance(Class.java:345)
     at org.apache.tomcat.util.digester.ObjectCreateRule.begin(ObjectCreateRule.java:145)
     at org.apache.tomcat.util.digester.Digester.startElement(Digester.java:1288)
     at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:509)
     at com.sun.org.apache.xerces.internal.parsers.AbstractXMLDocumentParser.emptyElement(AbstractXMLDocumentParser.java:182)
     at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(XMLDocumentFragmentScannerImpl.java:1343)
     at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2786)
     at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606)
     at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
     at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848)
     at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)
     at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
     at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)
     at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:648)
     at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1561)
     at org.apache.catalina.startup.ContextConfig.processContextConfig(ContextConfig.java:637)
     at org.apache.catalina.startup.ContextConfig.contextConfig(ContextConfig.java:580)
     at org.apache.catalina.startup.ContextConfig.init(ContextConfig.java:837)
     at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:385)
     at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
     at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
     at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:402)
     at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:110)
     at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:139)
     at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
     at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
     at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:649)
     at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1247)
     at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1898)
     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
     at java.util.concurrent.FutureTask.run(FutureTask.java:262)
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
     at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.pool.impl.GenericObjectPool$Config
     at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
     at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
     at java.security.AccessController.doPrivileged(Native Method)
     at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
     at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
     at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
     ... 37 more

报这个原因网上说的有很版本  有些全是扯蛋 也不知道 有没有验证过 

有的人说是tomcat7版本高只能用t omcat6 有的人说是包冲突  其实真正的原因是jar包的版本不对

tomcat7 是对应的 commons-pool-1.6.jar    jedis-2.2.1.jar   tomcat-redis-session-manager-1.2-tomcat-7-java-7.jar 这3个jar 包才不会报错 

redis用的是2.0以上的版本   启动顺序是 redis  tomcat 

重启两个Tomcat实例。可以检查到Redis确实保存了Tomcat的会话。然后我们对Tomcat实例取下或恢复时,访问用户确实没受影响。

在redis-cli.exe可以查看两他服务器的session实现共享了


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值