2012-05-02 68 views
2

我目前正在设置tomcat 6集群环境liferay 6.0.6。 具有会话复制的4个节点。没有粘性会话。SEVERE:Manager [localhost#/]:无法通过TCP通道接收消息

所以下面这个网站提供的指导,我做了以下内容:

的webapps/conf/context.xml文件中加入: 的webapps/ROOT/WEB-INF/web.xml中添加:到文件的顶部,在第一个括号之后。 我还添加了可分发到所有我的自定义Portlet web.xml。 在setenv.sh出现:-Djava.net.preferIPv6Addresses =假-Djava.net.preferIPv4Stack =真

在web应用/ CONF/server.xml中

<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcatA" /> 

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> 

在启动时,每个节点检测到对方,它似乎工作。然而,当有人试图修改web内容,我们得到一个错误:

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) 

我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 

香港专业教育学院也创造了所有节点上的一个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> 

用同一个用户,我可以切换服务器,并且会话似乎被复制而没有问题。然而,当我去修改liferay中的某些东西时,我仍然得到了堆栈跟踪。

我被困了一段时间了。 我们检查了所有服务器和JVM时间与NTP服务器正确同步。 没有端口被阻塞。服务器无法访问互联网。 它们都在VM上运行。

任何人有什么想法我做错了什么?

谢谢。

回答

6

的几个注意事项...

1)被用于channelSendOptions要报告可能与价值做的问题。

SEVERE: Manager [localhost#/]: Unable to receive message through TCP channel java.lang.IllegalStateException: setAttribute: Session already invalidated

您当前的配置设定channelSendOptions到的的值。这意味着您的节点之间发送的消息是异步发送的。这对速度非常有用,但是,这意味着数据可能无序到达[1]。

错误消息指示它收到了更新会话属性的消息,但是要更新的会话已经失效(即已删除)。得到此错误的常见原因是因为消息已被无序接收。

在大多数情况下,你可以通过设置channelSendOptions至值更正此问题。这将同步发送消息,这保证了顺序。

[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的请求,并且被创建在会话中请求的结果。在启用会话粘性的情况下,负载均衡器将向Tomcat服务器A发送每个具有相同会话ID的附加请求。没有会话或不同会话的其他请求将继续正常进行负载平衡。

就像巧克力和花生酱,粘性会话和会话复制经常一起使用,但它不是必需的。基本负载均衡只能通过粘性会话执行,但用户在后端Tomcat节点出现故障时会丢失会话数据。通过会话复制和粘性会话,用户不会受到其中一个后端Tomcat节点发生故障的影响。它们将自动由负载均衡器路由到不同的节点,并且该节点将拥有用户会话数据的副本。

+0

感谢你的解释。它使事情变得更清晰。 – SpikerTom