集群共享缓存[关闭]

Posted

技术标签:

【中文标题】集群共享缓存[关闭]【英文标题】:Cluster Shared Cache [closed] 【发布时间】:2010-11-02 04:58:08 【问题描述】:

我正在寻找一个允许我在多个 JVM 之间共享缓存的 java 框架。

我需要的是类似Hazelcast 但没有“分布式”部分的东西。我希望能够在缓存中添加一个项目并将其自动同步到其他“组成员”缓存。如果可能的话,我希望通过可靠的多播(或类似的东西)同步缓存。

我查看了Shoal,但遗憾的是“分布式状态缓存”似乎不足以满足我的需求。

我查看了JBoss Cache,但对于我需要做的事情来说似乎有点矫枉过正。

我查看了JGroups,这似乎是我需要做的最有前途的工具。有没有人有 JGroups 的经验?最好是用作共享缓存?

还有其他建议吗?

谢谢!

编辑:我们正在开始测试以帮助我们在 Hazelcast 和 Infinispan 之间做出决定,我很快就会接受答案。

编辑:由于突然的需求变化,我们不再需要分布式地图了。我们将使用 JGroups 作为低级信号框架。谢谢大家的帮助。

【问题讨论】:

Hazelcast 和 Infinispan?嗯。这些不是成熟的技术...尝试在一个节点中的 Hazelcast 演示中按 Ctrl-z。裂脑。 Infinispan 仍处于 alpha 阶段!我建议您以 java-source.net/open-source/cache-solutions 为起点。 EHCache、OSCache 和 JBoss Cache 至少是成熟且广为接受的技术。你已经说过兵马俑是重量级的,所以没关系。我只是讨厌看到你浪费时间,发现你的东西完全不稳定。 我们还没有决定,我们只是在测试。感谢您的关注,Taylor :) 此外,Hazelcast 演示中的 CTRL-Z 也可以正常工作。通过任务管理器或任何其他方式杀死任何节点也是如此。 再一次,Terracotta 可以在这里为您提供帮助 ;-)。 Terracotta 中的锁定/信号发送非常简单。这是集群中的同步等待/通知,用于在集群中的线程之间发出信号:terracotta.org/web/display/orgsite/Recipe?recipe=waitnotify 【参考方案1】:

这个怎么样?

将本地 ConcurrentHashMap 作为本地缓存。 创建一个 Hazelcast 分布式地图/缓存。 开始监听分布式地图事件并更新您的本地 ConcurrentHashMap。

现在每个成员上的本地缓存将是相同的。自动同步。

import com.hazelcast.core.IMap; 
import com.hazelcast.core.Hazelcast;
import com.hazelcast.core.EntryListener;
import com.hazelcast.core.EntryEvent; 
import java.util.concurrent.ConcurrentHashMap;

public class Sample implements EntryListener 
        Map localCache = new ConcurrentHashMap ();

        public static void main(String[] args)  
                Sample sample = new Sample();
                IMap   map    = Hazelcast.getMap("default"); 

                //Listen for all added/updated/removed entries
                map.addEntryListener(sample, true);  
        

        public void entryAdded(EntryEvent event) 
             localCache.put(event.getKey(), event.getValue());            
        

        public void entryRemoved(EntryEvent event) 
             localCache.remove(event.getKey());            
        

        public void entryUpdated(EntryEvent event) 
             localCache.put(event.getKey(), event.getValue());            
        

【讨论】:

java.util.Map 没有名为“addEntryListener”的方法.. 你是对的。它应该是:com.hazelcast.core.IMap map = Hazelcast.getMap ("default");实际上,我会将 ReplicatedMap 实现直接放入 Hazelcast 以使生活更轻松。【参考方案2】:

您考虑过 Infinispan - http://www.jboss.org/infinispan/ 吗? API 非常简单,并且基于标准 (JSR-107)。用法也很简单

CacheManager manager = new DefaultCacheManager(
                GlobalConfiguration.getClusteredDefault() );

Cache cache = manager.getCache();

cache.put("key", "value");

--哈迪

【讨论】:

另一个非常有前途的解决方案。谢谢!【参考方案3】:

