72 votes

Que dois-je choisir ? MongoDB/Cassandra/Redis/CouchDB ?

Nous développons un très gros projet et je me demandais si quelqu'un pouvait me donner des conseils sur le backend de la base de données que nous devrions choisir.

Notre système est composé de 1100 appareils électroniques qui envoient un signal à un serveur central, puis le serveur stocke les informations du signal (le signal fait environ 35 octets). Ces appareils enverront environ 3 signaux par minute chacun, donc si nous faisons des calculs, cela fera 4.752.000 nouveaux enregistrements par jour dans la base de données, et un total de 142.560.000 nouveaux enregistrements par mois.

Nous avons besoin d'une base de données dorsale qui soit rapide et fiable. Bien sûr, nous avons besoin de faire de l'exploration de données complexes sur cette base. Nous faisons des recherches sur MongoDB/Cassandra/Redis/CouchDB, mais les sites de documentation n'en sont qu'à leurs débuts.

Une aide ? Des idées ?

Merci beaucoup !

100voto

user359996 Points 3011

Ne laissez pas l'échelle spatiale (plus de 1000 dispositifs) vous induire en erreur quant à l'échelle de calcul et/ou de stockage. Quelques dizaines d'insertions de 35 octets par seconde constituent une charge de travail triviale pour tout SGBD grand public, même s'il fonctionne sur du matériel bas de gamme. De même, 142 millions d'enregistrements par mois ne représentent que de l'ordre de 1 à 10 gigaoctets de stockage par mois, sans aucune compression, y compris les indices.

Dans le commentaire de votre question, vous avez dit :

"Tout est question de fiabilité, d'évolutivité et de vitesse. Il est très important que la solution évolue facilement (MongoDB autosharding ?) en ajoutant simplement plus de nœuds, et la vitesse est également très importante ".

Fiabilité ? Tout SGBD grand public peut la garantir (en supposant que vous voulez dire qu'il ne va pas corrompre vos données et qu'il ne va pas se planter - voir ma discussion sur le théorème CAP au bas de cette réponse). La vitesse ? Même avec une seule machine, 10~100 fois cette charge de travail ne devrait pas être un problème. Evolutivité ? Au rythme actuel, les données d'une année complète, non compressées, même entièrement indexées, tiendraient facilement dans 100 gigaoctets d'espace disque (de même, nous avons déjà établi que le taux d'insertion n'est pas un problème).

En tant que tel, je ne vois pas l'utilité d'une solution exotique comme NoSQL, ou même d'une base de données distribuée - une bonne vieille base de données relationnelle comme MySQL ferait parfaitement l'affaire. Si vous êtes préoccupé par le basculement, installez simplement un serveur de secours dans une configuration maître-esclave. Si l'on parle d'une échelle 100 ou 1000 fois supérieure à l'échelle actuelle, il suffit de partitionner horizontalement quelques instances en fonction de l'ID du dispositif de collecte des données ( c'est-à-dire {index de partition} = {identifiant du dispositif} modulo {nombre de partitions}).

Gardez à l'esprit que quitter les limites sécurisées et confortables du monde des bases de données relationnelles signifie abandonner à la fois ses modèle de représentation et son riche palette d'outils . Cela rendra votre "datamining complexe" beaucoup plus difficile - vous n'avez pas seulement besoin de mettre des données dans la base de données, vous devez aussi les faire sortir.

Tout cela étant dit, MongoDB et CouchDB sont d'une simplicité peu commune à déployer et à utiliser. Ils sont également très amusants et vous rendront plus attrayant pour un grand nombre de personnes (pas seulement les programmeurs, mais aussi les cadres !).

Il est communément admis que, parmi les trois solutions NoSQL que vous avez suggérées, Cassandra est la meilleure pour les gros volumes d'insertion (bien sûr, relativement parlant, je ne pense pas que vous ). ont un volume d'insertion élevé - il a été conçu pour être utilisé par Facebook ) ; ceci est compensé par le fait qu'il est plus difficile de travailler avec. Donc, à moins que vous n'ayez des exigences étranges que vous n'avez pas mentionnées, je vous le déconseille, pour votre cas d'utilisation.

