DynamoDB vs MongoDB NoSQL [cerrado]

172

Estoy tratando de averiguar qué puedo usar para un proyecto futuro, planeamos almacenar alrededor de 500k registros por mes en el primer año y tal vez más para los próximos años, esta es una aplicación vertical, por lo que no hay necesidad de usar un base de datos para esto, esa es la razón por la que decidí elegir un almacenamiento de datos noSQL.

La primera opción que me vino a la mente fue mongo db, ya que es un producto muy maduro con mucho apoyo de la comunidad pero, por otro lado, obtuvimos un producto completamente nuevo que ofrece un servicio administrado con el máximo rendimiento, desarrollaré esto aplicación, pero no hay un plan de mantenimiento (al menos por ahora), así que creo que será una gran ventaja ya que Amazon proporciona una forma elástica de escalar.

Mi principal preocupación es sobre la estructura de consulta, todavía no he examinado las capacidades de consulta de dynamoDB, pero dado que es un almacenamiento de datos ak / v, creo que esto podría ser más limitado que mongo db.

Si alguien tuvo la experiencia de trasladar un proyecto de mongoDB a DynamoDB, cualquier consejo será totalmente apreciado.

Jack el destripador
fuente
3
Si desea asesoramiento sobre la estructura de consulta, le sugiero que proporcione un ejemplo de su esquema junto con sus casos de uso para acceder a los datos. Sin estos, es difícil hacer un juicio sobre el ajuste.
James Wahlin
De hecho, la forma en que consulta los datos podría influir dramáticamente en la selección de db de backend. Cuán jerárquica sería mi pregunta número 1.
zanlok
3
Me sorprende que esta pregunta no haya sido cerrada al clasificar a las personas SO. Por lo general, las preguntas que buscan asesoramiento se cierran porque no piden ayuda con un problema muy específico.
LS

Respuestas:

67

Recientemente migré mi MongoDB a DynamoDB, y escribí 3 blogs para compartir algo de experiencia y datos sobre el rendimiento y el costo.

Migrar de MongoDB a AWS DynamoDB + SimpleDB

7 razones por las que debe usar MongoDB sobre DynamoDB

3 razones por las que debe usar DynamoDB sobre MongoDB

Mason Zhang
fuente
gracias por publicar sus artículos aquí que me ayudaron a tener una visión más clara y eso definitivamente me ayudará cuando haga una decisión
jack.the.ripper
1
Al leer las tres razones por las que debe usar Dynamo sobre Mongo, hay una compañía que ofrece un servicio administrado que es más costoso en comparación con DynamoDB, pero que podría tomarse en consideración en caso de que no tenga una persona a cargo del mantenimiento de NOSQL. , el nombre de la empresa es mongoLab
jack.the.ripper
2
@Pedro Muchas gracias por el recordatorio. Tal vez estoy usando MongoDB de manera ineficiente. Tengo 1,4 millones de registros y ocupé un disco 8G, pero después de transferirlo a DynamoDB, ocupo solo 300M de almacenamiento. Es posible que necesite una prueba y ver cuál es el almacenamiento si migro esos datos a MongoLab :)
Mason Zhang
1
¿Están rotos los enlaces?
fedorqui 'así que deja de dañar'
@MasonZhang Será muy interesante ver cuál es el almacenamiento si migra esos datos a MongoLab.
fuiiii
164

Sé que esto es viejo, pero aún aparece cuando buscas la comparación. Estábamos usando Mongo, nos hemos mudado casi por completo a Dynamo, que es nuestra primera opción ahora. No porque tenga más funciones, no las tiene. Mongo tiene un mejor lenguaje de consulta, puede indexar dentro de una estructura, hay muchas cosas pequeñas. La superioridad de Dynamo está en lo que el OP declaró en su comentario: es fácil. No tiene que ocuparse de ningún servidor. Cuando comienzas a configurar una solución fragmentada de Mongo, se complica. Puede ir a una de las empresas de hosting, pero tampoco es barato. Con Dynamo, si necesita más rendimiento, simplemente haga clic en un botón. Puede escribir scripts para escalar automáticamente. Cuando llegue el momento de actualizar Dynamo, ya está hecho. Eso es mucho estrés precioso y tiempo no gastado. Si no lo haces

