Passer de MySQL à Cassandra-Avantages / Inconvénients?
Pour un peu d'arrière - plan-cette question traite d'un projet s'exécutant sur une seule petite instance EC2, et est sur le point de migrer vers une instance moyenne. Les composants principaux sont Django, MySQL et un grand nombre d'outils d'analyse personnalisés écrits en Python et java, qui font le lourd levage. 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 vient en streaming à partir de divers capteurs en réseau, et idéalement, je voudrais établissez une approche de sondage à long terme plutôt que le sondage actuel 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 entrées, je stocke la version brute dans MySQL, laissez les outils d'analyse perdre ces données, et stockez les statistiques dans quelques autres tables. Tout cela est rendu en utilisant Django.
Caractéristiques relationnelles dont j'aurais besoin -
- Order by [SliceRange dans L'API de Cassandra semble satisfaire cela]
- groupe par
- de nombreuses relations entre plusieurs tables [Cassandra SuperColumns semblent bien faire pour un à plusieurs]
- Sphinx sur cela me donne un bon moteur de texte intégral, donc c'est une nécessité aussi. [ sur Cassandra, le projet Lucandra semble satisfaire ce besoin]
Mon problème majeur est que les lectures de données sont extrêmement lentes (et les Écritures ne sont pas si chaudes non plus). Je ne veux pas jeter beaucoup d'argent et de matériel là-dessus en ce moment, et je préférerais quelque chose qui peut échelle facilement avec le temps. La mise à L'échelle verticale de MySQL n'est pas triviale en ce sens (ou bon marché).
Donc essentiellement, après avoir lu beaucoup de choses sur NOSQL et expérimenté des choses comme MongoDB, Cassandra et Voldemort, mes questions sont,
Sur une instance EC2 moyenne, est-ce que je gagnerais des avantages en lecture / écriture en passant à quelque chose comme Cassandra? Cet article (pdf) semble suggérer que. Actuellement, je dirais quelques centaines écrit par minute serait la norme. Pour les lectures-puisque les données changent toutes les 5 minutes environ, l'invalidation du cache doit se produire assez rapidement. À un moment donné, il devrait être capable de gérer un grand nombre d'utilisateurs simultanés. Les performances de L'application sont actuellement tuées sur MySQL en faisant des 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 à rendre. (Cela peut aussi être un artefact D'E/S virtualisées 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 d'utiliser Cassandra sur plusieurs nœuds, compte tenu du théorème de CAP et de la cohérence éventuelle. Mais, pour un projet qui commence tout juste à se développer, ça a du sens pour déployer un serveur cassandra à un nœud? Existe-il des mises en garde? Par exemple, peut-il remplacer MySQL en tant que backend pour Django? [Est-ce recommandé?]
Si je change, je suppose que je vais devoir réécrire des parties de l'application pour faire beaucoup plus "administrivia" puisque je devrais faire plusieurs recherches pour récupérer des lignes.
Serait-il aucun sens d'utiliser MySQL comme une valeur de la clé de magasin plutôt qu'un moteur relationnel, et d'aller avec qui? De cette façon, je pourrais utiliser un grand nombre d'API stables disponibles, ainsi qu'un moteur stable (et aller relationnel au besoin). (Le post de Brett Taylor de Friendfeed à ce sujet - http://bret.appspot.com/entry/how-friendfeed-uses-mysql)
Toute idée de personnes qui ont fait un quart de travail serait grandement appréciée!
Merci.
3 réponses
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é depuis sql. C'est parce que vous ne pouvez pas distribuer les requêtes avec des jointures de manière performante, donc l'accent est mis sur la dénormalisation à la place.
Cependant, Cassandra 0.6 (bêta officiellement demain, mais vous pouvez construire à partir de la branche 0.6 vous-même si vous êtes impatient) prend en charge Hadoop map / reduce pour analytics, ce qui semble être un bon ajustement pour vous.
Cassandra fournit un excellent support pour ajouter de nouveaux nœuds sans douleur, même à un groupe initial d'un.
Cela dit, à quelques centaines d'Écritures / minute, vous irez bien sur mysql pendant très, très longtemps. Cassandra est beaucoup mieux à être un magasin de clé / valeur (encore mieux, key / columnfamily) mais MySQL est beaucoup mieux à être une base de données relationnelle. :)
Il n'y a pas encore de support django pour Cassandra (ou une autre base de données nosql). Ils parlent de faire quelque chose pour la prochaine version après 1.2, mais basé sur Parler aux développeurs django à PyCon, personne n'est vraiment sûr de ce à quoi cela ressemblera encore.
Si vous êtes un développeur de base de données relationnelle (comme je suis), je suggérerais/soulignerais:
- Obtenez une certaine expérience de travail avec Cassandra avant de vous engager à son utilisation sur un système de production... surtout si ce système de production a un délai difficile pour l'achèvement. Peut-être l'utiliser comme backend pour quelque chose d'abord sans importance.
- Il s'avère plus difficile que prévu de faire des choses simples que je prends pour acquises à propos de la manipulation de données à l'aide de moteurs SQL. Notamment, 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 révélée difficile. En tant que développeur de base de données relationnelle vous venez à la table avec beaucoup de bagages... vous devez être disposé à apprendre à modéliser les données de manière très différente.
Ces choses dites, je recommande fortement de construire quelque chose dans Cassandra. Si vous êtes comme moi, alors cela mettra au défi votre compréhension du stockage de données et vous fera repenser un relationnel-base de données-s'adapte à toutes les situations outlook que je ne savais même pas que j'ai tenue.
Quelques bonnes ressources que j'ai trouvées incluent:
Le Django-cassandra est un mode bêta précoce. Aussi Django n'a pas fait pour les bases de données no-sql. La clé dans Django ORM est basée sur SQL (Django recommande D'utiliser PostgreSQL). Si vous devez utiliser uniquement no-sql (vous pouvez mélanger sql et no-sql dans la même application), vous devez utiliser no-sql ORM (significativement plus lent que SQL orm traditionnel ou l'utilisation directe de no-SQL storage). Ou vous aurez besoin de réécrire complètement django ORM. Mais dans ce cas je ne peux pas présumer, pourquoi vous avez besoin de Django. Peut-être que vous pouvez utiliser autre chose, comme Tornado?