web-dev-qa-db-ja.com

Node.js用の最速の非メモリベースのマルチプロセスKey-Valueストア

複数のプロセスをサポートするNode.jsの最速の非メモリKey-Valueストアは何ですか?

単純なキーと値の文字列/文字列のペア(ドキュメントやJSONではなく、文字列のみ)を保存する必要があります。
ここにいくつかの例があります(それらの数百万があるでしょう):

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

私が試してみました:

  • Redis:本当に高速で、必要なすべてを実行しますが、RAMを大量に消費します。
  • LevelDB:高速で、RAMに負荷がかかりすぎず、単一プロセスのみです。

LevelDBの回避策は multilevel で、HTTPを介して単一のLevelDBプロセスを公開します。
しかし、もちろんそれは代償を伴います。速いものが必要です。

次のようなKey-Valueストアがありますか?

  • node.jsをサポートするか、Node.jsにバインドします。
  • 文字列/文字列のペアを格納します。
  • 複数のプロセスをサポートします。
  • 完全にメモリに常駐しているわけではありません。
  • 速い?

私は読書だけに関心があります。高速のマルチプロセス読み取りが必要ですが、書き込みは必要ありません。
私はLevelDBの現在の速度に満足しています。それが単一プロセスであるという事実だけではありません。


追加の詳細:

  • 8から500文字のキーと値を含む、約5,000万のキーと値のペアについて話しています。
  • コードは通常のLinuxサーバーで実行されます。
  • メモリ使用量は数ギガバイトに制限する必要があります(4 GBで十分ですが、8 GBでも問題ありません)。
  • 読むことは書くことよりもずっと多く起こるでしょう。実際に、私は書くことなくできました。
  • 速度は何よりも重要です(所定のメモリとマルチプロセス制約が尊重されます)。
28
Ruben Verborgh

[〜#〜] lmdb [〜#〜] を確認することをお勧めします(これはOpenLDAPの最も効率的なエンジンであり、他の多くのオープンソースプロジェクトで使用されています)。

LMDBは、組み込みのキー/値ストアであり、Berkeley-DBまたはLevelDBのようなAPIを備えており、すべてをメモリに格納する必要がなく、複数のプロセスからのアクセスをサポートできます。 Node.jsバインディングがあります。

24
Didier Spezia

Leveldb上に構築されたredisプロトコル互換データベースであるssdbを試すことができます。

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は、小さなデータを取得するのに超高速ですが、設定が遅いです。

7
Polor Beer

FaceBookの RocksDB は高速(特にSSDストレージ)であることが想定されており、他にもLMDB(前述)や WiredTiger などがあります。

あなたはRedisについて言及しました-Redis APIを使用したいが、RAMの代わりに上記のキー/値データベースの1つをストレージとして持っている場合、私が知っている2つのプロジェクトがあります(それらをテストしていません):- LedisDB (Goで記述)および ardb (C++で記述)。

CuttDB という名前のキー値データベースライブラリはあまり知られていませんが、あまり知られていない(変更されると確信しています)もののテストを最近開始しました。それは非常に高速なパフォーマンスを持ち、HDD上の大量のデータを処理するように構築されています。 Memcachedサーバーインターフェイスも含まれています。

3
Amnon

あなたが遭遇しようとしている問題は、「値が非常に速い」ことと、特にキー値システムで行うようにランダムアクセス読み取りがある場合、ディスクが混在しないことです。メモリからの読み取りはディスクからの読み取りよりもはるかに高速であるため、できるだけ多くのデータをメモリに取り込む必要があります。

これは組み込みデータベースになるため、メモリを最小限にしたいのはなぜですか?その場合は、Empress- http://www.empress.com を参照してください。いくつかのプロジェクトでそれを使用しており、ロードする量を構成できます。ただし、RDBMSのオーバーヘッドが発生するため、希望どおりにリーンになるかどうかはわかりません。

また、MemcacheアドオンでMySQLを検討することもできます。これにより、MySQLをキー値ストアとして使用できます。 SQLレイヤーの処理をスキップするため、通常のMySQLよりもはるかに高速です。また、MySQLを使用すると、ノブを回してメモリの使用量を試すことができます。

Firebirdは、メモリ使用量の少ないもう1つのdb- http://www.firebirdnews.org/docs/fb2min.html です。

とにかく、これが役に立てば幸いです。ニーズの詳細な説明なし(これは埋め込まれているのに、なぜメモリを節約する必要があるのか​​、そしてメモリが貴重である場合、メモリ消費量が少ないと思うのは何ですか?より多くの分析を提供することは困難です。

2
AlexGad

MySQL(またはMariaDB)をマスター/スレーブレプリケーションで使用してみませんか。要件に基づきます。 MySqlのマスタースレーブアーキテクチャが適しています。

基本的に、NoSQLには多くのサーバーが必要です。たとえば、MongoDBの最小設定には3つのサーバーが必要で、HBaseには4つのサーバーが必要です。

この観点から、より読みやすくする必要がある場合は、mysqlアーキテクチャに新しいスレーブサーバーを追加します。

Mysqlの読み取りパフォーマンスは2k tpsであると想定しています。次に、mysqlの読み取りパフォーマンスの4つのノードは8k tpsです。

テスト結果とサービスの使用状況(読み取り/書き込み比率)によって異なります。

「Marco Cecconi-The StackOverflowのアーキテクチャ」というリンクを確認してください。 http://www.youtube.com/watch?v=t6kM2EM6so4

1
kris.jeong