无组播环境Orbeon Forms PE(Ehcache)复制配置故障排查
Orbeon Forms PE双节点集群EhCache相关故障排查
问题现状
- 部署架构:2节点Orbeon Forms PE集群,节点IP分别为172.13.238.241、172.13.238.242,前置HAProxy做负载均衡,因环境限制未使用官方推荐的组播集群方案。
- 故障现象:单节点关闭后,数分钟内所有浏览器侧请求报错,后续请求恢复后响应速度极慢,初步怀疑故障与EhCache配置相关。
- 现有节点1配置(节点2仅互换IP、修改uniqueId值):
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="asynchronous" channelStartOptions="3"> <Manager className="org.apache.catalina.ha.session.DeltaManager" expireSessionsOnShutdown="false" notifyListenersOnReplication="true"/> <Channel className="org.apache.catalina.tribes.group.GroupChannel"> <Interceptor className="org.apache.catalina.tribes.group.interceptors.StaticMembershipInterceptor"> <Member className="org.apache.catalina.tribes.membership.StaticMember" port="4100" host="172.13.238.242" uniqueId="{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2}" /> </Interceptor> <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="172.13.238.241" port="4100" autoBind="0" maxThreads="6" selectorTimeout="5000" /> <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter"> <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/> </Sender> <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/> <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/> <Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/> </Channel> <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=".*\.gif|.*\.js|.*\.jpeg|.*\.jpg|.*\.png|.*\.htm|.*\.html|.*\.css|.*\.txt"/> <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/> </Cluster>
核心配置错误说明
- 缺失EhCache集群同步配置:当前提供的所有配置均为Tomcat容器级会话复制配置,未包含任何EhCache的集群同步规则。Orbeon Forms的表单定义、会话状态缓存依赖EhCache实现,未配置EhCache静态成员发现、缓存失效同步逻辑时,单节点下线后存活节点会持续尝试向已下线节点同步缓存数据,触发长超时阻塞;节点重新上线后缓存全量冷重建,直接导致响应速度极慢。
- Tomcat Tribes通道拦截器顺序错误:
StaticMembershipInterceptor必须放在所有其他通道拦截器的最后,当前配置将其放在拦截器链最前端,会导致TcpFailureDetector故障检测逻辑失效,节点下线后需要等待数分钟TCP默认超时才会标记节点离线,对应故障发生后数分钟内请求持续报错的现象。 - XML配置语法错误:原配置中ReplicationValve的className属性存在引号不匹配问题,会导致Tomcat集群配置加载异常,会话复制逻辑无法正常初始化。
- EhCache未配置静态成员发现:默认EhCache集群使用组播发现节点,在禁用组播的环境下必须手动配置静态成员地址、RMI同步端口,否则缓存节点互相不可见,无法完成缓存同步。
修复步骤
- 修正Tomcat集群配置
- 调整拦截器顺序,将
StaticMembershipInterceptor移动到拦截器链末尾 - 修复XML引号语法错误
- 为静态成员配置明确的本地节点标识,避免成员识别混乱
- 调整拦截器顺序,将
- 配置EhCache静态集群同步
- 编辑Orbeon配置目录下的
ehcache.xml,删除默认的组播PeerProvider配置,新增静态成员配置:节点1配置对端节点2的RMI地址为//172.13.238.242:41002/orbeonCacheManager,节点2配置对端节点1地址为//172.13.238.241:41001/orbeonCacheManager - 配置PeerListener端口,节点1绑定41001端口、节点2绑定41002端口,与Tomcat会话复制的4100端口错开避免冲突
- 为所有业务缓存开启bootstrap启动加载,节点启动时主动从存活对端拉取缓存数据,避免冷启动缓存击穿
- 编辑Orbeon配置目录下的
- 验证配置
- 重启两个节点后,查看日志确认Tomcat集群成员识别正常、EhCache RMI同步连接建立成功
- 模拟单节点下线,验证请求无长时间报错、剩余节点响应速度无明显下降
内容的提问来源于stack exchange,提问作者Master Drools
相关产品推荐
相关产品推荐

