ventajas usar español engine desventajas datos cuando cache mongodb cassandra redis couchdb database

usar - redis vs mongodb español



¿Qué debería elegir: MongoDB/Cassandra/Redis/CouchDB? (8)

Estamos desarrollando un proyecto realmente grande y me preguntaba si alguien puede darme algún consejo sobre qué back-end DB deberíamos elegir.

Nuestro sistema está compuesto por 1100 dispositivos electrónicos que envían una señal a un servidor central y luego el servidor almacena la información de la señal (la señal tiene una longitud de aproximadamente 35 bytes). Sin embargo, estos dispositivos enviarán aproximadamente 3 señales por minuto cada uno, por lo que si hacemos números, serán 4.752.000 nuevos registros / día en la base de datos, y un total de 142.560.000 nuevos registros / mes.

Necesitamos un DB Backend que se ilumine rápido y confiable. Por supuesto, necesitamos hacer una minería de datos compleja en esa base de datos. Estamos investigando el MongoDB / Cassandra / Redis / CouchDB, sin embargo, los sitios web de documentación aún se encuentran en etapas iniciales.

¿Alguna ayuda? Ideas?

¡Muchas gracias!


CouchDB es muy confiable, proporciona una excelente durabilidad y experimentará una carga de CPU muy baja. También es excelente para replicar entre múltiples nodos, ya sea a pedido o de forma continua.

Gracias a sus capacidades de replicación y API RESTful (usa HTTP para su API), puede escalar horizontalmente con bastante facilidad utilizando herramientas maduras. (Nginx o Apache para proxying inverso, equilibradores de carga HTTP, etc.)

Escribe funciones de mapa / reducir en JavaScript para precomputar consultas. Los resultados se construyen de forma incremental en el disco, lo que significa que solo es necesario calcularlos una vez por señal. En otras palabras, las consultas pueden ser realmente rápidas porque solo tiene que hacer cálculos en los datos de señal grabados desde la última vez que ejecutó la consulta.

CouchDB intercambia espacio en disco para el rendimiento, por lo que puede esperar utilizar mucho espacio en disco. Sus consultas pueden ser muy rápidas y ahorrar espacio en disco si las implementa correctamente.

Prueba CouchDB.

Vea por qué los grandes científicos de colisionador de hadrones utilizan CouchDB y CouchDB en la BBC como una tienda de clave-valor de centro de datos tolerante a fallos y escalable



Está buscando un almacén de datos que pueda permitir escrituras "rápidas" (los datos persisten en el disco) y la extracción de datos ocurrirá en una etapa posterior (este es el ciclo de LECTURA). Además, teniendo en cuenta los números que declara, resulta que va a recolectar todos los 159MB de información por día, o aproximadamente 5GB por mes.

En este caso, ¿por qué no miras a Redis?

Siempre puede archivar el archivo de datos Redis diario y consultarlo más adelante (si le preocupa cargar 5GB o una cantidad mayor de espacio RAM, entonces este archivo podría ser una solución alternativa)

Redis es bastante rápido, según los números publicados en ese sitio. Espero que esto ayude. Kiran


Gran parte de la respuesta depende de lo que quieras hacer con ella una vez que se haya recopilado. Almacenar una gran cantidad de datos es fácil: simplemente dúmbalo en archivos de registro, sin necesidad de una base de datos. Por otro lado, si desea realizar análisis complejos y minería de datos en él, entonces una base de datos es útil.

La siguiente pregunta es qué tipo de análisis vas a hacer. ¿Se realizará en un subconjunto de los datos que tiene una propiedad en particular, la última hora / día / semana / mes solamente, pueden los datos agregados o de alguna manera precalculados? En otras palabras, ¿necesita acceso a todo el conjunto de datos en la forma en que se recopila? ¿Puedes archivar datos cuando sea demasiado viejo para ser interesante? ¿Puede agregar los datos y realizar el análisis en la agregación?

Según mi experiencia al trabajar con análisis publicitarios (recopilación de miles de millones de puntos de datos sobre exposiciones publicitarias), la agregación es clave. Usted recopila datos brutos, los desinfecta y luego los coloca en una base de datos como MongoDB, Cassandra o incluso MySQL que le permiten hacer actualizaciones y consultas. Luego agrega periódicamente los datos y los elimina de la base de datos (pero archiva los datos brutos, puede necesitarlos más adelante).

