web-dev-qa-db-fra.com

Choisir Mongodb / Couchdb / Ravendb - Conseils de performance et d'évolutivité

Nous examinons une solution de stockage de DB DB avec l'échec sur la clustering, pour une application intensive de lecture/écriture.

Nous aurons une moyenne de 40 000 écritures simultanées par seconde écrites à la DB (avec le pic peut aller jusqu'à 70 000 pendant) - et peut avoir autour de presque similiar nombre de lectures.

Nous avons également besoin d'un mécanisme pour la DB pour en informer sur les enregistrements nouvellement écrits (une sorte de déclenchement au niveau de DB).

Quelle sera une bonne option en termes de choix approprié de DB DB et de planification de la capacité connexe?

mise à jour

Plus de détails sur l'attente.

  • En moyenne, nous nous attendons à 40 000 (40k) nombre d'inserts (nouveaux documents) par seconde sur 3-4 bases de données/collections de documents.
  • Le pic peut aller jusqu'à 120 000 (120k) inserts
  • Les inserts doivent être lisibles tout de suite - presque réel
  • Avec cela, nous attendons environ 5000 mises à jour ou supprimées par seconde
  • Parallèlement à cela, nous nous attendons également à 500-600 requêtes simultanées d'accès aux données. Ces requêtes et ces plans d'exécution sont quelque peu connus, bien que cela puisse être mis à jour, comme par exemple, une fois par semaine environ.
  • Le système doit prendre en charge la clustering de basculement sur le côté de stockage
44
amazedsaint

si "20 000 écrires simultanément" signifie des insertions, j'irais pour Couchdb et j'utiliserais une API "_changes" pour les déclencheurs. Mais avec 20.000 écrit, vous auriez besoin d'un rayon stable ASWELL. Ensuite, vous feriez mieux de regarder BigCouch

Et si "20.000" Les écrires simultanés consistent à "principalement" mettre à jour pour Mongodb, car sa "mise à jour en place" est assez géniale. Mais vous devriez alors gérer les déclencheurs manuellement, mais utiliser une autre collection pour mettre à jour en place un document général peut être une solution pratique. Faites de nouveau attention à la fâche.

Enfin, je pense que vous ne pouvez pas sélectionner une base de données avec simplement une simultanéité, vous devez planifier l'API (comment récupérer des données) puis rechercher des options à la main.

8
frail

Je recommanderais mongodb. Mes conditions n'étaient pas aussi élevées que la vôtre, mais c'était raisonnablement proche. En supposant que vous utilisiez C #, je recommande le pilote C # officiel MongoDB C # et le inserbatch Méthode avec Safemode activé. Il va littéralement écrire des données aussi rapidement que votre système de fichiers peut gérer. Quelques réserves:

  1. MongoDB fait pas Travaux de support (au moins la dernière fois que j'ai vérifié).
  2. MongoDB met au point initialement les données sur RAM avant de la synchroniser sur le disque. Si vous avez besoin de besoins en temps réel avec durabilité, vous pouvez définir FSYNC plus bas. Cela aura une performance significative.
  3. Le pilote C # est un peu bonky. Je ne sais pas si c'est juste moi, mais je reçois des erreurs étranges chaque fois que j'essaie d'exécuter des opérations de course longues avec elle. Le pilote C++ est beaucoup mieux et réellement plus rapide que le pilote C # (ou tout autre pilote de cette affaire).

Cela étant dit, je recommanderais également de regarder dans Ravendb. Il soutient tout ce que vous recherchez mais pour la vie de moi, je ne pouvais pas le faire jouer n'importe où près de Mongo.

La seule autre base de données proches de Mongodb était Riak . Son backend de bitcask par défaut est ridiculement rapide tant que vous avez suffisamment de mémoire pour stocker le clavier, mais que je le rappelle que cela ne prend pas en charge les déclencheurs.

6
Rahul Ravindran

Mémbase (et le serveur CouchBase Server publié de bientôt disponible) répondront facilement à vos besoins et fourniront une évolutivité dynamique (Ajout ou supprimer des nœuds), la réplication avec le basculement. La couche de mise en cache memmatique sur le dessus gérera facilement 200K ops/s, et vous pouvez réduire linéairement avec de multiples nœuds pour prendre en charge l'obtention des données persistantes sur le disque.

Nous avons des points de repère récents montrant une latence extrêmement faible (qui équivaut à peu près à un débit élevé): http://10gigabitethernet.typepad.com/network_stack/2011/09/couchbase-goes-faster-with-penonload. html

Je ne sais pas à quel point il est important que vous ayez un produit de classe d'entreprise soutenu avec des ressources d'ingénierie et d'assurance qualité derrière celle-ci, mais c'est également disponible.

EDIT: Vous avez oublié de mentionner qu'il existe déjà une interface de déclenchement intégrée et nous l'étends encore plus loin à suivre lorsque les données frappent le disque (persisté) ou sont répliquées.

Poiré

4
Perry krug
  • Nous examinons une solution de stockage de DB DB avec l'échec sur la clustering, pour une application intensive de lecture/écriture

Riak avec le backend de niveaudb de Google [Voici un Benchmark génial de Google], étant donné suffisamment de cache et de disques solides est très rapide. Selon une structure du document, et sa taille (vous avez mentionné 2 Ko), vous devrez-vous comparer bien sûr. [N'oubliez pas que si vous êtes capable de fumer vos données (Business Wise), vous n'avez pas à gérer le débit 40K/S sur un seul noeud]

Un autre avantage avec levetdb est la compression de données => Stockage. Si le stockage n'est pas un problème, vous pouvez désactiver la compression, auquel cas SBIDDB volerait littéralement.

RIAK AVEC DES INDICIES SECONDAIRES Vous permet de vous apporter des structures de données telles que vous le souhaitez => Vous n'exposez que les champs que vous vous souciez de la recherche.

Succès et sans douleur Fail Over est le deuxième nom de Riak. Cela brille vraiment ici.

  • Nous avons également besoin d'un mécanisme pour la DB pour en informer sur les enregistrements nouvellement écrits (une sorte de déclenchement au niveau de DB)

Vous pouvez compter sur pre-commit et post-commit hooks À Riak pour atteindre ce comportement, mais à nouveau, comme tout déclenche, il vient avec le prix => performance/maintenabilité.

  • Les inserts doivent être lisibles tout de suite - presque réel

Riak écrit sur le disque (pas de surprises asynchrones mongodb) => reliably readable tout de suite. Si vous auriez besoin d'une meilleure consistance, vous pouvez configurer le quorum de Riak pour les insertions: par exemple. combien de nœuds devraient revenir avant que l'insert soit traité comme réussi

En général, si fault tolerance/concurrency/fail over/scalability est important pour vous, j'irais avec les magasins de données écrits à Erlang, car Erlang résout avec succès ces problèmes pendant de nombreuses années.

2
tolitius