Spi*_*Tom 2 java tomcat liferay tomcat6
我目前正在设置一个tomcat 6集群环境,liferay 6.0.6.4个会话复制节点.没有粘性会话.
因此,按照本网站提供的指南,我做了以下工作:
添加了webapps/conf/context.xml:添加了webapps/ROOT/WEB-INF/web.xml:在第一个括号后面的文件顶部.我还将distributable添加到我的所有自定义portlet web.xml中.在setenv.sh中:-Djava.net.preferIPv6Addresses = false -Djava.net.preferIPv4Stack = true
在webapps/conf/server.xml中
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcatA" />
Run Code Online (Sandbox Code Playgroud)
tomcatA/B/C/D跨越节点.
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="8">
<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false" notifyListenersOnReplication="true" />
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.10" port="45564" frequency="500" dropTime="3000" />
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto" port="4000" autoBind="100" selectorTimeout="5000"
maxThreads="6" />
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport
className="org.apache.catalina.tribes.transport.nio.PooledParallelSender" timeout="30000" />
</Sender>
<Interceptor
className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector" />
<Interceptor
className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor" />
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.css;.*\.txt;" />
<ClusterListener
className="org.apache.catalina.ha.session.ClusterSessionListener" />
</Cluster>
Run Code Online (Sandbox Code Playgroud)
在启动时,每个节点都会相互检测到并且似乎有效.但是,当有人试图修改webcontent时,我们会收到错误:
SEVERE: Manager [localhost#/]: Unable to receive message through TCP channel
java.lang.IllegalStateException: setAttribute: Session already invalidated
at org.apache.catalina.session.StandardSession.setAttribute(StandardSession.java:1326)
at org.apache.catalina.ha.session.DeltaSession.setAttribute(DeltaSession.java:594)
at org.apache.catalina.ha.session.DeltaRequest.execute(DeltaRequest.java:164)
at org.apache.catalina.ha.session.DeltaManager.handleSESSION_DELTA(DeltaManager.java:1487)
at org.apache.catalina.ha.session.DeltaManager.messageReceived(DeltaManager.java:1437)
at org.apache.catalina.ha.session.DeltaManager.messageDataReceived(DeltaManager.java:1171)
at org.apache.catalina.ha.session.ClusterSessionListener.messageReceived(ClusterSessionListener.java:92)
at org.apache.catalina.ha.tcp.SimpleTcpCluster.messageReceived(SimpleTcpCluster.java:901)
at org.apache.catalina.ha.tcp.SimpleTcpCluster.messageReceived(SimpleTcpCluster.java:882)
at org.apache.catalina.tribes.group.GroupChannel.messageReceived(GroupChannel.java:269)
at org.apache.catalina.tribes.group.ChannelInterceptorBase.messageReceived(ChannelInterceptorBase.java:79)
at org.apache.catalina.tribes.group.interceptors.TcpFailureDetector.messageReceived(TcpFailureDetector.java:110)
at org.apache.catalina.tribes.group.ChannelInterceptorBase.messageReceived(ChannelInterceptorBase.java:79)
at org.apache.catalina.tribes.group.ChannelInterceptorBase.messageReceived(ChannelInterceptorBase.java:79)
at org.apache.catalina.tribes.group.ChannelCoordinator.messageReceived(ChannelCoordinator.java:241)
at org.apache.catalina.tribes.transport.ReceiverBase.messageDataReceived(ReceiverBase.java:225)
at org.apache.catalina.tribes.transport.nio.NioReplicationTask.drainChannel(NioReplicationTask.java:188)
at org.apache.catalina.tribes.transport.nio.NioReplicationTask.run(NioReplicationTask.java:91)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
Run Code Online (Sandbox Code Playgroud)
我的liferay-ext.properties:
cluster.link.autodetect.address=www.google.com:80
lucene.replicate.write=true
cluster.link.enabled=true
net.sf.ehcache.configurationResourceName=/cache/hibernate-clustered.xml
ehcache.multi.vm.config.location=/cache/liferay-multi-vm-clustered.xml
Run Code Online (Sandbox Code Playgroud)
我还在所有节点上创建了一个jsp
<td>
Session ID</td>
<td><%= session.getId() %></td>
<% session.setAttribute("abc","abc"); %>
</tr>
<tr>
<td>
Created on</td>
<td><%= new java.util.Date(session.getCreationTime()).toString() %></td>
</tr>
</table>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
使用相同的用户,我可以切换服务器,并且会话似乎没有问题地被复制.然而,当我在liferay中修改某些内容时,我仍然可以获得堆栈跟踪.
我已经被困了一段时间了.我们已检查所有服务器和JVM时间是否与NTP服务器正确同步.没有端口被阻止.服务器无法访问互联网.它们都在VM上运行.
任何人都有任何想法我做错了什么?
谢谢.
几点说明......
1.)您报告的问题可能与用于channelSendOptions的值有关.
SEVERE:Manager [localhost#/]:无法通过TCP通道接收消息java.lang.IllegalStateException:setAttribute:Session已经失效
您当前的配置是将channelSendOptions设置为值8.这意味着您的节点之间发送的消息是异步发送的.这对速度很有帮助,但是,这意味着数据可能无序到达[1].
错误消息指示它接收到更新会话属性的消息,但是要更新的会话已经被无效(即删除).出现此错误的常见原因是因为消息已无序接收.
在大多数情况下,您可以通过将channelSendOptions设置为值6来更正此问题.这将同步发送消息,这保证了订单.
[1] - https://tomcat.apache.org/tomcat-6.0-doc/config/cluster.html#Attributes
2.)另一种可能性,尽管不太可能,是你在Tomcat中遇到了一个错误.您尚未列出正在使用的Tomcat的特定版本,但升级到最新的Tomcat 6.0.x版本也是一个好主意.
3.)您表示"没有粘性会话就无法复制会话".这是不正确的.会话复制和会话粘性是两个独立的过程.虽然它们经常一起使用,但会话复制不需要粘性会话,粘性会话不需要会话复制.
会话复制(Tomcat称为"集群")是跨多个Tomcat服务器复制会话数据的过程.当会话数据跨多个节点复制时,用户请求发送到哪个节点并不重要,因为它们都具有相同的会话数据.
会话"粘性"由负载均衡器执行,它是负载均衡器的进程,确保始终将一个会话定向到同一后端Tomcat服务器.
例如,负载均衡器将请求定向到Tomcat服务器A,该请求导致创建会话.启用会话粘性后,负载均衡器会将具有相同会话ID的每个其他请求发送到Tomcat服务器A.其他没有会话或不同会话的请求将继续正常负载平衡.
像巧克力和花生酱一样,粘性会话和会话复制通常一起使用,但这不是必需的.可以仅使用粘性会话执行基本负载平衡,但是如果后端Tomcat节点发生故障,用户将丢失会话数据.通过会话复制和粘性会话,用户不会受到其中一个后端Tomcat节点故障的影响.它们将自动由负载均衡器路由到不同的节点,该节点将具有用户会话数据的副本.