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.