24

我的任务是为可大规模扩展的分布式共享内存 (DSM) 应用程序构建原型。原型仅用作概念验证,但我想通过挑选稍后将在实际解决方案中使用的组件来最有效地度过我的时间。

该解决方案的目的是从外部源获取数据输入,将其搅动并使结果可用于多个前端。这些“前端”只会从缓存中获取数据并提供服务,而无需额外处理。对这些数据的前端点击量实际上可以达到每秒数百万。

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

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

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

提前感谢您的任何想法。

4

8 回答 8

27

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

  1. 它有一个本地 Java 客户端。
  2. 它是 100% 动态的。动态添加和删除节点。无需更改任何内容。
  3. 同样,一切都是动态的。
  4. 您可以配置备份节点的数量。
  5. Hazelcast 支持持久性。
  6. Hazelcast 提供的一切都是免费的(开源),并且确实提供企业级支持。
  7. Hazelcast 是单个 jar 文件。超级好用。只需将 jar 添加到您的类路径中。看看主页中的屏幕投射。
  8. Hazelcast 是严格一致的。您永远无法读取过时的数据。
于 2010-06-17T13:33:05.713 回答
5

我建议您使用Redisson - 基于 Redis 的 Java 内存数据网格。在Redis服务器上实现 ( BitSet, BloomFilter, Set, SortedSet, Map, ConcurrentMap, List, Queue, Deque, BlockingQueue, BlockingDeque, ReadWriteLock, Semaphore, Lock, AtomicLong, CountDownLatch, Publish / Subscribe, RemoteService, ExecutorService, LiveObjectService, SchedulerService) !它支持主/从、哨兵和集群服务器模式。还支持自动集群/哨兵服务器拓扑发现。这个库是免费和开源的。

得益于 AWS Elasticache 支持,在云中完美运行

于 2015-08-05T15:08:54.537 回答
3

根据您的喜好,如果您从 CAP 定理朝向 AP,我肯定会建议 Hazelcast,但如果您需要 CP,我会选择Redis

于 2011-09-11T17:22:59.790 回答
2

看看 Terracotta 的 JVM 集群,它是开源的 ;) 它没有 API,但它在 JVM 级别有效,当您将值存储在复制对象中时,它会发送到所有其他节点。甚至锁定和所有这些事情都是透明的,无需添加任何新代码。

于 2010-06-15T13:00:58.670 回答
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 只需选择一个你觉得舒服。

于 2010-06-15T13:01:23.100 回答
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 都可用)混合使用可能是个好主意, 只是一个想法。

于 2010-06-28T21:23:39.423 回答
2

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

于 2017-09-05T00:51:19.563 回答
0

您是否对使用像rabbitmq这样的标准消息传递解决方案感到困难?RabbitMQ 是AMQP 协议的开源实现。

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

于 2010-06-15T14:37:39.607 回答