2010-08-02 19 views
49

¿Qué escenario tiene más sentido: alojar varias instancias EC2 con MongoDB instalado, o más bien usar el servicio web Amazon SimpleDB?MongoDB en el servidor EC2 o AWS SimpleDB?

Al tener varias instancias de EC2 con MongoDB tengo el problema de configurar la instancia por mi cuenta.

Cuando uso SimpleDB tengo el problema de bloquearme en la estructura de datos de Amazons ¿verdad?

¿Qué diferencias hay en cuanto al desarrollo? ¿No debería ser capaz de simplemente cambiar el DAO de mis capas de servicio, ya sea para escribir en MongoDB o AWS SimpleDB?

Respuesta

58

SimpleDB tiene algunas limitaciones de escalabilidad. Solo puede escalar por fragmentación y tiene una mayor latencia que mongodb o cassandra, tiene un límite de rendimiento y tiene un precio más alto que otras opciones. La escalabilidad es manual (debe fragmentar).

Si necesita opciones de consulta más amplias y tiene una tasa de lectura alta y no tiene tantos datos, mongodb es mejor. Pero para mayor durabilidad, debe usar al menos 2 instancias de servidor mongodb como maestro/esclavo. De lo contrario, puede perder el último minuto de sus datos. La escalabilidad es manual. Es mucho más rápido que simpledb. Autosharding se implementa en la versión 1.6.

Cassandra tiene opciones de consulta débiles pero es tan duradero como postgresql. Es tan rápido como mongo y más rápido en un tamaño de datos más alto. Las operaciones de escritura son más rápidas que las operaciones de lectura en cassandra. Se puede escalar automáticamente disparando instancias de ec2, pero tienes que modificar un poco los archivos de configuración (si no recuerdo mal). Si tienes terabytes de datos, Casandra es tu mejor opción. No es necesario fragmentar sus datos, fue diseñado distribuido desde el primer día. Puede tener cualquier número de copias para todos sus datos y, si algunos servidores están muertos, devolverá automáticamente los resultados de los vivos y distribuirá los datos del servidor muerto a otros. Es altamente tolerante a fallas. Puede incluir cualquier cantidad de instancias, es mucho más fácil escalar que otras opciones. Tiene fuertes opciones de cliente .net y java. Tienen agrupación de conexiones, equilibrio de carga, marcado de servidores muertos, ...

Otra opción es hadoop para big data pero no es tan realtime como otros, puede usar hadoop para datawarehousing. Ni cassandra ni mongo tienen transacciones, por lo que si necesitas transacciones postgresql es una mejor opción. Otra opción es Amazon RDS, pero su rendimiento es malo y el precio es alto. Si desea utilizar bases de datos o simpledb, es posible que también necesite el almacenamiento en memoria caché de datos (p. Ej .: memcached).

Para aplicaciones web, si sus datos son pequeños, recomiendo mongo, si es grande, cassandra es mejor. No necesitas una capa de almacenamiento en caché con mongo o cassandra, ya son rápidos. No recomiendo SimpleDB, también te bloquea a Amazon como dijiste.

Si está utilizando C#, java o scala puede escribir una interfaz e implementarla para mongo, mysql, cassandra o cualquier otra cosa para la capa de acceso a datos. Es más simple en los lenguajes dinámicos (por ejemplo, frotar, python, php). Puede escribir un proveedor para dos de ellos si lo desea y puede cambiar el almacenamiento en tiempo de ejecución solo con un cambio de configuración, todos son posibles. El desarrollo con mongo, cassandra y simpledb es más fácil que una base de datos, y están libres de esquemas, también depende de la biblioteca/conector de cliente que esté utilizando. El más simple es mongo. Solo hay un índice por tabla en Casandra, por lo que debes administrar otros índices tú mismo, pero con la versión 0.7 de cassandra los índices secundarios serán posibles, como sé. También puede comenzar con cualquiera de ellos y reemplazarlo en el futuro si es necesario.

+2

"Pero para mayor durabilidad, necesita usar al menos 2 instancias del servidor mongodb como maestro/esclavo. De lo contrario, puede perder el último minuto de sus datos". MongoDB admite la durabilidad de un solo servidor desde 1.8 – dan

21

Creo que tiene una cuestión de tiempo y velocidad.

MongoDB/Cassandra van a ser mucho más rápidos, pero tendrá que invertir $$$ para ponerlos en marcha.Esto significa que deberá ejecutar/configurar instancias del servidor para todos ellos y descubrir cómo funcionan.