经过一番搜索,我找到了JGroup's ReplicatedHashMap。它尚未经过彻底测试,但似乎是一个很好的开始。它满足了我的所有要求,而没有给我太多我不需要的功能。它也非常灵活。不过,我仍在寻找“完美”的答案:)

感谢您的回答。

【讨论】:

JBossCache 本质上是 ReplicatedHashMap 的工业级实现。它使用相同的底层 JGroups 传输机制。【参考方案4】:

你考虑过兵马俑吗?可能有点矫枉过正:http://www.terracotta.org/web/display/orgsite/Data+Caching

前段时间有一个缓存领域的 JSR,以下是否符合要求:http://java-source.net/open-source/cache-solutions/jcache?

几年前我个人用过FKache,效果很好,但是我没有在分布式模式下使用。

具有本地数据副本的分布式缓存是否重要?如果您需要共享内存,还有 JavaSpaces 的东西......

【讨论】:

我考虑过使用 Terracotta,并计划将其用作最后的手段,因为正如您所说,它是矫枉过正。 不确定我是否理解这里的情绪。我当然有偏见——因为我为 Terracotta 工作——但使用 Terracotta 做简单的缓存实际上非常容易,应该可以为您提供出色的性能。就像将 ConcurrentHashMap 标记为集群一样简单,并且您拥有同步缓存。请参阅此处的示例:terracotta.org/web/display/orgsite/… 如果您想要/需要驱逐,您可以从附加库中获取:terracotta.org/web/display/docs/Cache+Evictor 我对 Terracotta 唯一的小问题是它需要服务器才能工作。这不是 100% P2P。我知道我没有在我的问题中提到它,所以 +1 答案:) 很公平 - 但 P2P 也有很多问题。考虑到我在那里工作,我显然偏向于 Terracotta,也就是说,根据我的经验,基于 UDP、多播和 P2P 的解决方案在生产中永远无法正常工作。它们需要交换机级别和操作系统级别的配置和调整,以适应任何合理的规模级别,超过 4 个节点,P2P 崩溃,因为到处复制不起作用。所以最后,对于生产解决方案,总是关闭多播,切换到 TCP 复制,并使用等效的基于服务器的拓扑。但在开发中,它们看起来确实不错:) 非常感谢 Taylor 的输入。可悲的是,正如软件开发中经常发生的那样,P2P 与客户端/服务器之间的选择不是我可以选择的 :( 不过我会让我的老板知道。我们在其他项目中使用过 Terracotta(不需要 P2P ) 过去,也许这会有所帮助;)【参考方案5】:

我在这方面使用了一些技术,我强烈推荐JBoss Cache 作为您尝试做的最佳选择。它使用 JGroups 作为其传输,但提供了更高级别的事务抽象。开箱即用,它为您提供分布式树节点结构。

edit: 哦,而且JBossCache 是独立于JBoss Application Server 的,你可以在任何环境中使用它。如果有的话,它在 JBossAS 之外比在它内部工作得更好。

【讨论】:

【参考方案6】:

Memcached 有多个Java Clients。

【讨论】:

我不在网络服务器上工作。我想这里的问题是术语“缓存”,这并不是我真正想要的。我需要一个共享数据结构;) Memcached 与 Web 服务器没有任何关系。这是您正在寻找的东西的类型。【参考方案7】:

我的选项是来自 Apache 的 Java Caching System,它支持 TCP 横向缓存,我认为这是您需要的功能。

【讨论】:

感谢您的建议,但是,从文档中:“[...]两个本地缓存可能具有相同项目的不同版本。像大多数缓存一样,这适用于高 get 和低放置利用率,这种情况会暗示使用不当”。我再次怀疑“缓存”一词可能不是在我的情况下使用的正确词。我需要根据需要经常将数据放入“缓存”中。【参考方案8】:

http://ehcache.org/ 是非常好的轻缓存。它可以在多个 JVM 之间共享。 在内部它可以使用 JGroups。

【讨论】:

以上是关于集群共享缓存[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Memcached集群

Ehcache学习ehcache缓存共享

关于 tomcat 集群中 session 共享的三种方法

关于 tomcat 集群中 session 共享的三种方法

关于 tomcat 集群中 session 共享的三种方法

关于 tomcat 集群中 session 共享的三种方法