Cambiar de MySQL a Cassandra-Pros/Contras?
django migration (3)
Cassandra y las otras bases de datos distribuidas disponibles en la actualidad no ofrecen el tipo de soporte de consultas ad-hoc al que está acostumbrado desde sql. Esto se debe a que no puede distribuir consultas con combinaciones de manera performante, por lo que se hace hincapié en la desnormalización.
Sin embargo, Cassandra 0.6 (beta oficialmente saldrá mañana, pero puede construir desde la rama 0.6 usted mismo si está impaciente) es compatible con Hadoop map / reduce para análisis, que realmente suena como una buena opción para usted.
Cassandra proporciona una excelente compatibilidad para agregar nuevos nodos sin dolor, incluso a un grupo inicial de uno.
Dicho esto, a unos pocos cientos de escrituras / minuto estarás bien en mysql durante mucho, mucho tiempo. Cassandra es mucho mejor en ser una tienda clave / valor (incluso mejor, key / columnfamily) pero MySQL es mucho mejor en ser una base de datos relacional. :)
Aún no hay soporte django para Cassandra (u otra base de datos nosql). Están hablando de hacer algo para la próxima versión después del 1.2, pero basado en hablar con desarrolladores de django en Pycon, nadie está realmente seguro de cómo será.
Por un poco de antecedentes: esta pregunta se refiere a un proyecto que se ejecuta en una única instancia pequeña de EC2 y está a punto de migrar a una versión mediana. Los principales componentes son Django, MySQL y una gran cantidad de herramientas de análisis personalizadas escritas en python y java, que hacen el trabajo pesado. La misma máquina ejecuta Apache también.
El modelo de datos tiene el siguiente aspecto: una gran cantidad de datos en tiempo real se transmiten desde diversos sensores en red, e idealmente, me gustaría establecer un enfoque de encuesta larga en lugar de la encuesta actual cada 15 minutos (una limitación de estadísticas informáticas y escritura en la base de datos en sí). Una vez que ingresan los datos, almaceno la versión en bruto en MySQL, dejo que las herramientas de análisis se pierdan en estos datos y almacene las estadísticas en otras pocas tablas. Todo esto se representa con Django.
Funciones relacionales que necesitaría -
- Ordenar por [SliceRange en la API de Cassandra parece satisfacer esto]
- Agrupar por
- Muchas relaciones entre muchas mesas [Cassandra SuperColumns parecen funcionar bien para uno a muchos]
- Sphinx en esto me da un buen motor de texto completo, por lo que es una necesidad también. [En Cassandra, el proyecto Lucandra parece satisfacer esta necesidad]
Mi principal problema es que las lecturas de datos son extremadamente lentas (y las escrituras tampoco son demasiado calientes). No quiero arrojar mucho dinero y hardware en este momento, y preferiría algo que pueda escalar fácilmente con el tiempo. Escalar verticalmente MySQL no es trivial en ese sentido (o es barato).
Entonces, esencialmente, después de haber leído mucho sobre NOSQL y haber experimentado con cosas como MongoDB, Cassandra y Voldemort, mis preguntas son:
En una instancia mediana de EC2, ¿obtendría algún beneficio en las lecturas / escrituras al cambiar a algo como Cassandra ? Este artículo (pdf) definitivamente parece sugerir eso. Actualmente, diría que unos cientos de escrituras por minuto serían la norma. Para lecturas: dado que los datos cambian cada 5 minutos aproximadamente, la invalidación de la caché debe ocurrir bastante rápido. En algún momento, debería ser capaz de manejar una gran cantidad de usuarios concurrentes también. El rendimiento de la aplicación actualmente se elimina en MySQL haciendo algunas combinaciones en tablas grandes, incluso si se crean índices, algo del orden de 32k filas tarda más de un minuto en renderizarse. (Esto también puede ser un artefacto de E / S virtualizada EC2). El tamaño de las tablas es de alrededor de 4-5 millones de filas, y hay alrededor de 5 de esas tablas.
Todo el mundo habla sobre el uso de Cassandra en múltiples nodos, dado el teorema CAP y la coherencia final. Pero, para un proyecto que recién comienza a crecer, ¿tiene sentido implementar un servidor Cassandra de un nodo ? ¿Hay alguna advertencia? Por ejemplo, ¿puede reemplazar a MySQL como back-end para Django? [¿Esto es recomendado?]
Si cambio, supongo que tendré que volver a escribir partes de la aplicación para hacer mucho más "administrivia", ya que tendría que hacer múltiples búsquedas para buscar filas.
¿Tendría algún sentido utilizar MySQL como un almacén de valores clave en lugar de usar un motor relacional, e ir con eso? De esa forma podría utilizar una gran cantidad de API estables disponibles, así como también un motor estable (e ir relacional según sea necesario). (Publicación de Brett Taylor de Friendfeed en esto - http://bret.appspot.com/entry/how-friendfeed-uses-mysql )
¡Cualquier idea de las personas que han hecho un cambio sería muy apreciada!
Gracias.
El Django-cassandra es un modo beta temprano. También Django no hizo para las bases de datos sin sql. La clave en Django ORM se basa en SQL (Django recomienda utilizar PostgreSQL). Si necesita utilizar SOLAMENTE no-sql (puede mezclar SQL y no-SQL en la misma aplicación), debe utilizar ORM sin SQL de forma arriesgada (es significativamente más lento que el orm SQL tradicional o el uso directo de almacenamiento sin SQL). O necesitarás reescribir completamente el django ORM. Pero en este caso no puedo suponer, por qué necesita Django. ¿Tal vez puedas usar algo más, como Tornado?
Si eres un desarrollador de bases de datos relacionales (como yo), te sugeriría / señalaría:
- Obtenga experiencia trabajando con Cassandra antes de comprometerse con su uso en un sistema de producción ... especialmente si ese sistema de producción tiene una fecha límite difícil para su finalización. Tal vez usarlo como back-end para algo sin importancia primero.
- Está resultando más desafiante de lo que había anticipado para hacer cosas simples que doy por sentado sobre la manipulación de datos usando motores SQL. En particular, los datos de indexación y los conjuntos de resultados de clasificación no son triviales.
- El modelado de datos también ha demostrado ser desafiante. Como desarrollador de bases de datos relacionales, usted llega a la mesa con un montón de equipaje ... debe estar dispuesto a aprender a modelar los datos de forma muy diferente.
Dicho esto, recomiendo construir algo en Casandra. Si eres como yo, hacerlo desafiará tu comprensión del almacenamiento de datos y te hará reconsiderar una perspectiva de base de datos relacional para todas las situaciones que ni siquiera sabía que tenía.
Algunos buenos recursos que he encontrado incluyen: