使用 MongoDB 的分片键值存储

Chr*_*row 5 nosql mongodb

想建立一个跨多台机器分片的键值存储。

我们目前正在使用 MongoDB,是否有理由不将 MongoDB 用于此目的?

我们也使用 Redis,但是对于这个用例,我们想使用硬盘驱动器并且 Redis 仅在 RAM 中。

Bri*_*ski 7

不将 MongoDB 用作纯键值存储的原因有很多,也有一些原因可以考虑。Mongo 被优化为文档存储——它为文档中的所有字段编制索引,并为 JSON 对象和层次结构提供丰富的原语。您可以将其用作键值存储,但单线程性质意味着您不会从硬件中获得良好的性能。存储简单的 blob 消除了 Mongo 的许多好处。Mongo 具有在您插入时拆分数据块的算法,这可能会造成延迟。Monogo 的重新分区系统也很麻烦。键值系统的好处是它应该非常简单且非常快速,因此您可以扩展并降低服务器和管理成本。

其他系统更适合键值使用。你说Redis是最好的key-value存储之一,但是Redis中的repartitioning/clustering还是alpha级别,对DRAM有要求。有些人在 Redis 上构建自己的分片层和分区层——这在一些较大的中国社交网络中非常普遍。

Cassandra 有时用作键值存储。这不是 Cassandra 的最佳用途,因为 Cassandra 的“超级列族”提供了丰富的索引。Cassandra 没有像 Redis 和 Mongo 这样用 C 编写的数据库那么快,但确实具有强大的集群能力。

在这方面您应该强烈考虑的一家商店是 Aerospike。Aerospike 具有非常灵活的集群管理 - 只需启动即可添加单个节点 - 以及对 DRAM 和 SSD/Flash 的支持 - 以及易于复制的 HA。需要大量关键值存储的广告平台公司正在以非常高的规模使用它。Aerospike 有一个免费版本,支持节点大小到 200G。

CoucheBase(以前是 MemBase)是另一个用于查看键值使用的系统。它提供了一些聚类原语,并且更多地关注内存中的使用。