754 votes

MongoDB et Cassandra

Je suis en train d'évaluer ce qui pourrait être la meilleure option de migration.

Actuellement, je suis sur un MySQL sharded (partition horizontale), avec la plupart de mes données stockées dans des blobs JSON. Je n'ai pas de requêtes SQL complexes (déjà migrées depuis que j'ai partitionné mon db).

Pour l'instant, il semble que MongoDB et Cassandra soient des options probables. Ma situation :

  • Beaucoup de lectures dans chaque requête, moins d'écritures régulières
  • Pas d'inquiétude quant à l'évolutivité "massive".
  • Plus préoccupé par la simplicité de la configuration, de la maintenance et du code
  • Minimiser le coût du matériel/serveur

5 votes

Des statistiques officielles sur les performances sont disponibles. Cassandra vs MongoDB vs HBase

1 votes

>Beaucoup de lectures dans chaque requête, moins d'écritures régulières => Recherchez CQRS (séparez vos lectures de vos écritures probablement sans event sourcing mais vérifiez si vous pouvez mettre à jour votre modèle de lecture de manière asynchrone la synchronisation peut aussi fonctionner cela dépend de vos cas d'utilisation)

4 votes

C'est une excellente question en fait. Je me demande s'il existe une version actualisée de cette question ? Celle-ci est très ancienne maintenant

592voto

Michael Points 4166

Beaucoup de lectures dans chaque requête, moins d'écritures régulières

Les deux bases de données obtiennent de bons résultats lors des lectures où l'ensemble de données chaudes tient en mémoire. Elles mettent également l'accent sur les modèles de données sans jointure (et encouragent plutôt la dénormalisation) et fournissent toutes deux des index sur les éléments suivants documents o rangées bien que les index de MongoDB soient actuellement plus flexibles.

Le moteur de stockage de Cassandra assure des écritures en temps constant, quelle que soit la taille de votre ensemble de données. Les écritures sont plus problématiques dans MongoDB, en partie à cause du moteur de stockage basé sur les b-trees, mais surtout à cause de l'utilisation de l'outil de gestion des données. verrouillage multi-granularité il le fait.

Pour l'analyse, MongoDB fournit une implémentation map/reduce personnalisée ; Cassandra fournit un support Hadoop natif, notamment pour Ruche (un entrepôt de données SQL construit sur Hadoop map/reduce) et Cochon (un langage d'analyse spécifique à Hadoop, dont beaucoup pensent qu'il est mieux adapté aux charges de travail de type map/reduce que SQL). Cassandra prend également en charge l'utilisation de Étincelle .

Pas d'inquiétude quant à l'évolutivité "massive".