Si vous êtes fermement décidé à déployer un système NoSQL, vous pouvez envisager le théorème CAP. Cela vous aidera à choisir entre MongoDB et CouchDB. Voici un bon lien : http://blog.nahurst.com/visual-guide-to-nosql-systems . Tout dépend de ce que vous entendez par "fiabilité" : MongoDB échange la disponibilité contre la cohérence, tandis que CouchDB échange la cohérence contre la disponibilité. . (Cassandra vous permet d'affiner ce compromis, pour chaque requête, en spécifiant le nombre de serveurs qui doivent être écrits/lus pour qu'une écriture/lecture soit réussie ; MISE À JOUR : CouchDB peut maintenant le faire aussi, avec BigCouch ! Très excitant...)

Bonne chance dans votre projet.

27voto

Theo Points 60103

La réponse dépend en grande partie de ce que vous voulez en faire après la collecte. Stocker de nombreuses données est facile : il suffit de les stocker dans des fichiers journaux, sans avoir besoin d'une base de données. En revanche, si vous souhaitez effectuer une analyse complexe et une exploration des données, une base de données est utile.

La question suivante est de savoir quel type d'analyse vous allez faire. Sera-t-elle effectuée sur un sous-ensemble de données ayant une propriété particulière, la dernière heure/le dernier jour/la dernière semaine/le dernier mois uniquement, les données peuvent-elles être agrégées ou pré-calculées d'une manière ou d'une autre ? En d'autres termes : avez-vous besoin d'accéder à l'ensemble des données sous la forme où elles sont collectées ? Pouvez-vous archiver les données lorsqu'elles deviennent trop anciennes pour être intéressantes ? Pouvez-vous agréger les données et effectuer l'analyse sur l'agrégation ?

D'après mon expérience dans le domaine de l'analyse de la publicité (collecte de milliards de points de données sur l'exposition aux publicités), l'agrégation est essentielle. Vous collectez des données brutes, vous les nettoyez et vous les placez dans une base de données comme MongoDB, Cassandra ou même MySQL qui vous permet de faire des mises à jour et des requêtes. Ensuite, vous regroupez périodiquement les données et les supprimez de la base de données (mais vous archivez les données brutes, car vous pourriez en avoir besoin plus tard).

L'agrégation pose essentiellement toutes les questions que vous voulez poser sur les données, et les enregistre sous une forme qui permet de récupérer facilement la réponse à une question particulière. Disons que vous voulez savoir quel jour de la semaine a le plus de X. L'implémentation naïve de ceci serait de garder tous les signaux enregistrés dans une énorme table et de faire une requête qui additionne toutes les lignes qui ont X. Comme le nombre de signaux collectés augmente, cette requête prendra de plus en plus de temps. Aucune indexation, aucun sharding ou aucune optimisation n'y changera quoi que ce soit. Au lieu de cela, tous les jours/heures/minutes (en fonction du cas d'utilisation exact et de la mise à jour nécessaire de vos rapports), vous regardez les nouveaux signaux que vous avez enregistrés, et pour chaque X, vous incrémentez le compteur qui garde la trace de combien de X il y a eu le lundi, si c'est un lundi, le mardi si c'est un mardi et ainsi de suite. De cette façon, vous pourrez plus tard récupérer le nombre de X pour chaque jour de la semaine et les comparer. Vous faites cela pour toutes les questions auxquelles vous voulez pouvoir répondre, puis vous supprimez les signaux de la base de données (mais, là encore, vous conservez les données brutes).

Le type de base de données dans lequel vous enregistrez les agrégats peut être le même que celui dans lequel vous stockez les signaux entrants, mais il n'a pas besoin d'être très sophistiqué. Elle stockera les clés qui représentent une réponse particulière, et les valeurs qui sont généralement de simples chiffres.

Dans le langage de l'entreposage de données de la vieille école, la base de données dans laquelle vous stockez les signaux entrants est appelée OLTP (pour on-line transactional processing) et la base de données dans laquelle vous stockez les agrégats est appelée OLAP (pour on-line analytical processing). OLTP est optimisé pour l'insertion et OLAP est optimisé pour l'interrogation. Ces termes sont anciens et lorsque les gens les entendent, ils ont tendance à penser immédiatement à SQL, aux schémas en étoile et à tout le reste. Je ne devrais peut-être pas les utiliser, mais ce sont des termes pratiques.