Así que ahora vamos a Dynamo por defecto. Mongo tal vez, si la estructura de datos es lo suficientemente complicada como para justificarla, pero probablemente volveríamos a una base de datos SQL. Dynamo es obtuso, realmente necesitas pensar en cómo lo vas a construir, y es probable que uses Redis en Elasticcache para que funcione para cosas complejas. Pero seguro que es bueno no tener que cuidarlo. Usted codifica Eso es.

CargoMeister
fuente
35
Si uno tiene que comparar una base de datos con otra, solo debe comparar las características de la base de datos. La solución alojada no es una función de base de datos. Si está buscando un MongoDB alojado, vaya a MongoHQ y ellos harán todo el trabajo duro que puede evitar mientras se concentra en su trabajo principal.
Kabeer
12
Es cierto, aunque la comparación de costos inicial que hicimos mostró que Dynamo es un buen negocio. El otro problema es que si tiene que aumentar / disminuir el tamaño de la dinamo, es hacer clic en un botón. Si tiene que agregar un disco o cambiar el tamaño de un servidor mongo, hay un tiempo de inactividad involucrado, ya sea que tenga que hacerlo, o alguien más.
CargoMeister
@Kabeer I 100% estoy de acuerdo técnicamente con usted, pero en el mundo real todo el paquete es importante para tomar una decisión comercial. En definitiva, esta es una decisión comercial.
poitroae
59

Con 500k documentos, no hay razón para escalar en absoluto. Una computadora portátil típica con un SSD y 8 GB de RAM puede hacer fácilmente 10 millones de registros, por lo que si está tratando de elegir debido a la escala, su elección realmente no importa. Te sugiero que elijas lo que más te gusta y, quizás, dónde puedes encontrar la mayor cantidad de soporte en línea.

Derick
fuente
Sí, mi mayor preocupación es la ampliación y el mantenimiento a lo largo del tiempo, para ser honesto personalmente. Siento que MongoDB puede hacer el trabajo en el que estoy pensando en términos de mantenimiento a medio y largo plazo
jack.the.ripper
10
Derick, otro factor importante en la escala es la utilización, no solo el recuento de documentos o el tamaño de la base de datos. @jack no "siente" pero confía en las pruebas, incluida la plataforma y el hardware de la implementación final; pasar una semana rellenando un par de variantes de db con datos y evaluaciones comparativas debería conducir a decisiones informadas que ahorren mucho dolor.
zanlok
3
Proporcionar un producto / servicio profesional va mucho más allá de lo que una simple solución de "esto puede hacer eso". El hecho de que una máquina cheapo pueda ejecutar Linux, MongoDB y millones de registros casi sin dinero no equivale a un gran rendimiento en el mundo real. Los registros de 500K (con un esquema SIMPLE) probablemente serían un buen candidato para DynamoDB simplemente porque el OP no tendría ningún costo de mantenimiento (al menos para el hardware) y el cargo mensual probablemente sería mucho menor que el costo de un servidor en el transcurso de uno o dos años
cbmeeks
21

Para obtener una rápida comparación general, realmente me gusta este sitio web, que tiene muchas páginas de comparación, por ejemplo, AWS DynamoDB vs MongoDB; http://db-engines.com/en/system/Amazon+DynamoDB%3BMongoDB

AnneTheAgile
fuente
2
¡Gracias por el enlace! Nunca he estado antes en db-engines.com. Gran sitio!
Tom Hert
16

Respuesta corta: comience con SQL y agregue NoSQL solo cuando sea necesario. (a menos que no necesite nada más que consultas muy simples)

Mi experiencia personal: no he usado MongoDB para consultas, pero a partir de abril de 2015, DynamoDB todavía está muy paralizado cuando se trata de algo más allá de las consultas más básicas de clave / valor. Me encantan las cosas básicas, pero si quieres un lenguaje de consulta, busca una solución de base de datos SQL real.

