why when advantages mongodb couchdb ravendb document-database nosql

mongodb - advantages - when to use nosql database



Elección de MongoDb/CouchDb/RavenDb-consejos de rendimiento y escalabilidad (4)

Membase (y el Servidor Couchbase que se lanzará próximamente) manejará fácilmente sus necesidades y brindará escalabilidad dinámica (agregue o elimine nodos al vuelo), replicación con conmutación por error. La capa de almacenamiento en caché de memcached en la parte superior manejará fácilmente 200k ops / sec, y puede escalar linealmente con múltiples nodos para permitir que los datos se conserven en el disco.

Tenemos algunos puntos de referencia recientes que muestran una latencia extremadamente baja (lo que equivale aproximadamente a un alto rendimiento): http://10gigabitethernet.typepad.com/network_stack/2011/09/couchbase-goes-faster-with-openonload.html

No sé qué tan importante es para usted contar con un producto de clase empresarial compatible con ingeniería y recursos de control de calidad, pero eso también está disponible.

Edición: olvidé mencionar que ya hay una interfaz de activador incorporada, y la estamos extendiendo aún más para rastrear cuándo los datos llegan al disco (persisten) o se replican.

Sidra de pera

Estamos buscando una solución de almacenamiento de datos de documentos con solución de fallos en clústeres, para algunas aplicaciones de lectura / escritura intensiva.

Tendremos un promedio de 40K escrituras simultáneas por segundo escritas en la db (con un pico que puede llegar hasta 70,000) y puede que ocurra una cantidad similar de lecturas similares.

También necesitamos un mecanismo para que la db notifique sobre los registros recién escritos (algún tipo de activador a nivel de db).

¿Cuál será una buena opción en términos de una elección adecuada de la base de datos del documento y la planificación de la capacidad relacionada?

Actualizado

Más detalles sobre la expectativa.

  • En promedio, esperamos 40,000 (40K) Número de inserciones (documentos nuevos) por segundo en 3-4 bases de datos / colecciones de documentos.
  • El pico puede subir hasta 120,000 (120K) Inserciones
  • Los insertos deben ser legibles de inmediato, casi en tiempo real
  • Junto con esto, esperamos alrededor de 5000 actualizaciones o eliminaciones por segundo
  • Junto con esto, también esperamos que 500-600 consultas concurrentes accedan a los datos. Estas consultas y planes de ejecución son algo conocidos, aunque es posible que esto deba actualizarse, por ejemplo, una vez en una semana.
  • El sistema debe admitir clústeres de conmutación por error en el lado del almacenamiento

Yo recomendaría MongoDB. Mis requisitos no eran tan altos como los tuyos, pero estaba razonablemente cerca. Suponiendo que utilizará C #, recomiendo el controlador oficial C # de MongoDB y el método InsertBatch con SafeMode activado. Literalmente escribirá datos tan rápido como su sistema de archivos pueda manejar. Algunas advertencias:

  1. MongoDB no admite desencadenadores (al menos la última vez que lo verifiqué).
  2. MongoDB inicialmente almacena los datos en la memoria RAM antes de sincronizarlos con el disco. Si necesita necesidades de durabilidad en tiempo real, es posible que desee establecer fsync más bajo. Esto tendrá un impacto de rendimiento significativo.
  3. El conductor de C # es un poco torpe. No sé si solo soy yo, pero recibo errores extraños cada vez que intento ejecutar operaciones de larga duración con él. El controlador C ++ es mucho mejor y, en realidad, más rápido que el controlador C # (o cualquier otro controlador para esa materia).

Dicho esto, también recomendaría buscar en RavenDB también. Es compatible con todo lo que buscas, pero por mi vida, no pude hacerlo en ningún lugar cerca de Mongo.

La única otra base de datos que se acercó a MongoDB fue Riak . Su backend de Bitcask predeterminado es ridículamente rápido siempre que tenga suficiente memoria para almacenar el espacio de teclas, pero recuerdo que no admite desencadenadores.


si "20,000 escrituras concurrentes" significa inserciones, entonces iría por CouchDB y usaría la api "_changes" para los activadores. Pero con 20.000 escrituras necesitarías también un fragmento estable. Entonces bigcouch mejor que bigcouch un vistazo a bigcouch

Y si las "20.000" escrituras concurrentes consisten en "la mayoría" de las actualizaciones, iría a MongoDB con seguridad, ya que su "actualización en el lugar" es bastante impresionante. Pero luego debe manejar los activadores manualmente, pero usar una colección para actualizar en su lugar un documento general puede ser una solución útil. Nuevamente ten cuidado con los fragmentos.

Finalmente, creo que no puede seleccionar una base de datos solo con concurrencia, necesita planificar la api (cómo recuperaría los datos) y luego ver las opciones disponibles.


  • Estamos buscando una solución de almacenamiento de datos de documentos con solución de fallos en clústeres, para algunas aplicaciones de lectura / escritura intensivas

Riak con el backend LevelDB de Google [aquí hay un impresionante punto de referencia de Google], dado que hay suficiente caché y discos sólidos es muy rápido. Dependiendo de la estructura del documento y de su tamaño (usted mencionó 2KB), tendría que hacer una evaluación comparativa, por supuesto. [Tenga en cuenta que, si puede fragmentar sus datos (desde el punto de vista comercial), no tiene que mantener un rendimiento de 40K / s en un solo nodo]

Otra ventaja con LevelDB es la compresión de datos => almacenamiento. Si el almacenamiento no es un problema, puede desactivar la compresión, en cuyo caso LevelDB volaría literalmente.

Riak con indicaciones secundarias le permite hacer que las estructuras de datos estén tan documentadas como desee => indexe solo los campos por los que le interesa buscar.

El exitoso e indoloro Fail Over es el segundo nombre de Riak. Realmente brilla aquí.

  • También necesitamos un mecanismo para que la db notifique sobre los registros recién escritos (algún tipo de activador a nivel de db)

Puede confiar en pre-commit post-commit hooks pre-commit y post-commit hooks en Riak para lograr ese comportamiento, pero nuevamente, como cualquier disparador, viene con el precio => rendimiento / mantenimiento.

  • Los insertos deben ser legibles de inmediato, casi en tiempo real

Riak escribe en el disco (no hay sorpresas asíncronas de MongoDB) => reliably readable inmediato. En caso de que necesite una mayor consistencia, puede configurar el quórum de Riak para las inserciones: por ejemplo, cuántos nodos deben volver antes de que la inserción se considere exitosa

En general, si la fault tolerance / concurrency / fail over / scalability son importantes para usted, recurriría a los almacenes de datos que están escritos en Erlang, ya que Erlang resuelve estos problemas con éxito desde hace muchos años.