Pregunta

Para un poco de historia - esta pregunta tiene que ver con un proyecto que se ejecuta en una sola instancia EC2 pequeña, y está a punto de migrar a un medio de uno. Los componentes principales son Django, MySQL y un gran número de herramientas de análisis personalizados escrito en Python y Java, lo que hace el pesado levantamiento. La misma máquina se está ejecutando Apache también.

El modelo de datos tiene el siguiente - una gran cantidad de datos en tiempo real entra en juego por streaming desde varios sensores en red, e idealmente, me gustaría establecer un enfoque a largo encuesta en lugar de la encuesta actual cada 15 minutos se acercan ( una limitación de calcular las estadísticas y la escritura en la base de datos en sí). Una vez que los datos proceden de, almaceno la versión cruda en MySQL, deje que las herramientas de análisis pierden en estos datos, y almacenar las estadísticas en otro pocas mesas. Todo esto se representa utilizando Django.

Relacional cuenta que necesitaría -

  • Pedido por [SliceRange en la API de Cassandra parece satisy esto]
  • Agrupar por
  • las relaciones de muchos a muchos entre varias tablas [Cassandra SuperColumns parecen hacer bien para uno a muchos]
  • Esfinge en esto me da un buen motor de texto completo, así que eso 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 lento (y escrituras no son tan caliente tampoco). Yo no quiero tirar un montón de dinero y hardware en ello ahora mismo, y yo preferiría algo que puede escalar fácilmente con el tiempo. Verticalmente escalando MySQL no es trivial en ese sentido (o barato).

Así que, esencialmente, después de haber leído mucho sobre NoSQL y experimentado con cosas como MongoDB, Cassandra y Voldemort, mis preguntas son:

  • En una instancia EC2 medio, Me gustaría ganar algún beneficio en lecturas / escrituras mediante un cambio hacia algo como Cassandra ? Este artículo (pdf) definitivamente parece sugerir que. Actualmente, yo diría que unos pocos cientos de escrituras por minuto serían la norma. Para las lecturas, - ya que los datos cambia cada 5 minutos o así, la invalidación de caché tiene que ocurrir con bastante rapidez. En algún momento, debe ser capaz de manejar un gran número de usuarios al mismo tiempo también. El rendimiento de las aplicaciones actualmente muere en MySQL haciendo algunas une en grandes mesas incluso si se crean los índices - algo que el orden de 32k filas lleva más de un minuto para rendir. (Esto puede ser un artefacto de EC2 virtualiza I / O también). Tamaño de las tablas es alrededor de 4-5 millones de filas, y hay alrededor de 5 dichas tablas.

  • Todo el mundo habla usando Cassandra en varios nodos, teniendo en cuenta el teorema de CAP y consistencia eventual. Pero, para un proyecto que está empezando a crecer, ¿Tiene sentido para implementar un servidor cassandra un nodo ? ¿Hay algunas advertencias? Por ejemplo, puede sustituir MySQL como backend para Django? [Se recomienda este?]

  • Si lo hago cambio, supongo que voy a tener que volver a escribir partes de la aplicación para hacer mucho más "Administrivialidades", ya que tendría que hacer varias búsquedas a recuperar filas.

  • ¿Tendría algún sentido para el uso de MySQL simplemente como un valor del almacén de claves en lugar de un motor relacional, e ir con eso? De esa manera podría utilizar un gran número de APIs estables disponibles, así como un motor estable (y vaya relacional, según sea necesario). (Post de Brett Taylor de Friendfeed en esto - http://bret.appspot.com/ entrada / cómo FriendFeed-usos-mysql )

Cualquier ideas de gente que ha hecho un cambio sería muy apreciada!

Gracias.

¿Fue útil?

Solución

Cassandra y las otras bases de datos distribuidas disponibles en la actualidad no proporcionan el tipo de apoyo consultas ad-hoc que está acostumbrado desde SQL. Esto se debe a que no se puede distribuir consultas con performantly se une, por lo que el énfasis está en la desnormalización en su lugar.

Sin embargo, Cassandra 0.6 (beta oficialmente el día de mañana, pero se puede construir a partir de la rama 0.6 a sí mismo si eres impaciente) apoya mapa Hadoop / reducir para el análisis, que en realidad suena como una buena opción para usted.

Cassandra proporciona un excelente soporte para la adición de nuevos nodos sin dolor, incluso a un primer grupo de uno.

Dicho esto, a unos pocos cientos de escrituras / minuto vas a estar bien en MySQL desde hace mucho, mucho tiempo. Cassandra es mucho mejor en ser una tienda de clave / valor (incluso mejor, clave / columnfamily), pero MySQL es mucho mejor en ser una base de datos relacional. :)

No hay soporte para Django Cassandra (u otra base de datos NoSQL) todavía. Están hablando de hacer algo para la próxima versión 1.2 después, pero en base a hablar con django desarrolladores en PyCon, nadie está realmente seguro de lo que se verá así todavía.

Otros consejos

Si eres un desarrollador de bases de datos relacionales (como yo), me gustaría sugerir / punto de salida:

  • Obtener un poco de experiencia de trabajo con Cassandra antes de comprometerse a su uso en un sistema de producción ... sobre todo si ese sistema de producción tiene una fecha límite duro para su conclusión. Tal vez usarlo como backend para la primera algo sin importancia.
  • Se resultando más difícil de lo que había previsto para hacer cosas simples que dan por sentado acerca de la manipulación de datos utilizando motores SQL. En particular, la indexación de los datos y la clasificación de conjuntos de resultados no es trivial.
  • modelado
  • Datos ha demostrado ser un desafío también. Como desarrollador de base de datos relacional se llega a la mesa con un montón de equipaje ... tiene que estar dispuesto a aprender cómo los datos del modelo de manera muy diferente.

Estas cosas dijo, os recomiendo la construcción de algo en Cassandra. Si eres como yo, a continuación, haciendo así que pondrá a prueba su comprensión de almacenamiento de datos y hará replantearse una perspectiva relacional de base de datos única para todas las situaciones que ni siquiera me di cuenta de que sostenía.

Algunos buenos recursos que he encontrado son:

El Django-Cassandra es un modo beta temprana. También Django no hizo ninguna de las bases de datos SQL. La clave en el ORM de Django se basa en SQL (Django recomienda usar PostgreSQL). Si es necesario utilizar solamente no-SQL (SQL se pueden mezclar y no-SQL en misma aplicación) que necesita para su uso riesgoso ORM no-SQL (es significativamente más lento que SQL ORM tradicional o uso directo de almacenamiento de No-SQL). O tendrá que reescribir completamente lleno ORM de Django. Pero en este caso no puedo presumir, por qué necesita Django. Tal vez se puede usar otra cosa, como Tornado?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top