60 votes

Passer de MySQL à Cassandra - Avantages/Convénients ?

Pour rappel, cette question concerne un projet fonctionnant sur une seule petite instance EC2, et qui est sur le point de migrer vers une instance de taille moyenne. Les principaux composants sont Django, MySQL et un grand nombre d'outils d'analyse personnalisés écrits en python et en java, qui font le gros du travail. lourds. La même machine exécute également Apache.

Le modèle de données ressemble à ce qui suit : une grande quantité de données en temps réel provient de divers capteurs en réseau et, idéalement, j'aimerais mettre en place une approche de sondage à long terme plutôt que l'approche actuelle de sondage toutes les 15 minutes (une limitation du calcul des statistiques et de l'écriture dans la base de données elle-même). Une fois les données reçues, je stocke la version brute dans MySQL, je laisse les outils d'analyse travailler sur ces données et je stocke les statistiques dans quelques autres tables. Le tout est rendu à l'aide de Django.

Caractéristiques relationnelles dont j'aurais besoin -

  • Commander par [SliceRange dans l'API de Cassandra semble répondre à ce besoin].
  • Groupe par
  • Nombreuses relations entre plusieurs tables [Les SuperColumns de Cassandra semblent bien fonctionner pour une à plusieurs colonnes].
  • Sphinx me permet de disposer d'un moteur de texte complet, c'est donc une nécessité. [En ce qui concerne Cassandra, le projet Lucandra semble répondre à ce besoin].

Mon principal problème est que les lectures de données sont extrêmement lentes (et les écritures ne sont pas très rapides non plus). Je n'ai pas envie de dépenser beaucoup d'argent et de matériel pour l'instant, et je préférerais quelque chose qui puisse évoluer facilement avec le temps. La mise à l'échelle verticale de MySQL n'est pas triviale dans ce sens (ni bon marché).

Donc, après avoir lu beaucoup de choses sur NOSQL et expérimenté des choses comme MongoDB, Cassandra et Voldemort, mes questions sont les suivantes,

  • Sur une instance EC2 moyenne, Est-ce que je gagnerais en lecture/écriture en passant à quelque chose comme Cassandra ? ? Cet article (pdf) semble le suggérer. Actuellement, je dirais que quelques centaines d'écritures par minute sont la norme. Pour les lectures, comme les données changent toutes les 5 minutes environ, l'invalidation du cache doit se faire assez rapidement. A un moment donné, il devrait être capable de gérer un grand nombre d'utilisateurs simultanés. Les performances de l'application sont pour l'instant anéanties par MySQL lors de certaines jointures sur de grandes tables, même si des index sont créés - quelque chose de l'ordre de 32k lignes prend plus d'une minute à être rendu. (Il peut s'agir d'un artefact des E/S virtualisées d'EC2). La taille des tables est d'environ 4 à 5 millions de lignes, et il y a environ 5 tables de ce type.

  • Tout le monde parle de l'utilisation de Cassandra sur plusieurs nœuds, compte tenu du théorème CAP et de la cohérence éventuelle. Mais, pour un projet qui commence à peine à se développer, cela a-t-il un sens ? de déployer un serveur cassandra à un nœud ? Y a-t-il des mises en garde ? Par exemple, peut-il remplacer MySQL comme backend pour Django ? [Est-ce recommandé ?]

  • Si je le fais, je suppose que je devrai réécrire certaines parties de l'application pour faire beaucoup plus d'"adminrivia" puisque je devrais faire des recherches multiples pour récupérer les lignes.

  • Serait-il judicieux d'utiliser MySQL comme magasin de clés et de valeurs ? plutôt qu'un moteur relationnel, et de l'utiliser ? De cette façon, je pourrais utiliser un grand nombre d'API stables disponibles, ainsi qu'un moteur stable (et passer au relationnel si nécessaire). (Brett Taylor's post from Friendfeed on this - http://bret.appspot.com/entry/how-friendfeed-uses-mysql )

Tout point de vue de la part de personnes ayant effectué un changement de poste serait grandement apprécié !

Merci.

38voto

jbellis Points 16235

Cassandra et les autres bases de données distribuées disponibles aujourd'hui ne fournissent pas le type de support de requête ad-hoc auquel vous êtes habitué avec SQL. En effet, il n'est pas possible de distribuer des requêtes avec des jointures de manière performante, et l'accent est donc mis sur la dénormalisation.

Cependant, Cassandra 0.6 (la version bêta sortira officiellement demain, mais vous pouvez construire vous-même à partir de la branche 0.6 si vous êtes impatient) prend en charge Hadoop map/reduce pour l'analyse, ce qui semble être une bonne solution pour vous.

Cassandra offre une excellente prise en charge de l'ajout de nouveaux nœuds sans douleur, même pour un groupe initial d'un nœud.

Cela dit, avec quelques centaines d'écritures/minute, mysql vous conviendra parfaitement pendant très longtemps. Cassandra est bien meilleur pour être un magasin clé/valeur (encore mieux, clé/famille de colonnes) mais MySQL est bien meilleur pour être une base de données relationnelle :)

Il n'y a pas encore de support django pour Cassandra (ou autre base de données nosql). Ils parlent de faire quelque chose pour la prochaine version après la 1.2, mais d'après les discussions avec les développeurs de django à pycon, personne n'est vraiment sûr de ce à quoi cela ressemblera pour l'instant.

19voto

codemonkey Points 1756

Si vous êtes un développeur de bases de données relationnelles (comme moi), j'aimerais vous suggérer/pointer du doigt :

  • Acquérir de l'expérience avec Cassandra avant de s'engager à l'utiliser sur un système de production... surtout si ce système de production a une date limite de réalisation très stricte. Peut-être l'utiliser d'abord comme backend pour quelque chose de peu important.
  • Il s'avère plus difficile que je ne l'avais prévu de faire des choses simples que je considère comme allant de soi en matière de manipulation de données à l'aide de moteurs SQL. En particulier, l'indexation des données et le tri des ensembles de résultats ne sont pas triviaux.
  • La modélisation des données s'est également avérée difficile. En tant que développeur de bases de données relationnelles, vous arrivez à la table avec beaucoup de bagages... vous devez être prêt à apprendre à modéliser les données de manière très différente.

Ceci étant dit, je recommande vivement de construire quelque chose dans Cassandra. Si vous êtes comme moi, cela remettra en question votre compréhension du stockage des données et vous amènera à repenser votre vision d'une base de données relationnelle adaptée à toutes les situations, dont je ne me rendais même pas compte qu'elle existait.

Voici quelques bonnes ressources que j'ai trouvées :

1voto

logan Points 128

Django-cassandra est en mode bêta précoce. De plus, Django n'a pas été conçu pour les bases de données no-sql. La clé de l'ORM de Django est basée sur SQL (Django recommande d'utiliser PostgreSQL). Si vous avez besoin d'utiliser UNIQUEMENT no-sql (vous pouvez mélanger SQL et no-sql dans la même application), vous devez prendre le risque d'utiliser l'ORM no-sql (il est significativement plus lent que l'ORM SQL traditionnel ou que l'utilisation directe du stockage no-sql). Ou alors il faut réécrire complètement l'ORM de django. Mais dans ce cas, je ne peux pas supposer que vous ayez besoin de Django. Peut-être pouvez-vous utiliser quelque chose d'autre, comme Tornado ?

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