Que dois-je choisir: MongoDB/Cassandra/Redis/CouchDB?
Nous sommes en train de développer un gros projet et je me demandais si quelqu'un peut me donner quelques conseils sur ce que DB backend devrions-nous choisir.
Notre système est composé par 1100 appareils électroniques qui envoient un signal à un serveur central, puis le serveur stocke les infos signal (le signal est d'environ 35 octets de long). Comment jamais, ces appareils seront envoyer environ 3 signaux par minute, donc si nous faisons de numéros, ce sera 4.752.000 de nouveaux records/jour sur la base de données, et un total de 142.560.000 de nouveaux records/mois.
Nous avons besoin d'un DB Backend qui est de l'éclairage rapide et fiable. Bien sûr, nous devons faire quelques complexes d'extraction de données sur la DB. Nous sommes en train de faire des recherches sur la MongoDB/Cassandra/Redis/CouchDB, toutefois, la documentation, les sites web sont toujours sur les premiers stades.
De l'aide? Des idées?
Merci beaucoup!
- Alors, quels sont vos critères de sélection? À quelle vitesse les db? Vous êtes à la recherche d'une fonctionnalité particulière? Cette question est très vague.
- Il est tout au sujet de la fiabilité, l'évolutivité et la vitesse. Il est très important que la solution s'adapte aisément (MongoDB autosharding?) juste en les jetant dans plus de nœuds, et la vitesse est également très important.
- Sont-ils liés? stackoverflow.com/questions/2892729/mongodb-vs-cassandra/...
- Qu'avez-vous, finalement, de décider et comment est-il travailler?
- Salut à tous, nous avons décidé d'aller avec Cassandra et c'est vraiment génial. Nous n'avons pas de plate-forme d'analyse comparative encore, mais les premiers tests montrent que Cassandra surpasse MySql (Environ 3000% plus rapide pour les écritures). Nous sommes à l'aide d'Aubaines pour parler à Cassandra et c'est vraiment une communauté active derrière elle (principalement Twitter), donc il n'y a pas des tonnes d'articles, mais les articles sont très utiles. Je vais vous laisser savoir comment cette fin.
- Un rapide google demande de m'amène à ceci: kkovacs.ue/cassandra-vs-mongodb-vs-couchdb-vs-redis qui peuvent être utiles dans votre cas et dans d'autres utilisateurs à la recherche de quelque chose de similaire.
- 142.560.000 par/mois n'est pas un très grand ensemble de données vraiment. vous pouvez même utiliser des SGBDR à cette fin.
Vous devez vous connecter pour publier un commentaire.
Ne laissez pas l'échelle spatiale (1000+ périphériques) vous induire en erreur pour le calcul et/ou de stockage de l'échelle. Quelques dizaines de 35 octets insère par seconde est trivial de la charge de travail pour tout intégrer SGBD, même en cours d'exécution sur les bas de gamme de matériel. De même, 142 millions d'enregistrements par mois est seulement de l'ordre de 1~10 go de stockage par mois, sans aucune compression, y compris les indices.
Dans votre question en commentaire, vous avez dit:
Fiabilité? Toute intégrer les SGBD peut le garantir (en supposant que tu veux dire que ça ne va pas corrompre vos données, et il ne va pas de crash--voir ma discussion de ce théorème CAP au bas de cette réponse). De vitesse? Même avec une seule machine, 10~100 fois cette charge de travail ne devrait pas être un problème. L'évolutivité? Au rythme actuel, une année complète de données, non compressé, même pleinement indexées, pourrait facilement s'adapter à l'intérieur de 100 giga-octets d'espace disque (de la même manière, nous avons déjà établi le taux d'insertion n'est pas un problème).
En tant que tel, je ne vois pas clairement la nécessité d'un exotique solution NoSQL, ou même une base de données distribuée--une plaine, vieux relationnel de la base de données comme MySQL serait très bien. Si vous êtes inquiet au sujet de basculement, il vous suffit de configurer un serveur de sauvegarde dans une configuration maître-esclave. Si nous parlons de 100 ou 1000 fois la gamme actuelle, seulement horizontalement partition de quelques cas en fonction de l'ID de la collecte de données de l'appareil (c'est à dire {partition d'index} = {device id} modulo {nombre de partitions}).
Garder à l'esprit qu'en quittant la sûre et confortable confins de la base de données relationnelle monde signifie l'abandon de ses deux de représentation du modèle et ses riche ensemble d'outils. Cela rendra vos complexes "datamining" beaucoup plus difficile--vous n'avez pas besoin juste de mettre des données dans la base de données, vous avez aussi besoin de sortir.
Tout cela étant dit, MongoDB et CouchDB sont incroyablement simple à déployer et à travailler avec. Ils sont aussi très amusant, et vous rendre plus attrayant pour n'importe quel nombre de personnes (et pas seulement les programmeurs--les cadres, aussi!).
La sagesse commune est que, de la les trois les solutions NoSQL vous l'avez suggéré, Cassandra est le meilleur pour la haute insérer volume (bien sûr, relativement parlant, je ne pense pas que vous ont haute insérer le volume--ceci a été conçu pour être utilisé par Facebook); c'est contré par être plus difficile à travailler. Donc, sauf si vous avez de drôles de conditions que vous n'avez pas parlé, je vous recommande contre elle, pour votre cas d'utilisation.
Si vous êtes positivement définie sur un NoSQL de déploiement, vous pourriez envisager le théorème CAP. Cela vous aidera à décider entre MongoDB et CouchDB. Voici un bon lien: http://blog.nahurst.com/visual-guide-to-nosql-systems. Tout se résume à ce que vous entendez par "fiabilité": MongoDB des métiers de la disponibilité pour des raisons de cohérence, alors que CouchDB des métiers de la cohérence de la disponibilité. (Cassandra vous permet de finesse ce compromis, par requête, en précisant le nombre de serveurs doit être écrit/lu pour écrire/lire pour réussir; mise à JOUR: Maintenant, donc peut CouchDB, avec BigCouch! Très excitant...)
Bonne chance dans votre projet.
Une grande partie de la réponse dépend de ce que vous voulez faire avec elle après qu'il a été recueilli. Stocker beaucoup de données est facile: il suffit de dumt dans les fichiers journaux, pas besoin d'une base de données. D'autre part, si vous souhaitez effectuer une analyse complexe et d'exploration de données, puis d'une base de données est utile.
La prochaine question est de savoir quel type d'analyse que vous allez faire. Ça va être effectuée sur un sous-ensemble de données qui a une propriété particulière, la dernière heure/jour/semaine/mois seulement, les données agrégées ou en quelque sorte pré-calculé? En d'autres termes: avez-vous besoin d'accéder à la base de données dans le formulaire, il est recueilli? Vous pouvez archiver des données quand il devient trop vieux pour être intéressant? Pouvez-vous regrouper les données et d'effectuer l'analyse sur l'agrégation?
Dans mon expérience de travail avec de la publicité google analytics (collecter des milliards de points de données sur les expositions à l'agrégation est la clé. Vous collectez des données brutes, de désinfecter et puis le mettre dans une base de données comme MongoDB, Cassandra ou encore MySQL qui vous permet de faire des mises à jour et des requêtes. Ensuite, vous périodiquement agréger les données et de les supprimer de la base de données (archivage des données brutes, vous pourriez en avoir besoin plus tard).
L'agrégation de la demande, en substance, à toutes les questions que vous voulez poser à propos des données, et l'enregistre dans une forme qui la rend facile à récupérer la réponse pour une question particulière. Dire que vous voulez savoir sur quel jour de la semaine a le plus de X. La naïveté de mise en œuvre de ce serait de garder tous les signaux enregistrés dans une immense table et faire une requête qui calcule la somme de toutes les lignes qui ont X. Comme le nombre de signaux recueillis cultiver cette requête va prendre de plus en plus longtemps. Aucun montant d'indexation, de fragmentation ou d'optimisation aidera avec cela. Au lieu de cela, chaque jour/heure/minute (selon la nature exacte de cas d'utilisation et vos besoins de reporting de l'être) vous regardez les nouveaux signaux que vous avez enregistré, et pour chaque X que vous incrémenter le compteur qui garde une trace de combien de X, il y avait un lundi, si c'est un lundi, le mardi, si c'est un mardi et ainsi de suite. De cette façon, vous pouvez plus tard récupérer le nombre pour chaque jour de la semaine et de les comparer. Vous faites cela pour toutes les questions que vous voulez être en mesure de répondre, et ensuite, vous enlevez les signaux de la base de données (mais encore une fois, garder les données brutes).
Le type de base de données que vous enregistrez les agrégats peut être le même que celui que vous stocker les signaux entrants, mais il n'a pas besoin d'être très chics. Il stocke les clés qui représentent une réponse particulière, et les valeurs qui sont habituellement seulement des chiffres.
Dans l'ancienne école d'entreposage de données parler de la base de données que vous stockez les signaux entrants en est appelé un traitement transactionnel en ligne (on-line transactional processing) et de la base de données que vous stockez les agrégats est appelé OLAP (on-line analytical processing). OLTP est optimisé pour l'insertion et l'OLAP est optimisé pour l'interrogation. Les termes sont vieux et lorsque les gens entendent eux, ils ont tendance à tout de suite penser SQL et starschemas et tout ça. Peut-être que je ne devriez pas les utiliser, mais ils sont pratiques conditions.
De toute façon, pour OLTP vous voulez quelque chose de rapide à l'insertion des données, mais aussi quelque chose qui prend en charge l'indexation des données et la recherche de choses. L'agrégation est grandement aidé par une base de données qui fait la moitié du travail de sommation et de trouver les maximums et minimums. J'aime vraiment MongoDB parce que c'est tellement facile à mettre en place et de travailler avec. Les données que je travail avec tend à être désordonné et pas tous les éléments ont le même ensemble de propriétés, de sorte que le pardon schemalessness de Mongo est une aubaine. D'autre part, vos données de sons beaucoup plus uniforme, de sorte que Mongo aurait peut-être pas vous donner autant d'avantages. Ne négligez pas les bonnes vieilles bases de données relationnelles juste pour le moment. Si vous allez faire beaucoup de sommation et ainsi de suite SQL est grande, qu'est ce que c'est construit pour.
Pour OLAP quelque chose de beaucoup plus simple œuvres, une valeur-clé magasin est tout ce dont vous avez besoin. J'utilise Redis parce qu'il est aussi très facile à travailler et à mettre en place. Il vous permet également de stocker plus de valeurs scalaires, ce qui est très pratique. Parfois, votre valeur est en fait une liste, ou une table de hachage, dans la plupart des clé-valeur les magasins, vous devez coder de telles valeurs, mais Redis qu'il gère en natif. L'inconvénient de Redis, c'est que vous ne pouvez pas faire des requêtes ("que de me donner toutes les lignes de cette valeur de Y"), vous devez tenir les indices pour vous-même vos données. D'autre part, vous n'aurez pas besoin d'indices très bien puisque les réponses à toutes vos questions ont été précalculées, tout ce que vous devez faire est de chercher la réponse par une clé qui est défini par la question. Pour la question ci-dessus, quel jour de la semaine a le plus de X vous cherchez le numéro de X à travailler lundi, mardi, etc. peut-être que vous avez stocké comme X:lundi, X:mardi, etc.
En conclusion: MongoDB et Redis fonctionne très bien pour moi. Je ne pense pas que MongoDB est très bon pour votre cas, je crois plutôt que vous avez réellement pourrait bénéficier de plus d'un traditionnel de base de données SQL (mais ça dépend, si vos données est très simple, vous pouvez peut-être utiliser Redis tout le chemin). La chose la plus importante est de ne pas faire l'erreur de penser que vous avez besoin d'avoir les données dans une base de données et le garder pour toujours. Agrégation et de jeter les anciennes données est la clé.
CouchDB est très fiable, il offre une excellente durabilité, et vous ferez l'expérience de très faible charge CPU. Il est aussi excellent à la réplication entre plusieurs nœuds, soit à la demande ou en continu.
Grâce à ses capacités de réplication et API RESTful (il utilise le protocole HTTP pour ses API), vous pouvez l'échelle horizontale assez facilement à l'aide de maturité des outils. (Nginx ou Apache pour faire du reverse proxy, HTTP équilibreurs de charge, etc.)
Vous écrire map/reduce fonctions en JavaScript pour précalculer les requêtes. Les résultats sont construit progressivement sur disque, ce qui signifie qu'ils ne ont besoin d'être calculé une fois par signal. En d'autres termes, les requêtes peuvent être très rapides, car il n'a qu'à faire des calculs sur le signal de données enregistrées depuis la dernière fois que vous avez exécuté la requête.
CouchDB métiers de l'espace disque pour la performance, de sorte que vous pouvez vous attendre à utiliser beaucoup d'espace disque. Vos requêtes peut être rapide comme l'éclair et économiser de l'espace disque si vous les mettre en œuvre correctement.
Donner CouchDB un essai.
Découvrez Pourquoi le Grand Collisionneur de Hadrons Scientifiques sont avec CouchDB et CouchDB à la BBC comme une tolérance de panne, adaptables, multi-centre de données clé-valeur en magasin
~3000 signaux/min = 50 écrit/s laquelle l'un quelconque de ces systèmes seront en mesure de gérer facilement.
Cassandra sera probablement mieux comme ensemble de données croît de plus de mémoire, cependant, et les Hadoop intégration aidera avec votre exploration de données.
Afin de stocker des données dans une centrale db pour le datamining? Pas de traitement des transactions en ligne?
Je ne pense pas que MongoDB est un bon travail lorsqu'il s'agit de la durabilité. Voir http://nosql.mypopescu.com/post/392868405/mongodb-durability-a-tradeoff-to-be-aware-of .
Peut-être vous pouvez utiliser google analytics db Infobright, il a une community edition: http://www.infobright.org/ ?
Vous êtes à la recherche pour une banque de données qui peuvent permettre de "rapide comme l'éclair", écrit (données conservées sur le disque), et l'extraction de données à un stade ultérieur (c'est le cycle de LECTURE). Aussi, en considérant les nombres que vous avez de l'état, il s'avère que l'on collecte toutes les 159MB de l'information par jour, ou environ 5 go par mois.
Dans ce cas, pourquoi ne pas regarder Redis.
Vous pouvez toujours l'archive, le quotidien Redis fichier de données, et consultez-la pour plus tard (si vous avez des soucis de chargement de 5 go ou plus de RAM espace, alors vous cet archivage pourrait être une solution de contournement)
Redis est plutôt rapide, basé sur les chiffres publiés sur ce site.
Espérons que cette aide.
Kiran
J'ai utilisé MongoDB de Incanter et ont aimé. Bien que je ne peux pas parler à la rapidité de ces grands ensembles de données, Clojure (qui Incanter est basé sur l') est très fiable en termes de gestion des transactions. Incanter fournit également quelques grands outils d'analyse, donc, si vous prévoyez sur l'analyse de toutes les données, MongoDB + Incanter pourrait être une combinaison puissante.
Si vous avez aimer le look de Cassandra pour-de-la-démarrer la capacité à l'échelle horizontale, tune de la cohérence à l'encontre de la disponibilité et de ces, vous pouvez également regarder Riak, qui a le même ensemble de fonctionnalités mais avec une approche différente.