选择分布式共享内存解决方案

我有一项任务是为大规模可扩展的分布式共享内存(DSM)应用程序构建原型。 原型只能作为概念validation,但我希望通过选择稍后将在真实解决方案中使用的组件来最有效地利用我的时间。

此解决方案的目的是从外部源获取数据输入,进行流失并使结果可用于许多前端。 那些“前端”只会从缓存中获取数据并在没有额外处理的情况下提供服务。 此数据的前端点击量实际上可以达到每秒数百万。

数据本身非常不稳定; 它可以(而且确实)变化很快。 然而,在最新的处理和缓存之前,前端应该看到“旧”数据。 处理和写入由单个(冗余)节点完成,而其他节点仅读取数据。 换句话说:没有直读行为。

我正在寻找像memcached这样的解决方案,但是这个特殊的解决方案并不能满足我们下面列出的所有要求:

  1. 该解决方案至少必须具有相当好的维护的Java客户端API ,因为应用程序的其余部分是用Java编写的,而且我们是经验丰富的Java开发人员;
  2. 解决方案必须是完全弹性的 :应该可以添加新节点而无需重新启动集群中的其他节点;
  3. 解决方案必须能够处理故障转移 。 是的,我意识到这意味着一些开销,但整体服务的数据大小并不大(最大1G)所以这应该不是问题。 “故障转移”是指在节点出现故障时无需硬编码/更改服务器IP地址(如memcached客户端)的无缝执行;
  4. 理想情况下,应该可以指定数据重叠程度(例如,应该在DSM集群中存储多少份相同数据的副本);
  5. 不需要永久存储所有数据,但可能需要对某些数据进行后处理(例如,序列化到DB)。
  6. 价格 。 显然我们更喜欢免费/开源,但如果解决方案值得,我们很乐意支付合理的金额。 无论如何,支付24小时/天的支持合同是必须的。
  7. 整个事情必须在我们的数据中心托管,因此像Amazon SimpleDB这样的SaaS产品超出了范围。 如果没有其他选择,我们只考虑这个。
  8. 理想情况下,解决方案将严格一致 (如CAP); 但是, 最终的一致性可以被视为一种选择。

提前感谢任何想法。

看看Hazelcast 。 它是纯Java,开源(Apache许可证)高度可扩展的内存数据网格产品。 它确实提供7X24支持。 它确实解决了我试图在下面解释每个问题的所有问题:

  1. 它有一个本机Java客户端。
  2. 它是100%动态的。 动态添加和删除节点。 无需改变任何东西。
  3. 一切都是动态的。
  4. 您可以配置备份节点数。
  5. Hazelcast支持持久性。
  6. Hazelcast提供的所有内容都是免费的(开源),它确实提供企业级支持。
  7. Hazelcast是单个jar文件。 超级好用。 只需将jar添加到类路径中即可。 看看主页面中的屏幕投射。
  8. Hazelcast严格一致。 你永远不能读取过时的数据。

我建议你使用基于Redisson – Redis的内存数据网格来实现Java。 在BloomFilter实现( BitSetBloomFilterSetSortedSetMapConcurrentMapListQueueDequeBlockingQueueBlockingDequeReadWriteLockSemaphoreLockAtomicLongCountDownLatchPublish / SubscribeRemoteServiceExecutorServiceLiveObjectServiceSchedulerService )服务器! 它支持主/从,前哨和集群服务器模式。 还支持自动集群/标记服务器拓扑发现。 这个lib是免费的开源软件。

借助AWS Elasticache支持,完美地在云中运行

根据你的喜好,我肯定会跟随其他人建议Hazelcast,如果你是从CAP定理到AP,但如果你需要CP,我会选择Redis

您可能想要查看特定于Java的解决方案,例如Coherence: http : //www.oracle.com/global/ru/products/middleware/coherence/index.html

但是,我认为这样的解决方案过于复杂,而且更喜欢使用像memcached这样的解决方案。 为您的目的而memcached的一大缺点是它似乎缺乏记录锁定,并且没有内置的方法来复制数据以进行故障转移。 这就是为什么我会研究键值数据存储。 他们中的许多人将完全满足您的需求。

以下是可以帮助您完成任务的键值数据存储列表: http : //www.metabrew.com/article/anti-rdbms-a-list-of-distributed-key-value-stores只需选择一个你满意的。

看一下Terracotta的JVM集群,它是OpenSource;)它没有API,而它在JVM级别工作效率很高,当你将值存储在一个复制对象中时,它会被发送到所有其他节点。 即使是锁定,所有这些工作都是透明的,无需添加任何新代码。

我正在做一个类似的项目,而是针对.NET平台。 除了已经提到的解决方案,我认为你应该看看ScaleOut StateServer和Alachisoft NCache 。 我担心这些替代品都不便宜,但根据我的判断,它们比商业解决方案的开源更安全。

  1. 两者都提供了Java客户端API,尽管我只使用过.NET API。
  2. StateServer具有自我发现的新缓存节点,NCache有一个管理控制台,可以添加新的缓存节点。
  3. 两者都应该能够无缝地处理故障转移。
  4. StateServer可以有1或2个被动的数据副本。 NCache具有更多缓存拓扑可供选择。
  5. 如果您指的是两者都可用的数据库的直写/后写。
  6. 我不知道你打算使用多少缓存服务器,但这里有完整的价格规格: ScaleOut StateServer Alachisoft NCache
  7. 两者都在您的服务器上本地安装和配置,并且都具有GUI管理。
  8. 我不确定究竟是什么严格一致,所以我会留给你调查..

总的来说,如果您想跳过配置缓存集群中的每个细节,StateServer是最佳选择,而NCache具有很多function和缓存拓扑可供选择。

根据数据对客户端的行为(如果从同一客户端多次读取数据),最好将客户端上的本地缓存与群集中的分布式缓存混合(适用于NCache和StateServer) , 只是一个想法。

指定的用例似乎适合Netflix的Hollow 。 这是一个只读的复制缓存,具有单个生产者和多个使用者。

你有没有想过使用像rabbitmq这样的标准消息传递解决方案? RabbitMQ是AMQP协议的开源实现。

您的应用程序似乎或多或少像发布/订阅系统。 Publisher节点是进行处理并将消息(已处理的数据)放入服务器的队列中的节点。 订阅者可以通过各种方式从服务器获取消息。 AMQP将消息的生产者和消费者分离,并且在如何将双方结合起来方面非常灵活。

    Interesting Posts