La agregación básicamente hace todas las preguntas que desea hacer sobre los datos y las guarda en una forma que hace que sea fácil recuperar la respuesta para una pregunta en particular. Digamos que quiere saber en qué día de la semana tiene más X. La implementación ingenua de esto sería mantener todas las señales grabadas en una tabla enorme y hacer una consulta que sume todas las filas que tienen X. Como el número de recopilaciones las señales crecen, esta consulta tomará más y más tiempo. Ninguna cantidad de indexación, fragmentación u optimización ayudará con esto. En cambio, cada día / hora / minuto (dependiendo del caso de uso exacto y cuán actualizado debe estar su informe) observa las nuevas señales que ha grabado, y por cada X incrementa el contador que registra cuántas X hubo lunes, si es lunes, martes si es martes y así sucesivamente. De esta forma, más adelante podrá recuperar el conteo de cada día de la semana y compararlos. Haga esto para todas las preguntas que desee poder responder, y luego elimine las señales de la base de datos (pero nuevamente, conserve los datos brutos).

El tipo de base de datos en el que registra los agregados puede ser el mismo en el que almacena las señales entrantes, pero no necesita ser muy elegante. Almacenará claves que representan una respuesta particular, y valores que generalmente son solo números.

En el almacenamiento de datos de la vieja escuela, la base de datos en la que almacena las señales entrantes se denomina OLTP (para procesamiento transaccional en línea) y la base de datos donde almacena los agregados se llama OLAP (para procesamiento analítico en línea). OLTP está optimizado para la inserción y OLAP está optimizado para realizar consultas. Los términos son antiguos y cuando las personas los escuchan, tienden a pensar inmediatamente en SQL y en los ciclos de estrellas y todo eso. Quizás no debería usarlos, pero son términos convenientes.

De todos modos, para OLTP quieres algo que sea rápido en la inserción de datos, pero también algo que permita indexar los datos y buscar cosas. La agregación es muy útil gracias a una base de datos que realiza la mitad del trabajo de sumar y encontrar máximos y mínimos. Realmente me gusta MongoDB porque es muy fácil de configurar y trabajar. La información con la que trabajo tiende a ser desordenada y no todos los artículos tienen el mismo conjunto de propiedades, por lo que perdonar la ausencia de esquemas de Mongo es una bendición. Por otro lado, sus datos suenan mucho más uniformes, por lo que Mongo tal vez no le daría tantos beneficios. Sin embargo, no pase por alto las buenas y viejas bases de datos relacionales. Si vas a hacer un montón de sumas y cosas así, entonces SQL es genial, para eso está hecho.

Para OLAP algo mucho más simple, una tienda de valores clave es todo lo que necesita. Uso Redis porque también es muy fácil trabajar con él y configurarlo. También le permite almacenar más que valores escalares, lo cual es conveniente. A veces su valor es en realidad una lista, o un hash, en la mayoría de los almacenes de clave-valor que tiene que codificar dichos valores, pero Redis lo maneja de forma nativa. La desventaja de Redis es que no puedes hacer consultas ("como en darme todas las filas que tienen este valor para Y"), tienes que mantener los índices en tus datos tú mismo. Por otro lado, no necesitará muchos índices ya que las respuestas a todas sus preguntas han sido precalculadas, todo lo que necesita hacer es buscar la respuesta con una clave definida por la pregunta. Para la pregunta anterior, qué día de la semana tiene la mayor cantidad de X que busca el número de X de trabajo el lunes, el martes, etc. quizás las haya almacenado como X: lunes, X: martes, etc.

En conclusión: MongoDB y Redis funcionan muy bien para mí. No creo que MongoDB sea muy bueno para su caso de uso, en su lugar creo que en realidad podría beneficiarse más de una base de datos SQL tradicional (pero depende, si sus datos son realmente simples, quizás podría usar Redis hasta el final). Lo más importante es no cometer el error de pensar que necesita tener los datos en una base de datos y conservarlos para siempre. La agregación y eliminación de datos antiguos es clave.


He usado MongoDB de Incanter y me ha gustado. Aunque no puedo hablar de la velocidad con conjuntos de datos tan grandes, Clojure (en el que se basa Incanter) es muy confiable en términos de gestión de transacciones. Incanter también proporciona algunas excelentes herramientas de análisis, por lo que si planea analizar todos esos datos, MongoDB + Incanter podría ser una combinación poderosa.