En DynamoDB puede consultar en un hash o en una clave de hash y rango, y puede tener múltiples índices globales secundarios. Estoy haciendo consultas en una sola tabla con 4 posibles parámetros de filtro y ordenando los resultados, esto es compatible (apenas) mediante el uso de índices secundarios globales con expresiones de filtro. El problema surge cuando intenta obtener los resultados totales que coinciden con el filtro, no solo puede buscar los primeros 10 elementos que coinciden con el filtro, sino que verifica 10 elementos y puede obtener 0 resultados válidos que lo obligan a mantener escaneo desde la tecla Continuar: duele el cuello y consume demasiado de la cuota de lectura de la tabla para un escenario simple.

Para ser específico sobre el problema de límite con los filtros en la consulta, esto es de los documentos ( http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html#ScanQueryLimit ):

En respuesta, DynamoDB devuelve todos los resultados coincidentes dentro de
El alcance del valor límite. Por ejemplo, si emite una consulta
o una solicitud de escaneo con un valor límite de 6 y sin filtro
expresión, la operación devuelve los primeros seis elementos en el 
tabla que coincide con los parámetros de solicitud. Si también proporciona un
FilterExpression, la operación devuelve los elementos dentro de 
primeros seis elementos en la tabla que coinciden con los requisitos del filtro.

Mi conclusión es que las consultas que involucran FilterExpressions solo se pueden usar en muy raras ocasiones y no son escalables porque cada consulta puede leer fácilmente la mayor parte o la totalidad de su tabla, que consume demasiadas unidades de lectura DynamoDB. Una vez que use demasiadas unidades de lectura, se acelerará y verá un bajo rendimiento.

Opinión de expertos: en la cumbre de AWS el 9 de abril de 2015, Brett Hollman, Gerente de Arquitectura de Soluciones, AWS en su charla sobre la ampliación a sus primeros 10 millones de usuarios aboga por comenzar con una base de datos SQL y luego usar NoSQL solo cuando tenga sentido. Porque tarde o temprano probablemente necesitará un servidor SQL en algún lugar de su pila. Sus diapositivas están aquí: http://www.slideshare.net/AmazonWebServices/deep-dive-scaling-up-to-your-first-10-million-users Ver diapositiva 28.

Deemoe
fuente
Realmente debería comprobar lo fácil que es integrar cloudsearch con flujos dynamodb y lambda para llegar a consultas de texto completo o basadas en la ubicación.
MrTJ
44
Elija su base de datos de acuerdo a sus necesidades. Esta no es una elección entre SQL y noSQL, sino entre una base de datos orientada a documentos, una base de datos orientada a gráficos, una base de datos de valores clave, RDMBS ... No hay una opción de oro, y SQL ciertamente no lo es.
vcarel
14

Elegimos una combinación de Mongo / Dynamo para un producto sanitario. Básicamente, mongo permite una mejor búsqueda, pero el Dynamo alojado es excelente porque cumple con HIPAA sin ningún trabajo adicional. Por lo tanto, alojamos la parte de mongo sin datos personales en una configuración estándar y permitimos que Amazon se ocupe de la parte de HIPAA en términos de infraestructura. Podemos consultar ciertos elementos de mongo que muestran documentos con punteros (ID) del documento Dynamo relacionado.

La razón principal por la que elegimos hacer esto usando mongo en lugar de alojar toda la aplicación en dynamo fue por 2 razones. Primero, necesitábamos realizar búsquedas basadas en la ubicación en las que Mongo es excelente y, en ese momento, Dynamo no lo era, pero ahora tienen una opción.

En segundo lugar, algunos documentos no estaban estructurados y no sabíamos con anticipación cuáles serían los datos, así que, por ejemplo, digamos que el usuario ingresa un documento en la colección "formulario" de esta manera: {"nombre de usuario": "usuario1", " correo electrónico ":" [email protected] "}. Y otro usuario pone esto en la misma colección {"teléfono": "813-555-3333", "ubicación": [28.1234, -83.2342]}. Con mongo podemos buscar cualquiera de estos campos dinámicos y desconocidos en cualquier momento, con Dynamo, puede hacer esto, pero tendría que hacer un índice cada vez que se agrega un nuevo campo que desea buscar. Entonces, si nunca antes ha tenido un campo de teléfono en su documento de Dynamo y, de repente, alguien lo agrega, es completamente inescrutable.

Ahora esto trae a colación otro punto en el que has mencionado. A veces, elegir la solución adecuada para el trabajo no siempre significa elegir el mejor producto para el trabajo. Por ejemplo, puede tener un cliente que necesita y utilizará el sistema que creó durante más de 10 años. Optar por una solución SaaS / IaaS que sea lo suficientemente buena como para hacer el trabajo puede ser una mejor opción, ya que puede confiar en que Amazon mantendrá y mantendrá sus sistemas a largo plazo.

Steffan Perry
fuente
9

He trabajado en ambos y soy un fanático de ambos.

Pero debe comprender cuándo usar qué y con qué propósito.

No creo que sea una buena idea mover toda su base de datos a DynamoDB, porque realizar consultas es difícil, excepto en las claves primaria y secundaria, la indexación es limitada y el escaneo en DynamoDB es doloroso.

Optaría por un tipo de base de datos híbrida, donde deberían existir datos extensos que se puedan consultar, MongoDB, con todas sus características, nunca se sentiría obligado a proporcionar mejoras o modificaciones.

DynamoDB es extremadamente rápido (más rápido que MongoDB), por lo que DynamoDB se usa a menudo como una alternativa a las sesiones en aplicaciones escalables. Las mejores prácticas de DynamoDB también sugieren que si hay muchos datos que se usan menos, muévalos a otra tabla.

Supongamos que tiene artículos o feeds. Es más probable que las personas busquen cosas de la semana pasada o de este mes. Es muy raro que las personas visiten datos de dos años. Para estos fines, DynamoDB prefiere tener los datos almacenados por mes o años en diferentes tablas.

DynamoDB es aparentemente escalable, algo que tendrá que hacer manualmente en MongoDB. sin embargo, perdería el rendimiento de DynamoDB si no comprende la partición de rendimiento y cómo funciona el escalado detrás de escena.

DynamoDB debe usarse donde la velocidad es crítica, MongoDB, por otro lado, tiene demasiadas manos y características, algo que le falta a DynamoDB.

por ejemplo, puede tener un conjunto de réplicas de MongoDB de tal forma que una réplica contenga una instancia de datos de 8 (o lo que sea) horas de antigüedad. Realmente útil, si arruinaste algo grande en tu base de datos y quieres obtener los datos como están antes.

Sin embargo, esa es mi opinión.

Rahul Kumar
fuente
1
¿Y una combinación de Redis y MongoDB? Eso es genial, creo.
ismaestro
Supongo que sí, no tengo experiencia práctica en Redis, pero seguro que es ampliamente utilizado debido a su rendimiento, en las bases de datos de memoria casi siempre tienen un mejor rendimiento que las bases de datos basadas en disco. Así que creo que los datos a los que se debe acceder con gran demanda y alta frecuencia deberían ir a Redis. Por otro lado, para grandes datos letárgicos se debe utilizar MongoDB.
Rahul Kumar
7

Tenga en cuenta que solo he experimentado con MongoDB ...

Por lo que he leído, DynamoDB ha recorrido un largo camino en términos de características. Solía ​​ser un almacén de valores clave súper básico con capacidades de almacenamiento y consulta extremadamente limitadas. Desde entonces, ha crecido, ahora admite tamaños de documentos más grandes + soporte JSON e índices secundarios globales . La brecha entre lo que ofrece DynamoDB y MongoDB en términos de características se reduce cada mes. Las nuevas características de DynamoDB se expanden aquí .

Gran parte de las comparaciones entre MongoDB y DynamoDB están desactualizadas debido a la reciente incorporación de las características de DynamoDB. Sin embargo, esta publicación ofrece algunos otros puntos convincentes para elegir DynamoDB, a saber, que es simple, de bajo mantenimiento y, a menudo, de bajo costo. Otra discusión aquí sobre las opciones de la base de datos fue interesante de leer, aunque un poco antigua.

Mi conclusión: si está haciendo consultas serias a la base de datos o trabajando en idiomas no compatibles con DynamoDB, use MongoDB. De lo contrario, quédate con DynamoDB.

AndrewSouthpaw
fuente