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

24

我有一个任务,需要构建一个高度可扩展的分布式共享内存(DSM)应用程序的原型。该原型只用作概念验证,但是我希望通过选择将在实际解决方案中使用的组件来最有效地利用时间。

该解决方案的目标是从外部源获取数据输入,对其进行加工处理,并使结果可用于多个前端。这些“前端”只需从缓存中获取数据并提供服务,无需进行额外处理。这些数据的前端访问量可以达到每秒数百万次。

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

我正在研究像 memcached 这样的解决方案,然而这个特定的解决方案没有满足我们列出的所有要求,这些要求如下:

  1. 该解决方案必须至少具有Java客户端API,而且应该得到合理的维护,因为应用的其余部分是用Java编写的,而且我们是经验丰富的Java开发人员;
  2. 该解决方案必须完全弹性可扩展:应该可以添加新节点,而无需重新启动集群中的其他节点;
  3. 该解决方案必须能够处理故障转移。是的,我意识到这意味着一些额外开销,但是总体提供的数据量不大(最多1G),因此这不应该是问题。通过“故障转移”,我指的是在节点崩溃时,客户端执行无缝操作而无需硬编码/更改服务器IP地址,就像在memcached客户端中一样;
  4. 理想情况下,应该可以指定数据重叠的程度(例如,在DSM集群中存储相同数据的副本数量);
  5. 没有必要永久存储所有数据,但可能需要对其中一些数据进行后处理(例如将其序列化到数据库中)。
  6. 价格。显然,我们更喜欢免费/开源软件,但如果解决方案具有足够的价值,我们也愿意支付合理的费用。无论如何,必须提供付费 24 小时/天的支持合同。
  7. 整个系统必须托管在我们的数据中心,因此像 Amazon SimpleDB 这样的 SaaS 服务不在考虑范围之内。除非没有其他选择,否则我们才会考虑此选项。
  8. 理想情况下,解决方案应该是严格一致的(即 CAP);但是,可以将最终一致性视为一种选择。

提前感谢任何意见。

8个回答

28

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

  1. 它有一个本地Java客户端。
  2. 它是100%动态的。可以动态添加和删除节点,无需更改任何内容。
  3. 再次,所有内容都是动态的。
  4. 您可以配置备份节点的数量。
  5. Hazelcast支持持久性。
  6. Hazelcast所提供的一切都是免费(开源),并且提供企业级支持。
  7. Hazelcast是单个JAR文件。超级易于使用。只需将jar添加到类路径中即可。请查看主页上的屏幕截图。
  8. Hazelcast是严格一致的。 您永远不会读取陈旧的数据。

Hazelcast看起来是个不错的选择,Fuad :) - anar khalilov
很好,具体的回答,Fuad (+1)。然而,我认为Hazelcast是AP +最终一致的(http://code.google.com/p/hazelcast/wiki/FAQ)。 - DaveFar
1
好的,我在https://groups.google.com/forum/#!topic/hazelcast/UK6E-iKdHS0找到了你写的细节,Fuad。那是一个很好的解释,但我认为你上面的声明“Hazelcast是严格一致的”有点过于简化了... - DaveFar
Fuad,你能提供什么保证,证明Hazelcast是严格一致的吗? - Derek Mahar
Hazelcast将如何解决https://jepsen.io/analyses/hazelcast-3-8-3报告中提到的严重问题? - Derek Mahar
显示剩余5条评论

5
我建议您使用Redisson - 基于Redis的Java内存数据网格。实现了(BitSetBloomFilterSetSortedSetMapConcurrentMapListQueueDequeBlockingQueueBlockingDequeReadWriteLockSemaphoreLockAtomicLongCountDownLatchPublish / SubscribeRemoteServiceExecutorServiceLiveObjectServiceSchedulerService),在Redis服务器上运行!它支持主/从、哨兵和集群服务器模式。还支持自动发现集群/哨兵服务器拓扑。此库是免费且开源的。

由于AWS Elasticache支持,完美地在云中工作。


3

根据您的喜好,如果您偏向于CAP定理中的AP,我肯定会像其他人建议的那样选择Hazelcast;但是如果您需要CP,则我会选择Redis


2
看一下Terracotta的JVM集群,它是开源的;) 它没有API,但在JVM级别上工作效率高,当您将值存储在复制的对象中时,它会发送到所有其他节点。 即使锁定等操作也可以透明地进行,而不需要添加任何新代码。

2
您可能想要查看针对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。只需选择您感觉舒适的一个即可。

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

2
我正在进行一个类似的项目,但是目标平台是.NET。除了已经提到的解决方案之外,我认为你应该看一下ScaleOut StateServerAlachisoft 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则具有非常多的功能和可供选择的缓存拓扑结构。

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

谢谢Herber,我一定会看看这些提供的内容。这个项目已经暂停了一段时间,但我保证在选择时会“接受答案”。目前Hazelcast似乎是最好的选择,主要是因为它与Java的本地性。我会继续通知你的。 - mindas
我能看到使用已经在你的组织中使用的解决方案的好处。祝你的项目好运,如果需要更多帮助,请告诉我。 - robertherber

0

你考虑过使用像rabbitmq这样的标准消息解决方案吗? RabbitMQ是AMQP协议的开源实现。

你的应用程序看起来更像是一个发布/订阅系统。 发布者节点是执行处理并将消息(处理后的数据)放入服务器队列的节点。 订阅者可以以多种方式从服务器获取消息。AMQP将消息的生产者和消费者解耦,并且在如何组合这两个方面上非常灵活。


这是一个有趣的方法,但是这些消息解决方案能否在未确定的时间内保留消息呢?我有印象消息框架只关心消息是否被传递,对吧?而这里我们有可能会或者不会改变的数据,订阅者应该仍然能够在几个小时后检索到它。此外,相反的情况也是必要的 - 这些消息解决方案是否支持数据刷新,就像大多数 DSMs一样? - mindas
如果我没记错的话,在rabbitmq中队列也可以是持久化的,这意味着消息会被保存在磁盘上,并且它们对于崩溃是安全的。第一件想到的清除方法是有专门的消费者只负责这个任务:等待消息通知清理,然后刷新所有队列并写入新数据。我已经有一段时间没有阅读规范了,所以可能有更好的解决方案。 - filippo
恐怕与磁盘相关的任何操作都不可行,因为我需要最小延迟。此外,我怀疑rabbitmq是否允许我像基于映射的DSM那样进行O(1)任意查找。但无论如何,感谢您的建议! - mindas
RabbitMQ不适合此目的,但它不需要磁盘访问。 - user177800

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接