Quoi qu'il en soit, pour l'OLTP, vous voulez quelque chose qui soit rapide pour insérer des données, mais aussi quelque chose qui prenne en charge l'indexation des données et la recherche d'éléments. L'agrégation est grandement facilitée par une base de données qui fait la moitié du travail de sommation et de recherche des maximums et minimums. J'aime beaucoup MongoDB parce qu'il est très facile à configurer et à utiliser. Les données avec lesquelles je travaille ont tendance à être désordonnées et tous les éléments n'ont pas le même ensemble de propriétés, donc l'absence de schéma de Mongo est une bénédiction. D'un autre côté, vos données semblent beaucoup plus uniformes, donc Mongo ne vous apporterait peut-être pas autant d'avantages. Ne négligez pas pour autant les bonnes vieilles bases de données relationnelles. Si vous avez l'intention de faire beaucoup d'additions, etc., alors SQL est parfait, c'est pour cela qu'il a été conçu.

Pour OLAP, quelque chose de beaucoup plus simple fonctionne, un magasin clé-valeur est tout ce dont vous avez besoin. J'utilise Redis parce qu'il est également très facile à utiliser et à configurer. Il vous permet également de stocker plus que des valeurs scalaires, ce qui est pratique. Parfois, votre valeur est en fait une liste ou un hachage. Dans la plupart des magasins de valeurs clés, vous devez coder ces valeurs, mais Redis les gère de manière native. L'inconvénient de Redis est que vous ne pouvez pas faire de requêtes ("comme dans donnez-moi toutes les lignes qui ont cette valeur pour Y"), vous devez garder les indices de vos données vous-même. D'un autre côté, vous n'aurez pas beaucoup besoin d'index 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éfinie par la question. Pour la question ci-dessus, quel jour de la semaine a le plus de X, vous recherchez le nombre de travaux X lundi, mardi, etc. Vous les avez peut-être stockés sous X:lundi, X:mardi, etc.

En conclusion : MongoDB et Redis fonctionnent très bien pour moi. Je ne pense pas que MongoDB soit très bien adapté à votre cas d'utilisation, je pense plutôt que vous pourriez bénéficier davantage d'une base de données SQL traditionnelle (mais cela dépend, si vos données sont vraiment simples, vous pourriez peut-être utiliser Redis à fond). La chose la plus importante est de ne pas faire l'erreur de penser que vous devez avoir les données dans une base de données et les conserver pour toujours. L'agrégation et la suppression des anciennes données sont essentielles.

13voto

duluthian Points 732

CouchDB est trÃ?s fiable, offre une excellente durabilité et la charge du processeur est trÃ?s faible. Il est également excellent pour la réplication entre plusieurs nœuds, que ce soit à la demande ou en continu.

Grâce à ses capacités de réplication et à son API RESTful (elle utilise HTTP pour son API), vous pouvez évoluer horizontalement assez facilement en utilisant des outils matures. (Nginx ou Apache pour le reverse proxying, les équilibreurs de charge HTTP, etc.)

Vous écrivez des fonctions map/reduce en JavaScript pour précalculer les requêtes. Les résultats sont construits de manière incrémentielle sur le disque, ce qui signifie qu'ils ne doivent être calculés qu'une seule fois par signal. En d'autres termes, les requêtes peuvent être très rapides car elles ne doivent effectuer des calculs que sur les données du signal enregistrées depuis la dernière fois que vous avez exécuté la requête.

CouchDB troque l'espace disque contre la performance, vous pouvez donc vous attendre à utiliser beaucoup d'espace disque. Vos requêtes peuvent être rapides comme l'éclair et conserver l'espace disque si vous les implémentez correctement.

Essayez CouchDB.

Vérifiez Pourquoi les scientifiques du Large Hadron Collider utilisent CouchDB y CouchDB à la BBC en tant que magasin de clés et de valeurs tolérant aux pannes, évolutif et multi-centre de données.

9voto

jbellis Points 16235

~3000 signaux/minute = 50 écritures/s que n'importe lequel de ces systèmes sera capable de gérer facilement.

Cassandra sera probablement plus efficace lorsque votre ensemble de données dépassera la capacité de la mémoire, et l'intégration Hadoop facilitera l'exploration des données.

4voto

TTT Points 1894

Vous stockez donc les données dans une base de données centrale pour l'analyse des données ? Pas de traitement des transactions en ligne ?

Je ne pense pas que MongoDB fasse un bon travail en matière de durabilité. Voir http://nosql.mypopescu.com/post/392868405/mongodb-durability-a-tradeoff-to-be-aware-of .

Vous pouvez peut-être utiliser la base de données analytiques Infobright, qui dispose d'une édition communautaire : http://www.infobright.org/ ?

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