30

支持多进程的 Node.js 最快的非内存键值存储是什么?

我需要存储简单的键值字符串/字符串对(不是文档或 JSON,只是字符串)。
以下是一些示例(将有数百万个示例):

  • 12345678 – abcdefghijklmnopabcdefghijklmnop
  • 86358098 – ahijklmnopbcdefgahijklmnopbcdefg
  • abcdefghijklmnopabcdefghijklmnop - 12345678
  • ahijklmnopbcdefgahijklmnopbcdefg - 86358098

我努力了:

  • Redis:它非常快,可以满足我的所有需求,但会消耗太多 RAM。
  • LevelDB:它速度快而且在 RAM 上不太重,但只有单进程。

LevelDB 的一种解决方法是multilevel,它通过 HTTP 公开单个 LevelDB 进程。
但这当然是有代价的。我需要快速的东西。

是否有任何键值存储:

  • 支持 Node.js 或为其绑定;
  • 存储字符串/字符串对;
  • 支持多进程;
  • 不完全驻留在内存中;
  • 快吗?

我只关心阅读。快速多进程读取是必要的,但不是写入。
我对 LevelDB 目前的速度很满意,只是不满意它是单进程的。


额外细节:

  • 我说的是大约 5000 万个键/值对,键和值在 8 到 500 个字符之间。
  • 代码将在常规 Linux 服务器上运行。
  • 内存使用量应限制在几 GB(4GB 很好,8GB 可以接受)
  • 阅读将比写作更多。实际上,我可以不写。
  • 速度比什么都重要(考虑到内存和多进程约束)。
4

5 回答 5

27

我建议看看LMDB(它是 OpenLDAP 最有效的引擎,并在许多其他开源项目中使用)。

LMDB 是一种嵌入式键/值存储,具有 Berkeley-DB 或 LevelDB 之类的 API,不必将所有内容存储在内存中,并且可以支持来自多个进程的访问。有 Node.js 绑定:

于 2014-01-18T19:20:24.507 回答
8

你可以试试ssdb,一个基于 leveldb 构建的 redis 协议兼容数据库。

https://github.com/ideawu/ssdb

您可以使用现有的node-redis客户端,但某些命令可能会有所不同。

基准

                  Redis (100.000x)
      13,540 op/s ⨠ set small
      13,289 op/s ⨠ set medium
      13,279 op/s ⨠ set large
      13,651 op/s ⨠ get large
      13,681 op/s ⨠ get medium
      14,428 op/s ⨠ get small

                  SSDB (100.000x)
      12,252 op/s ⨠ set small
      11,824 op/s ⨠ set medium
      11,720 op/s ⨠ set large
      13,810 op/s ⨠ get large
      13,593 op/s ⨠ get medium
      12,696 op/s ⨠ get small


                  lmdb (100.000x)
       4,616 op/s ⨠ set small
      11,104 op/s ⨠ set medium
      17,283 op/s ⨠ set large
      13,778 op/s ⨠ get large
      16,002 op/s ⨠ get medium
      50,562 op/s ⨠ get small

                  multilevel (100.000x)
       6,124 op/s ⨠ set small
       5,900 op/s ⨠ set medium
       5,944 op/s ⨠ set large
       6,215 op/s ⨠ get large
       6,125 op/s ⨠ get medium
       6,310 op/s ⨠ get small

如你所见,ssdb它几乎和 redis 一样快,而且它是为持久存储而设计的。lmdb@didier-spezia 提到对于获取小数据来说是超快的,但设置一个很慢。

于 2014-02-27T02:10:21.087 回答
4

FaceBook 的RocksDB应该很快(尤其是在 SSD 存储上),还有其他的,例如 LMDB(已经提到过)和WiredTiger

您提到了 Redis - 如果您想使用 Redis API 但将上述键/值数据库之一作为存储而不是 RAM,我知道有两个项目(尽管尚未测试):LedisDB(用 Go 编写)和ardb(用 C++ 编写)。

我最近开始测试一个名为CuttDB的键值数据库库,它看起来非常有前途,但鲜为人知(尽管我确信这会改变)。它具有非常快的性能,可以处理 HDD 上的大量数据。它甚至包括一个 Memcached 服务器接口。

于 2015-05-25T11:19:00.020 回答
3

您将遇到的问题是“闪电般快速”和磁盘不会混合,特别是如果您像在键值系统中那样进行随机访问读取。您需要将尽可能多的数据放入内存,因为从内存读取比从磁盘读取要快很多。

您想要最小化内存的原因是因为这将是一个嵌入式数据库吗?如果是这样,您可能想查看 Empress - http://www.empress.com。已经在几个项目中使用过它,您可以配置加载多少。但是,它具有 RDBMS 的开销,因此不确定它是否会像您想要的那样精简。

您也可以考虑使用带有 Memcache 插件的 MySQL。这允许您使用 MySQL 作为键值存储。由于您跳过了 SQL 层处理,因此比常规 MySQL 快得多。此外,使用 MySQL,您可以转动旋钮来调整使用了多少内存。

Firebird 是另一个低内存使用数据库 - http://www.firebirdnews.org/docs/fb2min.html

无论如何,希望这会有所帮助。如果没有更深入地解释您的需求(这是嵌入式的,为什么需要节省内存,如果内存很宝贵,您认为低内存消耗是什么,您是否需要酸、冗余、您认为快如闪电等)它的很难提供更多的分析。

于 2014-01-18T16:16:13.013 回答
2

为什么不将 MySQL(或 MariaDB)与主从复制一起使用。根据您的要求。MySql 的主从架构很适合你。

基本上,NoSQL 需要大量的服务器。例如,MongoDB 的最小设置需要三台服务器,HBase 需要四台服务器。

从这个角度来看,如果你需要更多的可读性,那么在 mysql 架构上添加一个新的从服务器。

我们假设mysql的读取性能是2k tps。那么mysql的四个节点的读取性能是8k tps。

这取决于您的测试结果和服务使用情况(读/写比率)。

检查下面的链接,即“Marco Cecconi - StackOverflow 的架构”。 http://www.youtube.com/watch?v=t6kM2EM6so4

于 2014-01-20T05:26:51.920 回答