web-dev-qa-db-fra.com

Magasin de valeurs-clés multi-processus le plus rapide, sans mémoire, pour Node.js

Quel est le magasin de valeurs-clés sans mémoire le plus rapide pour Node.js prenant en charge plusieurs processus?

J'ai besoin de stocker de simples paires chaîne/chaîne clé-valeur (pas des documents ou JSON, juste des chaînes).
Voici quelques exemples (il y en aurait des millions):

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

J'ai essayé:

  • Redis: c'est vraiment rapide et fait tout ce dont j'ai besoin, mais consomme trop de RAM.
  • LevelDB: c'est rapide et pas trop lourd sur la RAM, mais seulement en un seul processus.

Une solution de contournement pour LevelDB est multinivea , qui expose un seul processus LevelDB via HTTP.
Mais cela a bien sûr un prix; J'ai besoin de quelque chose de rapide.

Existe-t-il un magasin de valeurs-clés qui:

  • prend en charge Node.js ou a des liaisons pour cela;
  • stocke des paires chaîne/chaîne;
  • prend en charge plusieurs processus;
  • ne réside pas entièrement dans la mémoire;
  • est rapide?

Je me soucie seulement de la lecture. Une lecture multi-processus rapide est nécessaire, mais pas une écriture.
Je suis satisfait de la vitesse actuelle de LevelDB, mais pas du fait qu'il s'agit d'un processus unique.


Détails supplémentaires:

  • Je parle d'environ 50 millions de paires clé/valeur, avec des clés et des valeurs comprises entre 8 et 500 caractères.
  • Le code s'exécutera sur un serveur Linux standard.
  • L'utilisation de la mémoire doit être limitée à quelques gigaoctets (4 Go, c'est bien, 8 Go est acceptable)
  • La lecture se fera bien plus que l'écriture; en fait, je pourrais faire sans écrire.
  • La vitesse est plus importante que tout (la mémoire et la contrainte multi-processus sont respectées).
28
Ruben Verborgh

Je suggère de jeter un œil à LMDB (qui est le moteur le plus efficace pour OpenLDAP, et utilisé dans un certain nombre d'autres projets open source).

LMDB est un magasin de clés/valeurs intégré, avec une API de type Berkeley-DB ou LevelDB, n'a pas à tout stocker en mémoire et peut prendre en charge l'accès à partir de plusieurs processus. Il existe des liaisons Node.js:

24
Didier Spezia

Vous pouvez essayer ssdb, une base de données compatible avec le protocole redis construite sur leveldb.

https://github.com/ideawu/ssdb

Vous pouvez utiliser le node-redis client, bien que certaines commandes puissent varier.

repères :

                  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

Comme vous pouvez le voir, ssdb est presque aussi rapide que redis, et il est conçu pour un stockage persistant. lmdb @ didier-spezia mentionné est ultra rapide pour obtenir de petites données, mais en définir un est lent.

7
Polor Beer

Il y a RocksDB de FaceBook qui est censé être rapide (en particulier sur le stockage SSD), et il y en a aussi d'autres comme LMDB (déjà mentionné) et WiredTiger

Vous avez mentionné Redis - Si vous souhaitez utiliser l'API Redis mais avoir l'une des bases de données de clés/valeurs ci-dessus comme stockage au lieu de votre RAM, il y a deux projets que je connais (bien que je ne les ai pas testés): - LedisDB (écrit en Go) et ardb (écrit en C++).

J'ai récemment commencé à tester ce qui semble être une bibliothèque de base de données de valeurs clés très prometteuse mais encore moins connue (mais je suis sûr que cela va changer) nommée CuttDB . Il a des performances très rapides et est conçu pour gérer de grandes quantités de données sur le disque dur. Il comprend même une interface serveur Memcached.

3
Amnon

Le problème que vous allez rencontrer est que "la vitesse de l'éclair" et le disque ne se mélangent pas, surtout si vous avez des lectures à accès aléatoire comme vous le faites dans un système de valeurs-clés. Vous devez mettre autant de données en mémoire que possible, car la lecture depuis la mémoire est beaucoup plus rapide que la lecture depuis le disque.

Est-ce la raison pour laquelle vous souhaitez minimiser la mémoire car ce sera une base de données intégrée? Si oui, vous voudrez peut-être regarder Empress - http://www.empress.com . L'avez utilisé dans quelques projets et vous pouvez configurer la quantité chargée. Cependant, il a les frais généraux d'un SGBDR, donc pas sûr qu'il sera aussi léger que vous le souhaitez.

Vous pouvez également envisager MySQL avec l'addon Memcache. Cela vous permet d'utiliser MySQL comme magasin de valeurs clés. Beaucoup plus rapide que MySQL standard car vous ignorez le traitement de la couche SQL. De plus, avec MySQL, vous pouvez tourner les boutons pour jouer avec la quantité de mémoire utilisée.

Firebird est une autre base de données à faible utilisation de mémoire - http://www.firebirdnews.org/docs/fb2min.html .

Quoi qu'il en soit, j'espère que cela vous aidera. Sans une explication plus approfondie de vos besoins (est-ce intégré, pourquoi le besoin d'économiser de la mémoire et si la mémoire est précieuse qu'est-ce que vous considérez comme une faible consommation de mémoire, avez-vous besoin d'acide, de redondance, que considérez-vous comme l'éclair rapide, etc.) difficile de fournir plus d'une analyse.

2
AlexGad

Pourquoi n'utilisez-vous pas MySQL (ou MariaDB) avec la réplication maître-esclave. En fonction de vos besoins. L'architecture maître-esclave de MySql est adaptée à vous.

Fondamentalement, NoSQL a besoin de beaucoup de serveurs. Par exemple, le paramètre minimal de MongoDB nécessite trois serveurs, HBase a besoin de quatre serveurs.

Dans ce point de vue, si vous avez besoin de plus de lisibilité, ajoutez un nouveau serveur esclave sur l'architecture mysql.

Nous supposons que les performances de lecture de mysql sont de 2k tps. Ensuite, les quatre nœuds des performances de lecture de mysql sont de 8k tps.

Cela dépend du résultat de votre test et de l'utilisation du service (rapport lecture/écriture).

vérifier le lien ci-dessous, c'est "Marco Cecconi - L'architecture de StackOverflow". http://www.youtube.com/watch?v=t6kM2EM6so4

1
kris.jeong