"
使用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如何实现集群啊?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
EhCache 2.5.2 在集群环境下实现缓存同步的问题,您遇到的挑战在于确保两台服务器之间的缓存数据能够实时更新。从您的描述来看,您已经尝试了多种配置方法,包括手动配置RMICacheManagerPeerProviderFactory、自动发现以及使用JGroups进行复制,但都遇到了不同程度的问题。
手动配置RMICacheManagerPeerProviderFactory:您已经正确地指定了对方服务器的地址和端口,理论上应该可以实现缓存同步。但是,由于您提到仍然存在不同步现象,可能的原因包括网络问题、防火墙限制、RMI配置不正确或版本兼容性问题等。
自动发现与多播组:自动发现方式依赖于网络环境支持多播,并且需要确保所有节点的配置一致,包括多播地址和端口。如果网络环境不支持多播或者配置有误,会导致节点间无法发现彼此。
JGroups整合问题:EhCache 2.5.2 版本较老,与最新版的JGroups可能存在兼容性问题。此外,序列化问题通常是因为自定义对象没有正确实现Serializable
接口或者序列化ID不一致导致的。
检查网络配置:确认两台服务器间的网络连接是畅通的,尤其是对于RMI配置,确保没有防火墙阻止RMI通信(默认端口为4567)。
日志分析:开启EhCache的日志记录,详细查看启动和运行时的日志信息,这有助于定位问题所在,比如是否有连接失败、权限不足或配置错误的信息。
序列化问题:确保所有放入缓存中的自定义对象实现了java.io.Serializable
接口,并且考虑指定一个固定的序列化ID以避免序列化兼容性问题。
升级或替换解决方案:考虑到EhCache 2.5.2已经是比较旧的版本,其在集群功能上的支持可能不如新版本或其他现代缓存系统完善。您可以考虑升级到EhCache 3.x(尽管这可能涉及到较大的迁移工作),或者评估其他更现代的分布式缓存解决方案,如Redis、Hazelcast或Apache Ignite。这些解决方案提供了更成熟、更灵活的集群模式,且社区支持和文档更加丰富。
JGroups配置调整:如果坚持使用JGroups,尝试寻找适用于EhCache 2.5.2的稳定版本,并仔细按照官方文档或已知成功案例来配置,确保序列化设置正确无误。
综上所述,解决缓存不同步问题可能需要从多个角度入手,包括但不限于网络配置、软件版本兼容性、序列化实现以及考虑是否需要升级到更现代的技术栈。希望这些建议能帮助您解决问题。