Je travaille sur une plateforme publicitaire en temps réel avec un fort accent sur les performances. J'ai toujours développé avec MySQL, mais je suis prêt à essayer quelque chose de nouveau comme MongoDB ou Cassandra si des gains de vitesse importants peuvent être réalisés. J'ai lu les deux toute la journée, mais depuis les deux se développent rapidement, une grande partie de l'information semble quelque peu datée.
Les principales données stockées seraient des entrées pour chaque clic, des lignes incrémentées pour les vues et des informations pour chaque campagne (juste quelques paramètres de base, etc.). Les gains de vitesse doivent être trouvés dans l'insertion de clics, la mise à jour des totaux de vue et la génération de rapports statistiques en temps réel. La plateforme est développée avec PHP.
Ou peut-être rien de tout cela?
Il existe plusieurs façons d'y parvenir avec toutes les technologies répertoriées. Il s'agit plutôt de savoir comment vous les utilisez. Votre solution idéale peut utiliser une combinaison de ceux-ci, en tenant compte des modèles d'utilisation. Je ne pense pas que les informations soient datées parce que les concepts en jeu sont très fondamentaux. Il peut y avoir de nouvelles bases de données NoSQL et des correctifs aux bases existantes, mais votre question est principalement architecturale.
Les solutions NoSQL comme MongoDB et Cassandra reçoivent beaucoup d'attention pour leurs performances d'insertion. Les gens ont tendance à se plaindre des performances de mise à jour/insertion des bases de données relationnelles, mais il existe des moyens d'atténuer ces problèmes.
En commençant par MySQL, vous pouvez revoir O'Reilly's High Performance MySQL , optimiser le schéma, ajouter plus de mémoire, peut-être l'exécuter sur un matériel différent du reste de votre application (en supposant que vous avez utilisé MySQL pour cela), ou partitionner/données de tesson. Un autre domaine à considérer est votre candidature. Pouvez-vous mettre en file d'attente les insertions et les mises à jour au niveau de l'application avant l'insertion dans la base de données? Cela vous donnera une certaine flexibilité et est probablement utile dans tous les cas. Selon l'apparence de votre schéma final, MySQL vous aidera à extraire les données tant que vous serez à l'aise avec SQL. C'est un avantage si vous devez utiliser des outils de reporting tiers, etc.
MongoDB et Cassandra sont des bêtes différentes. D'après ce que je comprends, il était plus facile d'ajouter des nœuds à ce dernier, mais cela a changé depuis que MongoDB a une réplication, etc. intégrée. Les insertions pour ces deux plates-formes ne sont pas contraint de la même manière qu'une base de données relationnelle. L'extraction de données est également assez rapide et vous avez beaucoup de flexibilité avec les changements de format de données. Le compromis est que vous ne pouvez pas utiliser SQL (un avantage pour certains), donc obtenir des rapports Rien ne peut vous empêcher de collecter des données sur l'une de ces plates-formes, puis de les importer dans une base de données MySQL pour une analyse plus approfondie.
En fonction de vos besoins, il existe des outils autres que les bases de données NoSQL que vous devriez examiner, tels que Flume . Ceux-ci utilisent la plate-forme Hadoop qui est largement utilisée pour l'analyse. Ceux-ci peuvent avoir plus de flexibilité qu'une base de données pour ce que vous faites. Il y a du contenu de Hadoop World qui pourrait vous intéresser.
Les solutions Nosql sont meilleures que Mysql, postgresql et autres technologies rdbms pour cette tâche. Ne perdez pas votre temps avec Hbase/Hadoop, vous devez être un astronaute pour l'utiliser. Je recommande MongoDB et Cassandra. Mongo est meilleur pour les petits ensembles de données (si vos données sont au maximum 10 fois plus grandes que votre RAM, sinon vous devez scinder, avoir besoin de plus de machines et utiliser des jeux de répliques). Pour les mégadonnées; cassandra est le meilleur. Mongodb a plus d'options de requête et d'autres fonctionnalités que cassandra mais vous avez besoin de machines 64 bits pour mongo. Il y a quelques solutions pour l'analyse dans des deux côtés. Il y a des compteurs atomiques des deux côtés. Les deux peuvent bien évoluer mais cassandra est beaucoup mieux en termes de mise à l'échelle et de haute disponibilité. Les deux ont des clients php, ont tous deux un bon support et une bonne communauté plus gros).
Exemple de projet d'analyse Cassandra: Rainbird http://www.slideshare.net/kevinweil/rainbird-realtime-analytics-at-Twitter-strata-2011
exemple de mongo: http://www.slideshare.net/jrosoff/scalable-event-analytics-with-mongodb-Ruby-on-Rails
http://axonflux.com/how-superfeedr-built-analytics-using-mongodb
les développeurs de doubleclick ont développé mongo http://www.informationweek.com/news/software/info_management/224200878
Caractéristiques de MySQL:
Caractéristiques de Cassandra:
Cassandra est une clé-valeur ou un stockage basé sur des documents. Réfléchissez à ce que cela signifie. En général, je donne Cassandra UNE CLÉ et je récupère UN ENSEMBLE DE DONNÉES. Cela peut se ramifier à partir de là, mais c'est essentiellement ce qui se passe. C'est plus comme accéder à un fichier statique. Bien sûr, vous pouvez avoir plusieurs index, champs de compteur, etc. mais je fais une généralisation. C'est de là que vient Cassandra.
MySQL et SQL est basé sur la théorie des groupes/ensembles - il a un moyen de combiner N'IMPORTE QUELLE relation entre les ensembles de données. Il est assez facile de prendre une requête MySQL, de faire de la requête une "clé" et la réponse une "valeur" et de la stocker dans Cassandra (par exemple make Cassandra un cache). Cela pourrait également expliquer le compromis, MySQL vous permet de toujours réorganiser vos tables de données et les relations entre les jeux de données simplement en écrivant une requête différente. Cassandra pas tellement. Et sachez que bien que Cassandra puisse fournir des fonctionnalités pour faire certaines de ces choses, ce n'est pas pour cela qu'il a été conçu.
MongoDB et CouchDB se situent quelque part au milieu de ces deux extrêmes. Je pense que MySQL peut être un peu bavard et ennuyeux à gérer, en particulier lorsqu'il s'agit de champs facultatifs et de migrations si vous n'avez pas un bon modèle ou des outils. Aussi avec l'évolutivité, je suis sûr qu'il existe d'excellentes technologies pour faire évoluer une base de données MySQL, mais Cassandra évoluera toujours et facilement, en raison des limitations de son ensemble de fonctionnalités. MySQL est un peu plus illimité Cependant, NoSQL et Cassandra font pas font des jointures, l'une des fonctionnalités critiques de SQL qui permet de combiner plusieurs tables dans une seule requête. Ainsi, les requêtes relationnelles complexes ne seront pas mises à l'échelle dans Cassandra.
Cassandra vs. MongoDB Envisagez-vous Cassandra ou MongoDB comme magasin de données pour votre prochain projet? Voulez-vous comparer les deux bases de données? Cassandra et MongoDB sont les deux bases de données "NoSQL", mais la réalité est qu'elles sont très différentes. Elles ont des forces et des propositions de valeur très différentes - donc toute comparaison doit être nuancée. Commençons par les exigences initiales… Aucune de ces bases de données ne remplace le SGBDR, ni ils "ACID" bases de données. Donc, si vous avez une charge de travail transactionnelle où la normalisation et la cohérence sont les exigences principales, aucune de ces bases de données ne fonctionnera pour vous. Vous feriez mieux de s'en tenir aux bases de données relationnelles traditionnelles comme MySQL, PostGres, Oracle, etc. nous avons des bases de données relationnelles à l'écart, considérons les différences majeures entre Cassandra et MongoDB qui vous aideront à prendre la décision. Dans cet article, je ne vais pas discuter de fonctionnalités spécifiques, mais je soulignerai certains des différences stratégiques de haut niveau pour vous aider à faire votre choix.
Verdict: si votre domaine problématique a besoin d'un modèle de données riche, MongoDB vous convient mieux.
Verdict: si votre application a besoin d'index secondaires et a besoin de flexibilité dans le modèle de requête, MongoDB est mieux adapté à vos besoins.
Verdict: si vous avez besoin d'une disponibilité de 100% Cassandra vous convient mieux.
Verdict: si l'évolutivité de l'écriture est votre truc, Cassandra vous convient mieux.
Verdict: Si vous avez besoin de la prise en charge du langage de requête, Cassandra est le mieux adapté pour vous.
Benchmarks de performances Parlons performances. À ce stade, vous vous attendez probablement à une comparaison des performances des bases de données. Je n'ai délibérément pas inclus de référence de performance dans la comparaison. Dans toute comparaison, nous devons nous assurer que nous faisons une comparaison de pommes à pommes.
Modèle de base de données - Le modèle/schéma de base de données de l'application testée fait une grande différence. Certains schémas sont bien adaptés à MongoDB et certains sont bien adaptés à Cassandra. Ainsi, lors de la comparaison de bases de données, il est important d'utiliser un modèle qui fonctionne raisonnablement bien pour les deux bases de données.
Une dernière chose à garder à l'esprit est que la charge de référence peut refléter ou non les performances de votre application. Ainsi, pour que les benchmarks soient utiles, il est très important de trouver une charge de benchmark qui reflète les caractéristiques de performances de votre application. Voici quelques benchmarks que vous voudrez peut-être consulter: - NoSQL Performance Benchmarks - Cassandra vs MongoDB vs Couchbase vs HBase
Verdict: Les deux sont assez faciles à utiliser et à accélérer.
Native Aggregation MongoDB possède une structure d'agrégation intégrée pour exécuter un pipeline ETL afin de transformer les données stockées dans la base de données. C'est idéal pour les petits et moyens travaux, mais à mesure que vos besoins de traitement des données deviennent plus complexes, le cadre d'agrégation devient difficile à déboguer. Cassandra n'a pas de structure d'agrégation intégrée. Des outils externes comme Hadoop, Spark sont utilisés pour cela.
Modèles sans schéma Dans MongoDB, vous pouvez choisir de n'appliquer aucun schéma sur vos documents. Bien qu'il s'agisse de la valeur par défaut dans les versions précédentes de la version la plus récente, vous avez la possibilité d'appliquer un schéma pour vos documents. Chaque document dans MongoDB peut avoir une structure différente et c'est à votre application d'interpréter les données. Bien que cela ne soit pas pertinent pour la plupart des applications, dans certains cas, la flexibilité supplémentaire est importante. Cassandra dans les versions plus récentes (avec CQL comme langue par défaut) fournit un typage statique. Vous devez définir le type de colonne très à l'avance.
Je voudrais également ajouter Membase (www.couchbase.com) à cette liste.
En tant que produit, Membase a été déployé dans plusieurs agences de publicité (AOL Advertising, Chango, Delta Projects, etc.). Il existe un certain nombre d'études de cas publiques et des exemples de la manière dont ces sociétés ont utilisé Membase avec succès.
Bien qu'il soit certainement question de débat, nous avons constaté que Membase offre de meilleures performances et évolutivité que toute autre solution. Ce qui nous manque dans l'indexation/interrogation, nous prévoyons plus que de compenser l'intégration de CouchDB comme nouveau backend de persistance.
En tant qu'entreprise, Couchbase (les fabricants de Membase) possède une grande quantité de connaissances et d'expérience répondant spécifiquement aux besoins des entreprises de publicité/ciblage.
J'adorerais certainement vous engager avec vous dans ce cas d'utilisation particulier pour voir si Membase est la bonne solution.
Veuillez me tirer un e-mail (perry -at- couchbase -dot- com) ou visitez-nous sur les forums: http://www.couchbase.org/forums/
Perry Krug
Je considérerais New Relic comme un exemple de charge de travail similaire. Ils capturent plus de 200 milliards de points de données par jour sur le disque et utilisent MySQL 5.6 (Percona) comme backend.
Un article de blog est disponible ici: http://blog.newrelic.com/2014/06/13/store-200-billion-data-points-day-disk/