44

I'm looking for a database matching these criteria:

  • May be non-persistent;
  • Almost all keys of DB need to be updated once in 3-6 hours (100M+ keys with total size of 100Gb)
  • Ability to quickly select data by key (or Primary Key)
  • This needs to be a DBMS (so LevelDB doesn't fit)
  • When data is written, DB cluster must be able to serve queries (single nodes can be blocked though)
  • Not in-memory – our dataset will exceed the RAM limits
  • Horizontal scaling and replication
  • Support full rewrite of all data (MongoDB doesn't clear space after deleting data)
  • C# and Java support

Here's my process of working with such database: We've got an analytics cluster that produces 100M records (50GB) of data every 4-6 hours. The data is a "key - array[20]". This data needs to be distributed to users through a front-end system with a rate of 1-10k requests per second. In average, only ~15% of the data is requested, the rest of it will be rewritten in 4-6 hours when the next data set is generated.

What i tried:

  1. MongoDB. Datastorage overhead, high defragmentation costs.
  2. Redis. Looks perfect, but it's limited with RAM and our data exceeds it.

So the question is: is there anything like Redis, but not limited with RAM size?

4

3 回答 3

28

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

Ardb(C++)、复制(Master-Slave/Master-Master):https ://github.com/yinqiwen/ardb

一个redis-protocol兼容的持久化存储服务器,支持LevelDB/KyotoCabinet/LMDB作为存储引擎。

Edis(二郎):https ://github.com/cbd/edis

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

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

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

HyperDex 是:

  • 快速:与其他键值存储相比,HyperDex 具有更低的延迟、更高的吞吐量和更低的方差。
  • 可扩展性:HyperDex 可随着更多机器添加到系统而扩展。
  • 一致:HyperDex 保证了基于键的操作的线性化。因此,读取总是返回插入系统的最新值。不仅仅是“最终”,而是立即和永远。
  • 容错:HyperDex 自动在多台机器上复制数据,因此并发故障(达到应用程序确定的限制)不会导致数据丢失。可搜索:
  • HyperDex 支持高效查找辅助数据属性。
  • 易于使用:HyperDex 为各种脚本和本地语言提供 API。
  • 自我维护:HyperDex 是自我维护的,几乎不需要用户维护。
于 2013-08-27T08:28:45.310 回答
22

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

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

于 2013-08-28T13:19:01.880 回答
4

如今,您可以轻松找到 RAM 超过 100 GB 的服务器来托管单个实例,或者您可以对数据进行分片并使用 RAM 较少的多台服务器。使用 Redis(在 RAM 中)存储 100 GB 并不是真正的问题。

现在,如果您真的想尝试不受 RAM 大小限制的最新 Redis 克隆,那么可以使用 NDS(由 Matt Palmer 撰写):

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

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

于 2013-08-26T16:42:28.857 回答