Si vous envisagez un seul serveur, MongoDB est probablement plus adapté. Pour ceux qui sont plus préoccupés par l'évolutivité, l'architecture sans point de défaillance unique de Cassandra sera plus facile à mettre en place et plus fiable. (Cassandra offre également un meilleur contrôle sur le fonctionnement de la réplication, notamment la prise en charge de plusieurs centres de données.

Plus préoccupé par la simplicité de la configuration, de la maintenance et du code

Les deux sont faciles à configurer, avec des valeurs par défaut raisonnables pour un seul serveur. Cassandra est plus simple à mettre en place dans une configuration multi-serveur car il n'y a pas de nœuds à rôle spécial à prendre en compte.

Si vous utilisez actuellement des blobs JSON, MongoDB convient parfaitement à votre cas d'utilisation, étant donné qu'il utilise BSON pour stocker les données. Vous pourrez disposer de données plus riches et plus faciles à interroger que dans votre base de données actuelle. Ce serait la victoire la plus importante pour Mongo.

0 votes

Que voulez-vous dire par "domaines respectifs" - les considérez-vous comme des types distincts ? Merci pour vos réponses !

89 votes

Totalement différent, un commentaire n'est pas assez gros, mais ... Cassandra est un hybride dynamo/google bigtable linéairement scalable (lectures et écritures amorties en temps constant) qui permet des écritures rapides quelle que soit la taille des données. Son ensemble de fonctionnalités est minimaliste, ne dépassant guère celui d'un magasin de clés et de valeurs ordonnées. MongoDB est un magasin de documents très riche en fonctionnalités (et rapide) au prix de la durabilité et des garanties de persistance des écritures (puisqu'elles ne sont pas immédiatement écrites sur le disque). Ce sont des bêtes différentes avec des philosophies différentes, MongoDB est plus proche d'un remplacement de SGBDR ...

28 votes

Cassandra est d'un niveau inférieur mais permet une mise à l'échelle exceptionnelle (voir Twitter/Digg/Facebook), mais vous devrez faire preuve de discernement dans la manière dont vous disposez vos données, construisez des index secondaires, etc. car aucune requête flexible n'est autorisée.

147voto

Richard K. Points 1025

J'ai utilisé MongoDB de manière intensive (au cours des 6 derniers mois), en construisant un système de gestion de données hiérarchiques, et je peux me porter garant à la fois de la facilité de configuration (installez-le, exécutez-le, utilisez-le !) et de la vitesse. Tant que vous pensez aux index avec soin, il peut absolument hurler, en termes de vitesse.

J'en déduis que Cassandra, en raison de son utilisation dans des projets à grande échelle comme Twitter, dispose d'une meilleure fonctionnalité de mise à l'échelle, bien que l'équipe MongoDB travaille sur la parité dans ce domaine. Je dois préciser que je n'ai pas utilisé Cassandra au-delà de la phase d'essai et que je ne peux donc pas me prononcer sur les détails.

Pour moi, lorsque nous avons évalué les bases de données NoSQL, le vrai changement a été l'interrogation - Cassandra est essentiellement un magasin clé/valeur géant, et l'interrogation est un peu compliquée (du moins par rapport à MongoDB), donc pour obtenir des performances, vous devez dupliquer un grand nombre de données comme une sorte d'index manuel. MongoDB, quant à lui, utilise un modèle de "requête par exemple".

Par exemple, disons que vous avez une collection (l'équivalent d'une table RDMS en langage MongoDB) contenant des utilisateurs. MongoDB stocke les enregistrements sous forme de documents, qui sont en fait des objets binaires JSON, par exemple

{
   FirstName: "John",
   LastName: "Smith",
   Email: "john@smith.com",
   Groups: ["Admin", "User", "SuperUser"]
}

Si vous voulez trouver tous les utilisateurs appelés Smith qui ont des droits d'administration, il vous suffit de créer un nouveau document (dans la console d'administration en utilisant Javascript, ou en production en utilisant le langage de votre choix) :

{
   LastName: "Smith",
   Groups: "Admin"
}

...et ensuite exécuter la requête. C'est tout. Il existe des opérateurs supplémentaires pour les comparaisons, le filtrage RegEx, etc., mais tout cela est assez simple, et la documentation basée sur le Wiki est assez bonne.

54 votes

Mise à jour (8 août 2011) : Le centre de données EC2 d'Amazon Irlande a connu un incident lié à la foudre la nuit dernière, et en procédant à la récupération de nos serveurs, j'ai découvert un point assez crucial : si vous avez un ensemble de réplication de deux serveurs (et ils sont faciles à configurer), assurez-vous que vous avez un nœud Arbitre, de sorte que si l'un tombe en panne, l'autre ne panique pas et se bloque en mode secondaire ! Croyez-moi, c'est une douleur dans le derrière à régler avec une grande base de données.

8 votes

Pour ajouter ce que @Richard K a dit, vous devriez avoir un nœud arbitre lorsque vous avez un nombre pair de nœuds (primaire+secondaire) dans un ensemble de répliques.

0 votes

En outre, envisagez de recourir à mongodb lorsque l'analyse des données nécessite davantage d'agrégation.

118voto

Pourquoi choisir entre une base de données traditionnelle et un magasin de données NoSQL ? Utilisez les deux ! Le problème des solutions NoSQL (au-delà de la courbe d'apprentissage initiale) est l'absence de transactions. Vous effectuez toutes les mises à jour sur MySQL et faites en sorte que MySQL alimente un magasin de données NoSQL pour les lectures ; vous bénéficiez ainsi des points forts de chaque technologie. Cela ajoute de la complexité, mais vous avez déjà le côté MySQL - il suffit d'ajouter MongoDB, Cassandra, etc. au mélange.

Les datastores NoSQL évoluent généralement bien mieux qu'une base de données traditionnelle pour les mêmes spécifications. Ce n'est pas pour rien que Facebook, Twitter, Google et la plupart des start-ups utilisent des solutions NoSQL. Il n'y a pas que les geeks qui se défoulent sur les nouvelles technologies.

8 votes

Je suis tout à fait d'accord. J'utilise mongodb + mysql dans l'un des prochains produits dont je suis l'architecte. Il s'agit d'un produit financier en nuage. mysql est utilisé lorsque nous avons absolument besoin de capacités transactionnelles. mongodb est utilisé pour stocker des structures de données complexes non informatiques qui ont juste besoin d'être extraites lorsque c'est nécessaire. cela fonctionne bien jusqu'à présent.)

0 votes

J'ai également utilisé cette double approche dans la plupart de mes projets, et dans certains autres, le système de fichiers monté NFS a été utilisé conjointement avec PostgreSQL pour des blobs sismiques approchant 1 Go dans certains cas. Un chemin est une sorte d'interrogation de la base de données des valeurs clés.

1 votes

Voici un lien vers une question que j'ai posée sur la façon d'architecturer les bases de données sql et nosql : dba.stackexchange.com/questions/102053/ J'aurais besoin de vos conseils

60voto

Kostja Points 405

Je vais probablement faire figure d'intrus, mais je pense que vous devez rester sur MySQL. Vous n'avez pas décrit de réel problème à résoudre, et MySQL/InnoDB est un excellent back-end de stockage, même pour les données blob/json.

Une astuce courante chez les ingénieurs Web consiste à essayer d'utiliser davantage de NoSQL dès que l'on se rend compte que toutes les fonctionnalités d'un SGBDR ne sont pas utilisées. Ce n'est pas une bonne raison en soi, car la plupart des bases de données NoSQL ont des moteurs de données (ce que MySQL appelle un moteur de stockage) plutôt médiocres.

Maintenant, si vous n'êtes pas de ce genre, alors s'il vous plaît spécifiez ce qui est manquant dans MySQL et que vous recherchez dans une autre base de données (comme l'auto-sharding, le basculement automatique, la réplication multi-maître, une garantie de cohérence des données plus faible dans le cluster se traduisant par un débit d'écriture plus élevé, etc.)

13 votes

Il utilise le sharding, ce qui signifie que ses données sont partitionnées manuellement entre les serveurs. Mongodb peut automatiser le sharding, ce qui peut être un avantage.

18 votes

Il stocke également la plupart des blobs JSON dans le SGBDR, ce qui rend la conception relationnelle (fonctionnalités) inutile.

4 votes

Le modèle de données et le sharding automatique sont effectivement différents, mais lorsque vous choisissez une base de données, vous devez tenir compte du moteur de stockage. premièrement et le reste des cloches et des sifflets en second lieu. Comment le moteur de stockage va-t-il se comporter en cas de pic de charge ? Comment la fonction de sauvegarde automatique va-t-elle se comporter lors d'un pic d'afflux de données ? Avant de confier le contrôle de ces aspects importants à la base de données, il est préférable de s'assurer qu'elle sera capable d'assumer cette tâche.

20voto

dalton Points 2456

Je n'ai pas utilisé Cassandra, mais j'ai utilisé MongoDB et je pense que c'est génial.

Si vous recherchez une installation simple, c'est ce qu'il vous faut : Il vous suffit de dérégler MongoDB et de lancer le démon mongod et c'est tout... c'est en marche.

Bien sûr, ce n'est qu'un début, mais pour commencer, c'est facile.

24 votes

AFAIK, la même chose s'applique à Cassandra également. Décompressez, exécutez le démon. Le cluster de test est configuré et prêt pour la production !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X