我正在寻找一个符合以下条件的数据库:
- 可能是非持久性的
- DB的几乎所有密钥都需要在3-6小时内更新一次(100M+密钥,总大小为100Gb)
- 能够按键(或主键)快速选择数据
- 这需要是一个DBMS(所以LevelDB不适合)
- 当写入数据时,DB集群必须能够为查询提供服务(不过单个节点可能会被阻塞)
- 不在内存中–我们的数据集将超过RAM限制
- 水平扩展和复制
- 支持所有数据的完全重写(MongoDB删除数据后不清空空间)
- C#和Java支持
以下是我使用此类数据库的过程:我们有一个分析集群,每4-6小时生成100M记录(50GB)的数据。数据是一个"键数组[20]"。这些数据需要通过前端系统以每秒1-10k个请求的速率分发给用户。平均而言,只有约15%的数据被请求,当生成下一个数据集时,其余数据将在4-6小时内重写。
我尝试过的:
- MongoDB。数据存储开销、高碎片整理成本
- 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可能也能很好地工作。