web-dev-qa-db-fra.com

MongoDB vs Cassandra vs MySQL pour la plateforme publicitaire en temps réel

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?

54
James Simpson

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.

36
Brian Lyttle

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

22
sirmak

Caractéristiques de MySQL:

  • Verrouillage de la base de données (BEAUCOUP plus facile pour les transactions financières)
  • Cohérence/sécurité (comme ci-dessus, vous pouvez garantir, par exemple, qu'aucun changement ne se produit entre le moment où vous lisez le solde d'un compte bancaire et celui où vous le mettez à jour).
  • Organisation/refactorisation des données (vous pouvez avoir des données désorganisées n'importe où, mais MySQL est meilleur avec des tables qui représentent des "types" ou des "composants", puis en les combinant en requêtes - c'est ce qu'on appelle la normalisation).

Caractéristiques de Cassandra:

  • La vitesse
  • Disponibilité (les données sont toujours disponibles, même si elles sont 100% "correctes")
  • Champs facultatifs (PEUT être fait dans MySQL avec des méta-tables, etc., mais c'est gratuit dans 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.

21
Ryan Taylor

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.

  1. Modèle d'objet expressif MongoDB prend en charge un modèle d'objet riche et expressif. Les objets peuvent avoir des propriétés et les objets peuvent être imbriqués les uns dans les autres (pour plusieurs niveaux). Ce modèle est très "orienté objet" et peut facilement représenter n'importe quelle structure d'objet dans votre domaine. Vous pouvez également indexer la propriété de n'importe quel objet à n'importe quel niveau de la hiérarchie - c'est incroyablement puissant! Cassandra, en revanche, offre une structure de table assez traditionnelle avec des lignes et des colonnes. Les données sont plus structurées et chaque colonne a un type spécifique qui peut être spécifié lors de la création.

Verdict: si votre domaine problématique a besoin d'un modèle de données riche, MongoDB vous convient mieux.

  1. Index secondaires Les index secondaires sont une construction de première classe dans MongoDB. Cela facilite l'indexation de toute propriété d'un objet stocké dans MongoDB même s'il est imbriqué. Cela rend très facile l'interrogation basée sur ces index secondaires. Cassandra n'a qu'un support superficiel pour les index secondaires. Les index secondaires sont également limités à des colonnes simples et à des comparaisons d'égalité. Si vous allez principalement interroger par la clé primaire, alors Cassandra fonctionnera bien pour vous.

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.

  1. Haute disponibilité MongoDB prend en charge un modèle "maître unique". Cela signifie que vous avez un nœud maître et un certain nombre de nœuds esclaves. En cas de panne du maître, l'un des esclaves est élu maître. Ce processus se produit automatiquement, mais il prend du temps, généralement 10 à 40 secondes. Pendant cette période d'élection d'un nouveau chef, votre jeu de répliques est arrêté et ne peut pas prendre d'écrit. Cela fonctionne pour la plupart des applications mais dépend en fin de compte de vos besoins. Cassandra prend en charge un modèle à "plusieurs maîtres". La perte d'un seul nœud n'affecte pas la capacité du cluster à effectuer des écritures - vous pouvez donc atteindre 100% de disponibilité pour les écritures.

Verdict: si vous avez besoin d'une disponibilité de 100% Cassandra vous convient mieux.

  1. Évolutivité de l'écriture MongoDB avec son modèle "maître unique" ne peut prendre des écritures que sur le primaire. Les serveurs secondaires ne peuvent être utilisés que pour les lectures. Donc, essentiellement, si vous avez un jeu de réplicas à trois nœuds, seul le maître prend les écritures et les deux autres nœuds ne sont utilisés que pour les lectures. Cela limite considérablement l'évolutivité de l'écriture. Vous pouvez déployer plusieurs fragments mais essentiellement seulement 1/3 de vos nœuds de données peuvent prendre des écritures. Cassandra avec son modèle "multiple master" peut prendre des écritures sur n'importe quel serveur. Essentiellement, votre évolutivité en écriture est limitée par le nombre de serveurs que vous avez dans le cluster. Plus vous avez de serveurs dans le cluster, mieux il évoluera.

Verdict: si l'évolutivité de l'écriture est votre truc, Cassandra vous convient mieux.

  1. Prise en charge du langage de requête Cassandra prend en charge le langage de requête CQL qui est très similaire à SQL. Si vous avez déjà une équipe d'analystes de données, ils seront en mesure de porter sur la majorité de leurs compétences SQL, ce qui est très important pour les grandes organisations.Cependant, CQL n'est pas un SQL ANSI complet - Il a plusieurs limitations (pas de prise en charge de jointure, pas de clauses OR)), etc. MongoDB ne prend pas en charge à ce stade un langage de requête. Les requêtes sont structurées comme des fragments JSON.

Verdict: Si vous avez besoin de la prise en charge du langage de requête, Cassandra est le mieux adapté pour vous.

  1. 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.

  2. 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.

  3. Caractéristiques de la charge - Les caractéristiques de la charge de référence sont très importantes. Par exemple. Dans les tests de référence lourds en écriture, je m'attendrais à ce que Cassandra fume MongoDB. Cependant, dans les tests de référence lourds, MongoDB et Cassandra devraient avoir des performances similaires.
  4. Exigences de cohérence - C'est une question délicate. Vous devez vous assurer que les exigences de cohérence en lecture/écriture spécifiées sont identiques dans les deux bases de données et ne sont pas biaisées en faveur d'un participant. Très souvent dans un certain nombre de benchmarks "Marketing", les boutons sont réglés pour désavantager l’autre côté. Faites donc très attention aux paramètres de cohérence.

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

  1. Facilité d'utilisation Si vous aviez posé cette question il y a quelques années, MongoDB serait le gagnant de haut niveau. C’est une tâche assez simple de faire fonctionner MongoDB. Au cours des deux dernières années, cependant, Cassandra a fait de grands progrès dans cet aspect du produit. Avec l'adoption du CQL comme interface principale pour Cassandra, il est allé encore plus loin - ils ont rendu très simple pour les légions de programmeurs SQL d'utiliser Cassandra très facilement.

Verdict: Les deux sont assez faciles à utiliser et à accélérer.

  1. 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.

  2. 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.

5
sanjusci

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

5
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/

3
Morgan Tocker