分布式数据库,许多轻负载节点

3
我正在从事一个涉及相当CPU密集计算的兴趣项目。问题很明显是 embarrassingly parallel 的。这个计算需要在大量节点上进行(比如1000-10000)。每个节点几乎可以完全独立于其他节点地完成自己的工作。然而,整个系统需要回答来自系统外部的查询。大约每秒将需要回答 100000 次此类查询。为了回答这些查询,系统需要一些状态,有时会在两个节点之间共享。节点的计算最多需要 128MB RAM。
显然,我可能无法承担实际建造上述规模的系统,但我仍然对其工程挑战感兴趣,并想设置少数节点作为概念验证。
我正在考虑使用类似Cassandra和CouchDB的东西,在所有节点上具有可扩展的持久状态。如果我在每个节点上运行分布式数据库服务器,它将负载非常轻,但从运维的角度来看,让所有节点都相同非常好。
现在我的问题是:
有人能推荐一个分布式数据库实现,适合用于大量节点的集群,每个节点都只有很少的RAM吗?
Cassandra似乎能够满足我的需求,但http://wiki.apache.org/cassandra/CassandraHardware建议每个节点至少推荐4G RAM。
我没有找到CouchDB的内存需求,但考虑到它是用Erlang实现的,也许不会那么糟糕?
无论如何,欢迎提供建议、提示、意见!

你已经描述了你的CPU需求,但没有描述你的数据需求。数据是否足够大,需要将其分布在一千个节点上?每个节点需要多少数据?你的计算是否需要大量数据,以至于必须在与数据相同的节点上运行计算?查询是否需要访问存储在磁盘上的数据,还是由计算结果提供查询服务?数据、查询和计算之间的关系是什么? - sbridges
谢谢您的评论。问题是,数据非常少。系统中存储的数据总量约为100兆字节。不将其存储在单个中央节点的唯一原因是该数据的交易次数有点过高,单个服务器无法处理它。 - avl_sweden
数据有多频繁更改?谁更改数据?数据更改后节点需要多快看到更改?一致性要求是什么? - sbridges
有100万条记录,每条记录最坏情况下大约每分钟更改一次。数据是由从外部访问系统的客户进行非常昂贵的计算而更改的。当数据更改时,下一个访问(可能在一秒钟内)必须看到新数据。一致性很简单,所有记录都是独立的。 - avl_sweden
3个回答

1

你应该可以使用Cassandra来完成这个任务,但是根据你的可靠性要求,像Redis这样的内存数据库可能更合适。

由于数据集非常小(100 MB的数据),每个节点应该能够以少于4GB的RAM运行。添加Cassandra开销后,您可能需要200MB的RAM用于memtable,另外200MB的RAM用于行缓存(为了缓存整个数据集,请关闭键缓存),再加上500MB的RAM用于Java本身,这意味着您可以使用2GB的RAM来运行每台机器。

使用三个副本因子,您可能只需要一个由10多个节点组成的集群来提供所需的读/写数量(特别是因为您的数据集非常小,所有读取都可以从行缓存中提供)。如果您需要1000多个节点的计算能力,请让它们与存储数据的10多个Cassandra节点通信,而不是尝试将Cassandra分割为在1000多个节点上运行。


我认为你是对的,我提出的设计相当愚蠢 - 拥有10个高效利用的服务器要比拥有几乎没有负载的1000个节点好得多。 - avl_sweden

1

我自己没有使用过CouchDB,但听说在大约500K个记录的情况下,Couch只需要256M即可运行。猜测每个节点可能需要~512M的内存,考虑到它们计算所需的额外128M。最终,您应该在VPS中下载并测试每个节点,但听起来Couch比Cassandra需要更少的内存。


0

好的,在发布问题后,我又做了一些阅读和尝试,最终决定使用MongoDB。

到目前为止,我很满意。我的负载非常小,MongoDB使用的系统资源也非常少(最多200MB)。然而,我的数据集远远没有问题描述中那么大,我只运行了1个节点,所以这并没有什么意义。

CouchDB似乎不支持开箱即用的分片,因此不适合解决问题描述中的问题(我知道有分片的插件)。


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