开发者社区 问答 正文

ehcache集群缓存不同步问题:配置报错 

使用EhCache2.52,做缓存,缓存用的Spring3.1注解,测试用两台服务器集群EhCache,出现缓存不同步问题,访问两台服务器都各自缓存了,A服务器缓存更新,访问B服务器依旧是旧的缓存数据,数据没更新。 A服务器ehcache.xml中缓存配置如下:

<cacheManagerPeerProviderFactory           class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"           properties="hostName=192.168.3.111,          port=4567,          socketTimeoutMillis=2000,          peerDiscovery=manual,          rmiUrls=//192.168.3.211:4567/param" />

<cache name="param" maxElementsInMemory="10000" maxElementsOnDisk="10000000" eternal="true" overflowToDisk="true" diskPersistent="true" memoryStoreEvictionPolicy="LFU"> <cacheEventListenerFactory          class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"          properties="replicateAsynchronously=true,      replicatePuts=true,      replicateUpdates=true,           replicateUpdatesViaCopy=false,        replicateRemovals=true"/> </cache>

B服务器ehcache.xml中缓存配置如下:

<cacheManagerPeerProviderFactory           class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"           properties="hostName=192.168.3.211,          port=4567,          socketTimeoutMillis=2000,          peerDiscovery=manual,          rmiUrls=//192.168.3.111:4567/param" />

<cache name="param" maxElementsInMemory="10000" maxElementsOnDisk="10000000" eternal="true" overflowToDisk="true" diskPersistent="true" memoryStoreEvictionPolicy="LFU"> <cacheEventListenerFactory          class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"          properties="replicateAsynchronously=true,      replicatePuts=true,      replicateUpdates=true,           replicateUpdatesViaCopy=false,        replicateRemovals=true"/> </cache> 也曾尝试使用自动发现

<cacheManagerPeerProviderFactory          class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"          properties="peerDiscovery=automatic, multicastGroupAddress=230.0.0.1,          multicastGroupPort=4446, timeToLive=32"     /> 以及jsGroups,都无法同步缓存,其中jsGroup最新版的还不能和EhCache2.5.2组合使用,只能用2.X,而且缓存的DAO方法参数中有对象实现了序列化,ehcache-jgroupsreplication还会报错,请问这是何解啊?EhCache如何实现集群啊?

展开
收起
kun坤 2020-06-02 17:24:54 677 分享 版权
阿里云 AI 助理回答

EhCache 2.5.2 实现集群缓存同步主要依赖于 RMI 或 JGroups 等技术。从你的描述来看,你已经尝试了使用 RMI 进行手动配置和自动发现,以及 JGroups(通过 jsGroups 插件)来实现缓存的分布式同步,但遇到了不同步的问题。

针对 RMI 方式:

  1. 检查网络连接:确保两台服务器之间网络通畅,端口没有被防火墙阻拦。
  2. 主机名与IP一致性:在你的配置中,A服务器配置B服务器的地址,B服务器配置A服务器的地址,这看起来是正确的。但是,请确认实际运行时这些地址能够正确解析并连接。
  3. RMIUrls一致性:请确保所有参与集群的节点都指向了正确的RMIUrls,并且这些URL能够在网络中被其他节点访问到。
  4. 序列化问题:确保所有放入缓存中的对象都实现了 java.io.Serializable 接口,因为RMI需要序列化数据进行网络传输。

针对 JGroups(jsGroups插件)方式:

  1. 版本兼容性:你提到 jsGroups 最新版不支持 EhCache 2.5.2,这意味着你可能需要寻找一个兼容该版本EhCache的JGroups适配器版本。
  2. 序列化异常:如果 DAO 方法参数中有自定义对象,确保这些对象正确实现了序列化接口,并且没有序列化相关的问题。对于复杂的对象结构,可能需要更细致地检查序列化逻辑。
  3. 配置细节:检查 JGroups 的配置是否正确,包括组播地址、端口等设置,确保它们适合你的网络环境,并且所有节点都使用了相同的配置。

综合建议:

  • 升级EhCache版本:考虑升级到EhCache 3.x或更高版本,新版本提供了更好的集群支持和性能优化,同时解决了许多旧版本中的问题。
  • 使用其他解决方案:如果EhCache集群配置复杂度较高,可以考虑使用其他成熟的缓存解决方案,如 Hazelcast、Redis Cluster 或者 Infinispan,这些工具为分布式缓存提供了更直接的支持和更好的文档。

最后,针对具体的报错信息进行深入分析,通常能更快定位问题所在。如果还有具体错误日志或详细报错信息,进一步分析那些信息会更有助于解决问题。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答