40 votes

MongoDB vs. Redis vs. Cassandra pour une solution de stockage en ligne temporaire à écriture rapide

Je construis un système qui surveille et vérifie les impressions publicitaires et les clics. Cela signifie qu'il y a beaucoup de commandes d'insertion (moyenne d'environ 90 / seconde, atteignant un maximum de 250) et quelques opérations de lecture, mais l'accent est mis sur la performance et sa rapidité.

Le système est actuellement sur MongoDB, mais j'ai été introduit à Cassandra et Redis depuis lors. Serait-ce une bonne idée de choisir l'une de ces deux solutions plutôt que de rester sur MongoDB? Pourquoi ou pourquoi pas?

Je vous remercie

31voto

Skrylar Points 420

Pour une solution de récolte de ce genre, je vous recommande un multi-étape de l'approche. Redis est bon à la communication en temps réel. Redis est conçu comme une mémoire de la clé/valeur en magasin et hérite de quelques très belles avantages d'être une mémoire de base de données: O(1) la liste des opérations. Tant qu'il y est de la RAM pour une utilisation sur un serveur, Redis ne sera pas ralentir en le poussant vers la fin de vos listes de ce qui est bien quand vous avez besoin d'insérer des éléments à un taux extrême. Malheureusement, Redis peut pas fonctionner avec des ensembles de données plus grande que la quantité de RAM que vous avez (il n' écrit sur le disque, la lecture est de redémarrer le serveur ou dans le cas d'une panne du système) et de mise à l'échelle doit être fait par vous et votre application. (Une façon courante est de répandre les touches sur de nombreux serveurs, ce qui est mis en œuvre par certains Redis pilotes en particulier ceux pour Ruby on Rails.) Redis dispose également d'un support pour la simple publication/abonnement par messagerie, ce qui peut être utile à la fois.

Dans ce scénario, Redis est "la première étape." Pour chaque type spécifique d'événement vous créer une liste dans le Redis avec un nom unique; par exemple, nous avons des "pages vues" et "lien cliqué." Pour des raisons de simplicité nous voulons nous assurer que les données dans chaque liste est la même structure; lien cliqué peut avoir un jeton d'utilisateur, nom du lien et l'URL, alors que l'affichage de la page ne peut avoir le token de l'utilisateur et l'URL. Votre première préoccupation est le fait qu'il s'est passé et quel que soit absolument nécessaire les données dont vous avez besoin est poussé.

Ensuite, nous avons quelques exemples simples de traitement des travailleurs qui prennent ce frénétiquement inséré les informations sur le Redis mains, en lui demandant d'enlever un élément de la fin de la liste et de le remettre. Le travailleur peut faire des ajustements/déduplication/ID recherches nécessaires pour produire les données et de les remettre pour une base plus permanente, le site de stockage. Le feu jusqu'à que beaucoup de ces travailleurs que vous avez besoin de garder Redis " mémoire de la charge supportable. Vous pouvez écrire les travailleurs dans tout ce que vous souhaitez (Node.js, C#, Java, ...), tant qu'il a un Redis pilote (la plupart des langages web faire maintenant) et un pour votre stockage souhaité (SQL, Mongo, etc.)

MongoDB est bonne à la de stockage de document. Contrairement Redis il est en mesure de traiter avec les bases de données de plus de RAM et il prend en charge la fragmentation/réplication sur son propre. Un avantage de MongoDB sur SQL options, c'est que vous n'avez pas à avoir un schéma prédéterminé, vous êtes libre de changer la façon dont les données sont stockées toutefois vous souhaitez à tout moment.

Je voudrais, cependant, suggèrent Redis ou Mongo pour la "première étape" de la phase de tenue des données pour le traitement et l'utilisation traditionnelle de l'installation de SQL (Postgresql ou MSSQL, peut-être) pour stocker de post-traitement des données. Le suivi du comportement des clients sonne comme données relationnelles pour moi, puisque vous pouvez aller sur "montre-moi tout le monde qui regarde cette page" ou "Combien de pages cette personne a vue à ce jour donné" ou "Ce jour-là avait le plus de spectateurs au total?". Il existe peut-être encore plus complexes, des jointures ou des requêtes pour des fins analytiques, vous venez avec, et mature SQL solutions peut faire beaucoup de ce filtrage pour vous; NoSQL (Mongo ou Redis en particulier) ne peut pas faire des jointures ou des requêtes complexes dans les divers ensembles de données.

22voto

Gates VP Points 26481

Je travaille actuellement pour un très grand réseau d'annonces et de nous écrire dans des fichiers plats :)

Personnellement, je suis un Mongo fan, mais franchement, Redis et Cassandra sont peu susceptibles d'effectuer soit meilleur ou pour le pire. Je veux dire, tout ce que vous avez à faire est de jeter des choses dans la mémoire, puis rinçage à disque à l'arrière-plan (à la fois Mongo et Redis ce faire).

Si vous êtes à la recherche pour une vitesse incroyable, l'autre option est de garder plusieurs impressions dans la mémoire locale, puis rincer à disque à chaque minute. Bien sûr, c'est fondamentalement ce que les Mongo et Redis faire pour vous. Pas une vraie raison impérieuse pour se déplacer.

12voto

Data Monk Points 859

Tous les trois solutions (quatre si vous comptez plat de fichiers) vous donnera ultra-rapide écrit. Le non-relationnelles (nosql), des solutions vous donnera réglage de la tolérance de pannes ainsi que pour les fins de reprise après sinistre.

En termes d'échelle, de notre environnement de test, avec seulement trois MongoDB nœuds, peut gérer 2-3k mixte de transactions par seconde. À 8 nœuds, nous pouvons nous occuper de 12k-15k mixte de transactions par seconde. Cassandra pouvez mettre à l'échelle encore plus grande. 250 lit est (ou devrait être) pas de problème.

La question la plus importante est, que voulez-vous faire avec ces données? Reporting opérationnel? L'analyse de série chronologique? Ad-hoc d'analyse de motif? reporting en temps réel?

MongoDB est une bonne option si vous voulez que la capacité de faire des analyses ad-hoc basée sur de multiples attributs au sein d'une collection. Vous pouvez mettre jusqu'à 40 index sur une collection, bien que les indices seront stockées en mémoire, afin de regarder pour la taille. Mais le résultat est un flexible de solution analytique.

Cassandra est une valeur-clé magasin. Vous définissez un statique de la colonne ou un ensemble de colonnes qui agira à titre de principal de l'index droit devant. Toutes les requêtes exécutées sur Cassandra doit être à l'écoute de cet indice. Vous pouvez mettre un secondaire sur elle, mais c'est de savoir comme il va. Vous pouvez, bien sûr, l'utilisation de MapReduce pour analyser le magasin pour les non-clé de l'attribution, mais il sera juste que: une série de balayage à travers le magasin. Cassandra n'ont pas la notion de "like" ou regex opérations sur les nœuds de serveur. Si vous voulez trouver tous les clients dans le cas où le premier nom commence par "Alex", vous devrez scanner l'intégralité de la collection, tirez le premier nom pour chaque entrée et le lancer à travers un côté client regex.

Je ne suis pas assez familier avec le Redis à parler de façon intelligente à ce sujet. Désolé.

Si vous sont l'évaluation non-relationnelle des plates-formes, vous pouvez également envisager de CouchDB et Riak.

Espérons que cette aide.

9voto

drdaeman Points 3312

Juste trouvé ceci: http://blog.axant.it/archives/236

Citant la partie la plus intéressante:

Ce deuxième graphique est sur le Redis RPUSH vs Mongo $PUSH vs Mongo insérer, et je trouve ce graphe pour être vraiment intéressant. Jusqu'à 5000 entrées mongodb $push est plus rapide même lorsque comparé à Redis RPUSH, puis elle est devenue incroyablement lent, probablement la mongodb type tableau a insertion linéaire du temps et il devient donc de plus en plus lent. mongodb peut gagner un peu de performances en exposant une constante de temps d'insertion de type liste, mais même avec le temps linéaire de la matrice de type (qui peut garantir la constante de temps de recherche), il a ses applications pour de petits ensembles de données.

Je suppose que tout dépend, au moins sur le type de données et le volume. Meilleur conseil serait de référence sur votre jeu de données et de voir vous-même.

3voto

Ben Hughes Points 1220

Si vous avez le choix (et devez vous éloigner des fies plates), j'irais avec Redis. Sa rapidité fulgurante permettra de gérer confortablement la charge dont vous parlez, mais plus important encore, vous n'aurez pas à gérer le code de rinçage / IO. Je comprends sa très simple mais moins de code à gérer est mieux que plus.

Vous obtiendrez également des options de redimensionnement horizontal avec Redis que vous ne pouvez pas obtenir avec la mise en cache basée sur les fichiers.

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