Liferay CE服务器会话复制配置失败求助(已完成TCP集群部署)
Liferay CE TCP集群会话复制故障排查与解决方案
基础配置校验
- 确认两台服务器Tomcat
server.xml中的<Cluster>配置:- 使用
org.apache.catalina.ha.tcp.SimpleTcpCluster实现类 - 确保
clusterName在所有节点完全一致(如clusterName="LiferayCluster") - 配置正确的节点通信参数:
tcpListenAddress设为服务器实际IP(禁止用127.0.0.1),tcpListenPort不冲突,channelSendOptions="8"(同步发送模式) - 若用静态成员配置,添加
<Membership>节点指定所有集群节点地址:<Membership className="org.apache.catalina.ha.membership.StaticMembershipProvider"> <Member className="org.apache.catalina.ha.membership.Member" host="server1-ip" port="4000" /> <Member className="org.apache.catalina.ha.membership.Member" host="server2-ip" port="4000" /> </Membership>
- 使用
- 检查所有Web应用(包括Liferay ROOT及自定义Portlet)的
WEB-INF/web.xml中是否添加了<distributable/>标签,缺失该标签会导致会话不进入复制流程。
Tomcat会话复制核心配置
- 修改
conf/context.xml,配置分布式会话管理器:
注意:禁止使用默认的<Manager className="org.apache.catalina.ha.session.DeltaManager" expireSessionsOnShutdown="false" notifyListenersOnReplication="true"/>StandardManager,它不支持分布式会话。 - 若单独配置了
cluster.xml,校验Channel组件:确保TcpNioSender、TcpNioReceiver、MembershipInterceptor配置正确,成员发现端口(如默认45564)在所有节点一致。
Liferay专属集群配置
- 编辑
portal-ext.properties,启用并配置集群会话:cluster.link.enabled=true cluster.link.autodetect.address=服务器广播IP或可互通的IP session.replication.enabled=true web.server.servlet.session.enable.persistence=true web.server.servlet.session.persistence.mode=cluster - 校验
portal-ehcache.xml中的缓存集群配置:- 确保
RMICacheManagerPeerProviderFactory配置了所有节点的RMI地址:<cacheManagerPeerProviderFactory class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory" properties="peerDiscovery=manual, rmiUrls=//server1:40001/portalCache|//server2:40001/portalCache"/> - 检查缓存节点的
cacheEventListenerFactory是否启用了复制:<cacheEventListenerFactory class="net.sf.ehcache.distribution.RMICacheReplicatorFactory" properties="replicateAsynchronously=false, replicatePuts=true, replicateUpdates=true"/>
- 确保
- 确认
liferay-hibernate.cfg.xml中使用集群兼容的缓存工厂:<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
网络与环境校验
- 测试集群端口连通性:用
nc -zv 目标服务器IP 端口验证以下端口(根据实际配置调整):- Tomcat集群通信端口(默认4000)
- Ehcache RMI端口(默认40001)
- 成员发现端口(默认45564)
- 同步两台服务器系统时间:时间差超过阈值会导致会话复制失效,可使用
ntpdate或chrony服务同步。 - 关闭防火墙或添加端口放行规则:确保集群节点间的TCP/UDP通信不受阻。
调试与验证
- 开启Tomcat集群调试日志:在
conf/logging.properties添加org.apache.catalina.ha.level=FINE,查看catalina.log中的节点加入、会话复制日志,定位错误(如序列化失败、节点无法发现)。 - 手动测试会话复制:
- 在节点A登录Liferay,记录会话ID
- 切换到节点B,访问相同页面,检查是否保持登录状态
- 自定义测试:在节点A的会话中存入可序列化对象,在节点B读取该对象验证是否存在
- 检查会话序列化:查看
CATALINA_BASE/work/Catalina/localhost/ROOT目录下的.session文件,若未生成,说明会话未被标记为可复制。
常见问题修复
- 版本一致性:确保所有节点的Liferay CE版本、Tomcat版本完全相同,版本差异会导致序列化失败。
- 会话对象序列化:自定义Portlet或主题中存入会话的对象必须实现
Serializable接口,否则会中断复制流程。 - 主机名解析:确保所有节点能通过IP或主机名互相访问,避免DNS解析失败导致节点无法发现。
内容的提问来源于stack exchange,提问作者Akshay Patel
相关产品推荐
相关产品推荐