Por otro lado, no tiene que pagar por un costo "por transacción" directamente, solo paga por el hardware que probablemente sea más eficiente para servicios más grandes.

En la pelea Cassandra/MongoDB esto es lo que encontrarás (basado en las pruebas con las que estoy involucrado personalmente en los últimos días).

Cassandra:

  • Escala/La redundancia es muy básico
  • configuración puede ser muy intensa
  • Para hacer la presentación de informes es necesario mapear-Reducir, para eso se necesita para ejecutar una capa de Hadoop. Este fue un dolor para configurar y un dolor más grande para obtener rendimiento.

MongoDB:

  • configuración es relativamente fácil (incluso para el nuevo sharding, esta semana)
  • redundancia se sigue "llegar allí"
  • Mapa-reducen está incorporada y es fácil de obtener datos.

Honestamente, dado el tiempo de configuración requerido para nuestros 10s de GB de datos, fuimos con MongoDB por nuestra parte. Puedo imaginarme usando SimpleDB para casos de "debo tener estos en ejecución". Pero configurar un nodo para ejecutar MongoDB es tan ridículamente simple que puede valer la pena saltar la ruta "SimpleDB".

En términos de DAO, ya hay toneladas de bibliotecas para Mongo. El marco de ahorro para Cassandra está bien respaldado. Probablemente puedas escribir alguna lógica simple para abstraer las conexiones. Pero será más difícil abstraer las cosas más complejas que el simple CRUD.

1

Ahora, 5 años después, no es difícil configurar Mongo en ningún sistema operativo. Documentation es fácil de seguir, por lo que no veo configurar Mongo como un problema. Otras respuestas abordan las cuestiones de escalabilidad, por lo que intentaré abordar la cuestión desde el punto de vista de un desarrollador (qué limitaciones tiene cada sistema):

Usaré S para SimpleDB y M para Mongo.

  • M está escrito en C++, S está escrito en Erlang (no el lenguaje más rápido)
  • M es de código abierto, instalado en todas partes, S es propietaria, sólo puede ejecutarse en Amazon AWS. También debe pay for a whole bunch of staff para S
  • S tiene un montón de strange limitations. M limitations son mucho más razonables.Las limitaciones más extrañas son:
    • tamaño máximo de dominio (tabla) es de 10 GB
    • atributo de longitud valor (tamaño de campo) es 1024 bytes
    • artículos máximos en Select respuesta - 2500
    • respuesta máxima Seleccione el tamaño de (la cantidad máxima de S de datos que pueden regresar) - 1Mb
  • supports only a few languages S (java, PHP, Python, ruby, .NET), M supports way more
  • ambos admiten REST
  • S tiene una sintaxis de consulta muy similar a SQL (pero mucho menos poderosa). Con M tienes que aprender una nueva sintaxis que se parece a json (también es sencillo aprender los conceptos básicos)
  • con M tienes que aprender a diseñar tu base de datos. Debido a que muchas personas piensan que "sin esquemas" significa que puedes tirar cualquier basura en la base de datos y extraer esto con facilidad, se sorprenderán de que Junk in, Junk out maxim works. Supongo que lo mismo está en S, pero no puedo reclamarlo con certeza.
  • ambos no permiten la búsqueda insensible a mayúsculas y minúsculas. En M, puede usar regex de alguna manera (feo/sin índice) para superar esta limitación sin introducir la lógica adicional de campo/aplicación en minúscula.
  • en S la ordenación se puede hacer solo on one field
  • debido a 5s timelimit count in S can behave strange. Si pasaron 5 segundos y la consulta no finalizó, terminas con un número parcial y un token que te permite continuar con la consulta. La lógica de la aplicación es responsable de recopilar todos estos datos y resumirlos.
  • everything is a UTF-8 string, lo que hace que sea un fastidio trabajar con valores que no sean de cadena (como números, fechas) en el soporte de tipo S. M es way richer.
  • ambos no tienen transacciones y se une a
  • M admite compression que es realmente útil para las tiendas nosql, donde el mismo nombre de campo se almacena todo de nuevo.
  • S admite solo un índice, M has single, compound, multi-key, geospatial etc.
  • tanto la replicación apoyo y sharding

Una de las cosas más importantes que debe considerar es que SimpleDB tiene un lenguaje de consulta muy rudimentaria. Incluso cosas básicas como group by, sumaverage, distinct, así como la manipulación de datos no son compatibles, por lo que la funcionalidad no es mucho más rica que Redis/Memcached. Por otro lado, Mongo admite un lenguaje de consulta enriquecido.

Cuestiones relacionadas