是否有类似Redis DB的东西,但不受RAM大小的限制



我正在寻找一个符合以下条件的数据库:

  • 可能是非持久性的
  • DB的几乎所有密钥都需要在3-6小时内更新一次(100M+密钥,总大小为100Gb)
  • 能够按键(或主键)快速选择数据
  • 这需要是一个DBMS(所以LevelDB不适合)
  • 当写入数据时,DB集群必须能够为查询提供服务(不过单个节点可能会被阻塞)
  • 不在内存中–我们的数据集将超过RAM限制
  • 水平扩展和复制
  • 支持所有数据的完全重写(MongoDB删除数据后不清空空间)
  • C#和Java支持

以下是我使用此类数据库的过程:我们有一个分析集群,每4-6小时生成100M记录(50GB)的数据。数据是一个"键数组[20]"。这些数据需要通过前端系统以每秒1-10k个请求的速率分发给用户。平均而言,只有约15%的数据被请求,当生成下一个数据集时,其余数据将在4-6小时内重写。

我尝试过的:

  1. MongoDB。数据存储开销、高碎片整理成本
  2. Redis。看起来很完美,但内存有限,我们的数据超过了它

所以问题是:有没有类似Redis的东西,但不受RAM大小的限制?

是的,Redis有两种替代方案,它们不受RAM大小的限制,同时与Redis协议保持兼容:

Ardb(C++),复制(主-从/主-主):https://github.com/yinqiwen/ardb

redis协议兼容的持久存储服务器,支持LevelDB/JotoCabinet/LMDB作为存储引擎。

Edis(Erlang):https://github.com/cbd/edis

Edis是Redis的协议兼容服务器替代品,编写于二郎。Edis的目标是在以下情况下取代Redis持久性比将数据集保存在内存中更重要。Edis(目前)使用谷歌的leveldb作为后端。

为了完整起见,这里是另一个数据结构数据库:

Hyperdex(字符串、整数、浮点、列表、集合、映射):http://hyperdex.org/doc/latest/DataTypes/#chap:data-类型

HyperDex是:

  • 快速:HyperDex具有更低的延迟、更高的吞吐量和更低的成本与其他键值存储相比的差异
  • 可扩展:HyperDex可扩展为系统中增加了更多的机器
  • 一致:HyperDex保证基于密钥的操作的线性化。因此,读取总是返回插入系统的最新值。不仅仅是"最终"立即且始终
  • 容错:HyperDex自动在多台机器上复制数据,以便并发故障达到应用程序确定的限制,不会导致数据丢失。可搜索:
  • HyperDex能够高效查找辅助数据属性
  • 易于使用:HyperDex为各种脚本和本机语言
  • 自我维护:HyperDex自我维护并且几乎不需要用户维护

是,SSDB(https://github.com/ideawu/ssdb),它有与Redis非常相似的API:http://www.ideawu.com/ssdb/docs/php/

SSDB支持hash、zset。它使用leveldb作为存储引擎,大部分数据存储在磁盘上,RAM用于缓存。在我们的300GB数据的SSDB实例上,它只使用800MB RAM。

现在,您可以很容易地找到RAM超过100 GB的服务器来托管一个实例,或者您可以分割数据并使用几个RAM较少的服务器。用Redis(在RAM中)存储100 GB并不是一个真正的问题。

现在,如果你真的想尝试一个不受RAM大小限制的Redis的出血边缘克隆,有NDS(Matt Palmer):

  • http://www.anchor.com.au/blog/2013/04/redis-rethought-exciting-extremes-with-larger-than-memory-datasets/

  • https://github.com/mpalmer/redis/tree/nds-2.6

请注意,NDS的存储后端已从Kyoto Cabinet转移到LMDB(这是一个非常好的包,也为OpenLDAP提供了支持),这正是因为删除密钥后的空间回收问题。

其他与Redis不兼容的解决方案也可能适合您的需求:例如,Couchbase和Aerospike可以轻松支持您的吞吐量。如果你有足够的节点,Cassandra和Riak可能也能很好地工作。

最新更新