开发者社区 问答 正文

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如何实现集群啊?

"

展开
收起
montos 2020-06-02 12:33:21 861 分享 版权
阿里云 AI 助理回答

EhCache 2.5.2 在集群环境下实现缓存同步的问题,您遇到的挑战在于确保两台服务器之间的缓存数据能够实时更新。从您的描述来看,您已经尝试了多种配置方法,包括手动配置RMICacheManagerPeerProviderFactory、自动发现以及使用JGroups进行复制,但都遇到了不同程度的问题。

分析问题

  1. 手动配置RMICacheManagerPeerProviderFactory:您已经正确地指定了对方服务器的地址和端口,理论上应该可以实现缓存同步。但是,由于您提到仍然存在不同步现象,可能的原因包括网络问题、防火墙限制、RMI配置不正确或版本兼容性问题等。

  2. 自动发现与多播组:自动发现方式依赖于网络环境支持多播,并且需要确保所有节点的配置一致,包括多播地址和端口。如果网络环境不支持多播或者配置有误,会导致节点间无法发现彼此。

  3. JGroups整合问题:EhCache 2.5.2 版本较老,与最新版的JGroups可能存在兼容性问题。此外,序列化问题通常是因为自定义对象没有正确实现Serializable接口或者序列化ID不一致导致的。

解决方案建议

  1. 检查网络配置:确认两台服务器间的网络连接是畅通的,尤其是对于RMI配置,确保没有防火墙阻止RMI通信(默认端口为4567)。

  2. 日志分析:开启EhCache的日志记录,详细查看启动和运行时的日志信息,这有助于定位问题所在,比如是否有连接失败、权限不足或配置错误的信息。

  3. 序列化问题:确保所有放入缓存中的自定义对象实现了java.io.Serializable接口,并且考虑指定一个固定的序列化ID以避免序列化兼容性问题。

  4. 升级或替换解决方案:考虑到EhCache 2.5.2已经是比较旧的版本,其在集群功能上的支持可能不如新版本或其他现代缓存系统完善。您可以考虑升级到EhCache 3.x(尽管这可能涉及到较大的迁移工作),或者评估其他更现代的分布式缓存解决方案,如Redis、Hazelcast或Apache Ignite。这些解决方案提供了更成熟、更灵活的集群模式,且社区支持和文档更加丰富。

  5. JGroups配置调整:如果坚持使用JGroups,尝试寻找适用于EhCache 2.5.2的稳定版本,并仔细按照官方文档或已知成功案例来配置,确保序列化设置正确无误。

综上所述,解决缓存不同步问题可能需要从多个角度入手,包括但不限于网络配置、软件版本兼容性、序列化实现以及考虑是否需要升级到更现代的技术栈。希望这些建议能帮助您解决问题。

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