Node.js最快,非基于内存的多进程键值存储

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

我需要存储简单的键值string/string对(不是文档或JSON,只是string)。
这里有一些例子(其中会有数百万):

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

我努力了:

  • Redis :它真的很快,可以满足我所需要的一切,但是却消耗了太多的内存。
  • LevelDB :在RAM上它速度快而且不重,但只有单进程。

LevelDB的解决方法是多级的 ,通过HTTP公开单个LevelDB进程。
但是这当然是有代价的。 我需要快点。

有没有关键价值的商店:

  • 支持Node.js或具有绑定;
  • 存储string/string对;
  • 支持多个进程;
  • 不完全驻留在内存中;
  • 快吗?

我只在乎阅读。 快速的多进程阅读是必要的,但不能写。
我对LevelDB的当前速度感到满意,而不是单一进程的事实。


额外细节:

  • 我正在谈论大约五千万个键/值对,键和值在8到500个字符之间。
  • 代码将运行在一个普通的Linux服务器上。
  • 内存使用量应该限制在几千兆字节(4GB是好的,8GB是可以接受的)
  • 阅读的方式不仅仅是写作, 其实,我可以不写文章。
  • 速度比任何事情都重要(考虑到内存和多进程约束)。

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

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

您可以尝试ssdb ,一个基于leveldb构build的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一样快,而且它是为持久存储而devise的。 lmdb @ didier-spezia提到的是获取小数据的速度非常快,但是设置一个很慢。

据说FaceBook的RocksDB速度很快(特别是在SSD存储上),还有其他的如LMDB(已经提到)和WiredTiger

你提到Redis – 如果你想使用Redis API,但是将上面的Key / Value数据库之一作为存储而不是RAM,那么我知道有两个项目(虽然没有testing过): LedisDB用Go编写)和ardb (用C ++编写)。

我最近开始testing看起来像一个非常有前途的,虽然还不太知道(虽然我敢肯定会改变)的关键值数据库库名为CuttDB 。 它具有非常快的性能,能够处理HDD上的大量数据。 它甚至包括一个Memcached服务器接口。

你要碰到的问题是,“快如闪电”和磁盘不混合,尤其是如果你有一个键值系统的随机读取读取。 您需要尽可能多地将数据存入内存,因为从内存中读取比从磁盘中读取要快得多。

是你想要最小化内存的原因,因为这将是一个embedded式数据库? 如果是这样,你可能想看看皇后 – http://www.empress.com 。 已经在几个项目中使用它,你可以configuration多less加载。 但是,它得到了一个RDBMS的开销,所以不能确定它会像你想的那样精简。

你也可以考虑MySQL与Memcache插件。 这使您可以将MySQL用作关键值存储。 由于您跳过了SQL层处理,因此比常规MySQL快得多。 而且,在MySQL中,您可以转动旋钮以播放多less内存。

火鸟是另一个低内存使用情况数据库 – http://www.firebirdnews.org/docs/fb2min.html

无论如何,希望这有助于。 没有一个更深入的解释你的需求(这是embedded式的,为什么需要节省内存,如果内存是宝贵的,你考虑低内存消耗,你需要酸,冗余,你认为闪电快等),其很难提供更多的分析。

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

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

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

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

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

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