No permita que la escala espacial (más de 1000 dispositivos) lo engañe en cuanto a la escala computacional y / o de almacenamiento. Una docena de insertos de 35 bytes por segundo es una carga de trabajo trivial para cualquier DBMS convencional, incluso ejecutándose en hardware de gama baja. Del mismo modo, 142 millones de registros por mes son solo del orden de 1 ~ 10 gigabytes de almacenamiento por mes, sin compresión, incluidos los índices.

En tu pregunta, dijiste:

"Todo se trata de confiabilidad, escalabilidad y velocidad. Es muy importante que la solución se pueda escalar fácilmente (MongoDB autosharding?) Simplemente generando más nodos, y la velocidad también es muy importante.

¿Confiabilidad? Cualquier DBMS convencional puede garantizar esto (suponiendo que quiera decir que no va a dañar sus datos, y no va a colapsar; consulte mi análisis del teorema de CAP en la parte inferior de esta respuesta). ¿Velocidad? Incluso con una sola máquina, 10 ~ 100 veces esta carga de trabajo no debería ser un problema. Escalabilidad? Al ritmo actual, los datos de un año completo, sin comprimir, incluso completamente indexados, encajarían fácilmente dentro de los 100 gigabytes de espacio en disco (del mismo modo, ya hemos establecido que la tasa de inserción no es un problema).

Como tal, no veo ninguna necesidad clara de una solución exótica como NoSQL, o incluso una base de datos distribuida: una base de datos simple y vieja como MySQL estaría bien. Si le preocupa la conmutación por error, simplemente configure un servidor de respaldo en una configuración de maestro-esclavo. Si hablamos 100 o 1000 veces de la escala actual, solo particione horizontalmente algunas instancias basadas en la ID del dispositivo de recolección de datos ( es decir, {partition index} = {device id} modulo {number of particiones}).

Tenga en cuenta que dejar los confines seguros y cómodos del mundo de las bases de datos relacionales significa abandonar tanto su modelo de representación como su rico conjunto de herramientas . Esto hará que su "compleja data-mining" sea mucho más difícil: no solo necesita colocar datos en la base de datos, también debe sacarlos.

Dicho todo esto, MongoDB y CouchDB son extraordinariamente simples de implementar y trabajar. También son muy divertidos y te harán más atractivo para cualquier cantidad de personas (¡no solo para programadores, ejecutivos también!).

La sabiduría común es que, de las tres soluciones NoSQL que sugirió, Cassandra es la mejor para el alto volumen de inserción (por supuesto, en términos relativos, no creo que tenga alto volumen de inserción, esto fue diseñado para ser utilizado por Facebook ) ; esto es contrarrestado por ser más difícil de trabajar. Así que, a menos que tenga algunos requisitos extraños que no mencionó, recomendaría que no lo haga, para su caso de uso.

Si se establece positivamente en una implementación de NoSQL, es posible que desee considerar el teorema de CAP. Esto te ayudará a decidir entre MongoDB y CouchDB. Aquí hay un buen enlace: http://blog.nahurst.com/visual-guide-to-nosql-systems . Todo se reduce a lo que quiere decir con "confiabilidad": MongoDB intercambia disponibilidad por coherencia, mientras que CouchDB intercambia coherencia por disponibilidad . (Cassandra le permite refinar esta compensación, por consulta, especificando cuántos servidores deben escribirse / leerse para que una escritura / lectura sea exitosa; ACTUALIZACIÓN: Ahora, también puede hacerlo CouchDB, ¡con BigCouch ! Muy emocionante ...)

La mejor de las suertes en tu proyecto.


Si te gusta el aspecto de Cassandra por su capacidad diseñada desde el principio para escalar horizontalmente, sintonizar consistencia con la disponibilidad y demás, entonces quizás también quieras mirar a Riak , que tiene un conjunto de características similar pero un enfoque diferente. .


~ 3000 señales / minuto = 50 escrituras / s que cualquiera de estos sistemas podrá manejar fácilmente.

Sin embargo, Cassandra probablemente funcione mejor a medida que su conjunto de datos crezca más que la memoria, y la integración de Hadoop lo ayudará con su extracción de datos.